diff --git a/.gitignore b/.gitignore index f5eca4efe..5fef19ddc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,13 @@ .DS_Store -APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/bin -APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/gen -APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/bin -APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/gen -APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/bin -APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/gen -APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/bin -APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/gen -APIJSON(Android)/APIJSON(ADT)/APIJSONTest/bin -APIJSON(Android)/APIJSON(ADT)/APIJSONTest/gen -APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/.idea +APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/bin +APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/gen +APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/bin +APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/gen +APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/bin +APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/gen +APIJSON-Android/APIJSON-ADT/APIJSONLibrary/bin +APIJSON-Android/APIJSON-ADT/APIJSONLibrary/gen +APIJSON-Android/APIJSON-ADT/APIJSONTest/bin +APIJSON-Android/APIJSON-ADT/APIJSONTest/gen +APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/.idea +APIJSON-JavaScript/.idea diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/DataManager.java b/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/DataManager.java deleted file mode 100755 index 06559dc1e..000000000 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/DataManager.java +++ /dev/null @@ -1,200 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.client.manager; - -import android.content.Context; -import android.content.SharedPreferences; - -import apijson.demo.client.application.APIJSONApplication; -import apijson.demo.client.model.User; -import zuo.biao.library.util.JSON; -import zuo.biao.library.util.Log; -import zuo.biao.library.util.StringUtil; - -/**数据工具类 - * @author Lemon - */ -public class DataManager { - private final String TAG = "DataManager"; - - private Context context; - private DataManager(Context context) { - this.context = context; - } - - private static DataManager instance = new DataManager(APIJSONApplication.getInstance()); - public static DataManager getInstance() { - return instance; - } - - //用户 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - private String PATH_USER = "PATH_USER"; - - public final String KEY_USER = "KEY_USER"; - public final String KEY_USER_ID = "KEY_USER_ID"; - public final String KEY_USER_NAME = "KEY_USER_NAME"; - public final String KEY_USER_PHONE = "KEY_USER_PHONE"; - - public final String KEY_CURRENT_USER_ID = "KEY_CURRENT_USER_ID"; - public final String KEY_LAST_USER_ID = "KEY_LAST_USER_ID"; - - - /**判断是否为当前用户 - * @param userId - * @return - */ - public boolean isCurrentUser(long userId) { - return userId > 0 && userId == getCurrentUserId(); - } - - /**获取当前用户id - * @return - */ - public long getCurrentUserId() { - User user = getCurrentUser(); - return user == null ? 0 : user.getId(); - } - - /**获取当前用户的手机号 - * @return - */ - public String getCurrentUserPhone() { - User user = getCurrentUser(); - return user == null ? "" : user.getPhone(); - } - /**获取当前用户 - * @return - */ - public User getCurrentUser() { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - return sdf == null ? null : getUser(sdf.getLong(KEY_CURRENT_USER_ID, 0)); - } - - - /**获取最后一次登录的用户的手机号 - * @return - */ - public String getLastUserPhone() { - User user = getLastUser(); - return user == null ? "" : user.getPhone(); - } - - /**获取最后一次登录的用户 - * @return - */ - public User getLastUser() { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - return sdf == null ? null : getUser(sdf.getLong(KEY_LAST_USER_ID, 0)); - } - - /**获取用户 - * @param userId - * @return - */ - public User getUser(long userId) { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - if (sdf == null) { - Log.e(TAG, "get sdf == null >> return;"); - return null; - } - Log.i(TAG, "getUser userId = " + userId); - return JSON.parseObject(sdf.getString(StringUtil.getTrimedString(userId), null), User.class); - } - - - /**保存当前用户,只在登录或注销时调用 - * @param user user == null >> user = new User(); - */ - public void saveCurrentUser(User user) { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - if (sdf == null) { - Log.e(TAG, "saveUser sdf == null >> return;"); - return; - } - if (user == null) { - Log.w(TAG, "saveUser user == null >> user = new User();"); - user = new User(); - } - SharedPreferences.Editor editor = sdf.edit(); - editor.remove(KEY_LAST_USER_ID).putLong(KEY_LAST_USER_ID, getCurrentUserId()); - editor.remove(KEY_CURRENT_USER_ID).putLong(KEY_CURRENT_USER_ID, user.getId()); - editor.commit(); - - saveUser(sdf, user); - } - - /**保存用户 - * @param user - */ - public void saveUser(User user) { - saveUser(context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE), user); - } - /**保存用户 - * @param sdf - * @param user - */ - public void saveUser(SharedPreferences sdf, User user) { - if (sdf == null || user == null) { - Log.e(TAG, "saveUser sdf == null || user == null >> return;"); - return; - } - String key = StringUtil.getTrimedString(user.getId()); - Log.i(TAG, "saveUser key = user.getId() = " + user.getId()); - sdf.edit().remove(key).putString(key, JSON.toJSONString(user)).commit(); - } - - /**删除用户 - * @param sdf - * @param userId - */ - public void removeUser(SharedPreferences sdf, long userId) { - if (sdf == null) { - Log.e(TAG, "removeUser sdf == null >> return;"); - return; - } - sdf.edit().remove(StringUtil.getTrimedString(userId)).commit(); - } - - /**设置当前用户手机号 - * @param phone - */ - public void setCurrentUserPhone(String phone) { - User user = getCurrentUser(); - if (user == null) { - user = new User(); - } - user.setPhone(phone); - saveUser(user); - } - - /**设置当前用户姓名 - * @param name - */ - public void setCurrentUserName(String name) { - User user = getCurrentUser(); - if (user == null) { - user = new User(); - } - user.setName(name); - saveUser(user); - } - - //用户 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - -} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Verify.java b/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Verify.java deleted file mode 100644 index 6dc5924b2..000000000 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Verify.java +++ /dev/null @@ -1,57 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.client.model; - -import zuo.biao.library.util.StringUtil; - - -/**验证码类 - * @author Lemon - */ -public class Verify extends apijson.demo.server.model.Verify { - private static final long serialVersionUID = 4298571449155754300L; - - public Verify() { - super(); - } - public Verify(long phone) { - super(phone); - } - public Verify(String verify) { - this(); - setVerify(verify); - } - - @Override - public Long getId() { - return value(super.getId()); - } - - /**服务器用id作为phone - * @return - */ - public String getPhone() { - return "" + getId(); - } - public Verify setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } - public Verify setPhone(Long phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/UserPrivacy.java b/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/UserPrivacy.java deleted file mode 100644 index a2bd27412..000000000 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/UserPrivacy.java +++ /dev/null @@ -1,83 +0,0 @@ -package apijson.demo.server.model; - -import static zuo.biao.apijson.RequestRole.ADMIN; -import static zuo.biao.apijson.RequestRole.OWNER; -import static zuo.biao.apijson.RequestRole.UNKNOWN; - -import zuo.biao.apijson.MethodAccess; - -/**会员隐私信息表 - * @author Lemon - */ -@MethodAccess( - GET = {}, - HEAD = {}, - POST_GET = {OWNER, ADMIN}, - POST_HEAD = {OWNER, ADMIN}, - POST = {UNKNOWN, ADMIN}, - DELETE = {ADMIN} - ) -public class UserPrivacy extends BaseModel { - private static final long serialVersionUID = 1L; - - private String phone; //手机 - private String password; //登录密码,隐藏字段 - private String payPassword; //支付密码,隐藏字段 - private Double balance; //余额 - - public UserPrivacy() { - super(); - } - - public UserPrivacy(long id) { - this(); - setId(id); - } - - public UserPrivacy(Long id, String password) { - this(); - setId(id); - setPassword(password); - } - - - - public String getPhone() { - return phone; - } - public UserPrivacy setPhone(String phone) { - this.phone = phone; - return this; - } - - /**get_password会转为password - * @return - */ - public String get__password() { - return password; - } - public UserPrivacy setPassword(String password) { - this.password = password; - return this; - } - - /**get_PayPassword会转为PayPassword - * @return - */ - public String get__payPassword() { - return payPassword; - } - public UserPrivacy setPayPassword(String payPassword) { - this.payPassword = payPassword; - return this; - } - - public Double getBalance() { - return balance; - } - public UserPrivacy setBalance(Double balance) { - this.balance = balance; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Wallet.java b/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Wallet.java deleted file mode 100644 index c70aa7e37..000000000 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Wallet.java +++ /dev/null @@ -1,101 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import static zuo.biao.apijson.RequestRole.ADMIN; -import static zuo.biao.apijson.RequestRole.OWNER; - -import java.math.BigDecimal; - -import zuo.biao.apijson.MethodAccess; - -/**钱包类,已用UserPrivacy替代 - * @author Lemon - * @see - *
POST_GET:
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
- *
POST:post/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
PUT:put/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id,balance+"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
DELETE:delete/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- */ -@Deprecated -@MethodAccess( - GET = {}, - HEAD = {}, - POST_GET = {OWNER, ADMIN}, - POST_HEAD = {OWNER, ADMIN}, - POST = {ADMIN}, - DELETE = {ADMIN} - ) -public class Wallet extends BaseModel { - private static final long serialVersionUID = 1L; - - public BigDecimal balance; - - /**默认构造方法,JSON等解析时必须要有 - */ - public Wallet() { - super(); - } - public Wallet(long id) { - this(); - setId(id); - } - - - public Wallet setUserId(long userId) { - setId(userId); - return this; - } - - public BigDecimal getBalance() { - return balance; - } - public Wallet setBalance(BigDecimal balance) { - this.balance = balance; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONObject.java b/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONObject.java deleted file mode 100644 index 4d3581764..000000000 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONObject.java +++ /dev/null @@ -1,453 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import static zuo.biao.apijson.StringUtil.UTF_8; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Set; - -/**use this class instead of com.alibaba.fastjson.JSONObject, not encode in default cases - * @author Lemon - */ -public class JSONObject extends com.alibaba.fastjson.JSONObject { - private static final long serialVersionUID = 1L; - - /**ordered - */ - public JSONObject() { - super(true); - } - /**transfer Object to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(Object, boolean)} - */ - public JSONObject(Object object) { - this(object, false); - } - /**transfer Object to JSONObject - * @param object - * @param encode - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(Object object, boolean encode) { - this(toJSONString(object), encode); - } - /**parse JSONObject with JSON String - * encode = false; - * @param json - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(String json) { - this(json, false); - } - /**parse JSONObject with JSON String - * @param json - * @param encode - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(String json, boolean encode) { - this(parseObject(json), encode); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object) { - this(object, false); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * @param object - * @param encode - * @see {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object, boolean encode) { - this(); - add(object, encode); - } - - - - - /**put key-value in object into this - * encode = false; - * @param object - * @return {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object) { - return add(object, false); - } - /**put key-value in object into this - * @param object - * @param encode - * @return this - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object, boolean encode) { - //TODO putAll(object); - - Set set = object == null ? null : object.keySet(); - if (set != null) { - for (String key : set) { - put(key, object.get(key), encode); - } - } - return this; - } - - - - /** - * @param key if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param decode if decode && value instanceof String, value = URLDecoder.decode((String) value, UTF_8) - * @return - */ - public Object get(Object key, boolean decode) { - if (decode) { - if (key instanceof String) { - if (((String) key).endsWith("+") || ((String) key).endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLDecoder.decode((String) key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } - } - Object value = super.get(key); - if (value instanceof String) { - try { - value = URLDecoder.decode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - return value; - } - return super.get(key); - } - - /** - * encode = false - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - public Object put(Object value) { - return put(value, false); - } - /** - * key = value.getClass().getSimpleName() - * @param value must be annotated by {@link APIJSONRequest} - * @param encode - * @return {@link #put(String, Object, boolean)} - */ - public Object put(Object value, boolean encode) { - return put(null, value, encode); - } - /** - * @param key if StringUtil.isNotEmpty(key, true) == false, - *
key = value == null ? null : value.getClass().getSimpleName(); - *
>> if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param value URLEncoder.encode((String) value, UTF_8); - * @param encode if value instanceof String, value = URLEncoder.encode((String) value, UTF_8); - * @return - */ - public Object put(String key, Object value, boolean encode) { - if (StringUtil.isNotEmpty(key, true) == false) { - Class clazz = value == null ? null : value.getClass(); - if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { - throw new IllegalArgumentException("put StringUtil.isNotEmpty(key, true) == false" + - " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + - " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + - " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + - " \n 如果是类似 key[]:{} 结构的请求,建议add(...)方法!"); - } - key = value.getClass().getSimpleName(); - } - if (encode) { - if (key.endsWith("+") || key.endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLEncoder.encode(key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - if (value instanceof String) {//只在value instanceof String时encode key?{@link #get(Object, boolean)}内做不到 - try { - value = URLEncoder.encode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - } - return super.put(key, value); - } - - - - //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final String KEY_ARRAY = "[]"; - - /**判断是否为Array的key - * @param key - * @return - */ - public static boolean isArrayKey(String key) { - return key != null && key.endsWith(KEY_ARRAY); - } - /**判断是否为对应Table的key - * @param key - * @return - */ - public static boolean isTableKey(String key) { - return StringUtil.isBigWord(key); - } - //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< - /** - * 角色,拥有对某些数据的某些操作的权限 - */ - public static final String KEY_ROLE = "@role"; - /** - * 数据库,Table在非默认schema内时需要声明 - */ - public static final String KEY_SCHEMA = "@schema"; - /** - * 查询的Table字段或SQL函数 - */ - public static final String KEY_COLUMN = "@column"; - /** - * 分组方式 - */ - public static final String KEY_GROUP = "@group"; - /** - * 聚合函数条件,一般和@group一起用 - */ - public static final String KEY_HAVING = "@having"; - /** - * 排序方式 - */ - public static final String KEY_ORDER = "@order"; - //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> - - - /**set role of request sender - * @param role - * @return this - */ - public JSONObject setRole(String role) { - put(KEY_ROLE, role); - return this; - } - - /**set schema where table was put - * @param schema - * @return this - */ - public JSONObject setSchema(String schema) { - put(KEY_SCHEMA, schema); - return this; - } - - /**set keys need to be returned - * @param keys key0, key1, key2 ... - * @return {@link #setColumn(String)} - */ - public JSONObject setColumn(String... keys) { - return setColumn(StringUtil.getString(keys, true)); - } - /**set keys need to be returned - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setColumn(String keys) { - put(KEY_COLUMN, keys); - return this; - } - - /**set keys for group by - * @param keys key0, key1, key2 ... - * @return {@link #setGroup(String)} - */ - public JSONObject setGroup(String... keys) { - return setGroup(StringUtil.getString(keys, true)); - } - /**set keys for group by - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setGroup(String keys) { - put(KEY_GROUP, keys); - return this; - } - - /**set keys for having - * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... - * @return {@link #setHaving(String)} - */ - public JSONObject setHaving(String... keys) { - return setHaving(StringUtil.getString(keys, true)); - } - /**set keys for having - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setHaving(String keys) { - put(KEY_HAVING, keys); - return this; - } - - /**set keys for order by - * @param keys key0, key1+, key2- ... - * @return {@link #setOrder(String)} - */ - public JSONObject setOrder(String... keys) { - return setOrder(StringUtil.getString(keys, true)); - } - /**set keys for order by - * @param keys "key0,key1+,key2-..." - * @return - */ - public JSONObject setOrder(String keys) { - put(KEY_ORDER, keys); - return this; - } - - - //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //Request,默认encode <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - - /** - * encode = true - * @param value - * @param parts path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... - * @return #put(key+"@", StringUtil.getString(keys, "/"), true) - */ - public Object putPath(String key, String... keys) { - return put(key+"@", StringUtil.getString(keys, "/"), true); - } - - /** - * encode = true - * @param key - * @param isNull - * @return {@link #putNull(String, boolean, boolean)} - */ - public JSONObject putNull(String key, boolean isNull) { - return putNull(key, isNull, true); - } - /** - * @param key - * @param isNull - * @param encode - * @return put(key+"{}", SQL.isNull(isNull), encode); - */ - public JSONObject putNull(String key, boolean isNull, boolean encode) { - put(key+"{}", SQL.isNull(isNull), encode); - return this; - } - /** - * trim = false - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty) { - return putEmpty(key, isEmpty, false); - } - /** - * encode = true - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim) { - return putEmpty(key, isEmpty, trim, true); - } - /** - * @param key - * @param isEmpty - * @param encode - * @return put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim, boolean encode) { - put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - return this; - } - /** - * encode = true - * @param key - * @param compare <=0, >5 ... - * @return {@link #putLength(String, String, boolean)} - */ - public JSONObject putLength(String key, String compare) { - return putLength(key, compare, true); - } - /** - * @param key - * @param compare <=0, >5 ... - * @param encode - * @return put(key+"{}", SQL.length(key) + compare, encode); - */ - public JSONObject putLength(String key, String compare, boolean encode) { - put(key+"{}", SQL.length(key) + compare, encode); - return this; - } - - /**设置搜索 - * type = SEARCH_TYPE_CONTAIN_FULL - * @param key - * @param value - * @return {@link #putSearch(String, String, int)} - */ - public JSONObject putSearch(String key, String value) { - return putSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); - } - /**设置搜索 - * encode = true - * @param key - * @param value - * @param type - * @return {@link #putSearch(String, String, int, boolean)} - */ - public JSONObject putSearch(String key, String value, int type) { - return putSearch(key, value, type, true); - } - /**设置搜索 - * @param key - * @param value - * @param type - * @param encode - * @return put(key+"$", SQL.search(value, type), encode); - */ - public JSONObject putSearch(String key, String value, int type, boolean encode) { - put(key+"$", SQL.search(value, type), encode); - return this; - } - - //Request,默认encode >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONResponse.java b/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONResponse.java deleted file mode 100644 index 1135a3f9e..000000000 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONResponse.java +++ /dev/null @@ -1,500 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.util.List; -import java.util.Set; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -/**parser for response JSON String - * @author Lemon - * @see #getList - * @see #toArray - * @use JSONResponse response = new JSONResponse(json); - *
JSONArray array = JSONResponse.toArray(response.getJSONObject("[]"));//not a must - *
User user = JSONResponse.getObject(response, User.class);//not a must - *
List list = JSONResponse.getList(response.getJSONObject("Comment[]"), Comment.class);//not a must - */ -public class JSONResponse extends zuo.biao.apijson.JSONObject { - private static final long serialVersionUID = 1L; - - private static final String TAG = "JSONResponse"; - - public JSONResponse() { - super(); - } - public JSONResponse(String json) { - this(parseObject(json)); - } - public JSONResponse(JSONObject object) { - super(format(object)); - } - - //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final int CODE_SUCCEED = 200; - public static final int CODE_PARTIAL_SUCCEED = 206; - public static final int CODE_UNSUPPORTED_ENCODING = 400; - public static final int CODE_ILLEGAL_ACCESS = 401; - public static final int CODE_UNSUPPORTED_OPERATION = 403; - public static final int CODE_NOT_FOUND = 404; - public static final int CODE_ILLEGAL_ARGUMENT = 406; - public static final int CODE_NOT_LOGGED_IN = 407; - public static final int CODE_TIME_OUT = 408; - public static final int CODE_CONFLICT = 409; - public static final int CODE_CONDITION_ERROR = 412; - public static final int CODE_UNSUPPORTED_TYPE = 415; - public static final int CODE_OUT_OF_RANGE = 416; - public static final int CODE_NULL_POINTER = 417; - public static final int CODE_SERVER_ERROR = 500; - - - public static final String KEY_CODE = "code"; - public static final String KEY_MSG = "msg"; - public static final String KEY_ID = "id"; - public static final String KEY_COUNT = "count"; - public static final String KEY_TOTAL = "total"; - - /**获取状态 - * @return - */ - public int getCode() { - try { - return getIntValue(KEY_CODE); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取信息 - * @return - */ - public String getMsg() { - return getString(KEY_MSG); - } - /**获取id - * @return - */ - public long getId() { - try { - return getLongValue(KEY_ID); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取数量 - * @return - */ - public int getCount() { - try { - return getIntValue(KEY_COUNT); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取总数 - * @return - */ - public int getTotal() { - try { - return getIntValue(KEY_TOTAL); - } catch (Exception e) { - //empty - } - return 0; - } - - - /**是否成功 - * @return - */ - public boolean isSucceed() { - return isSucceed(getCode()); - } - /**是否成功 - * @param code - * @return - */ - public static boolean isSucceed(int code) { - return code == CODE_SUCCEED; - } - /**是否成功 - * @param response - * @return - */ - public static boolean isSucceed(JSONResponse response) { - return response != null && response.isSucceed(); - } - - /**校验服务端是否存在table - * @return - */ - public boolean isExist() { - return isExist(getCount()); - } - /**校验服务端是否存在table - * @param count - * @return - */ - public static boolean isExist(int count) { - return count > 0; - } - /**校验服务端是否存在table - * @param response - * @return - */ - public static boolean isExist(JSONResponse response) { - return response != null && response.isExist(); - } - - /**获取内部的JSONResponse - * @param key - * @return - */ - public JSONResponse getJSONResponse(String key) { - return getObject(key, JSONResponse.class); - } - //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - - - /** - * key = clazz.getSimpleName() - * @param clazz - * @return - */ - public T getObject(Class clazz) { - return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); - } - /** - * @param key - * @param clazz - * @return - */ - public T getObject(String key, Class clazz) { - return getObject(this, key, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static T getObject(JSONObject object, String key, Class clazz) { - return toObject(object == null ? null : object.getJSONObject(key), clazz); - } - - /** - * @param clazz - * @return - */ - public T toObject(Class clazz) { - return toObject(this, clazz); - } - /** - * @param object - * @param clazz - * @return - */ - public static T toObject(JSONObject object, Class clazz) { - return JSON.parseObject(JSON.toJSONString(object), clazz); - } - - - - - /** - * key = KEY_ARRAY - * @param clazz - * @return - */ - public List getList(Class clazz) { - return getList(KEY_ARRAY, clazz); - } - /** - * arrayObject = this - * @param key - * @param clazz - * @return - */ - public List getList(String key, Class clazz) { - return getList(this, key, clazz); - } - - /** - * key = KEY_ARRAY - * @param object - * @param clazz - * @return - */ - public static List getList(JSONObject object, Class clazz) { - return getList(object, KEY_ARRAY, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static List getList(JSONObject object, String key, Class clazz) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? JSON.parseArray((JSONArray) obj, clazz) : toList((JSONObject) obj, clazz); - } - /** - * @param clazz - * @return - */ - public List toList(Class clazz) { - return toList(this, clazz); - } - /** - * @param arrayObject - * @param clazz - * @return - */ - public static List toList(JSONObject arrayObject, Class clazz) { - return clazz == null ? null : JSON.parseArray(JSON.toJSONString( - toArray(arrayObject, clazz.getSimpleName())), clazz); - } - - /** - * key = KEY_ARRAY - * @param className - * @return - */ - public JSONArray getArray(String className) { - return getArray(KEY_ARRAY, className); - } - /** - * @param key - * @param className - * @return - */ - public JSONArray getArray(String key, String className) { - return getArray(this, key, className); - } - /** - * @param object - * @param key - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String className) { - return getArray(object, KEY_ARRAY, className); - } - /** - * key = KEY_ARRAY - * @param object - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String key, String className) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? (JSONArray) obj : toArray((JSONObject) obj, className); - } - - /** - * @param className - * @return - */ - public JSONArray toArray(String className) { - return toArray(this, className); - } - /**{0:{Table:{}}, 1:{Table:{}}...} 转化为 [{Table:{}}, {Table:{}}] - * array.set(index, isContainer ? value : value.getJSONObject(className)); - * @param arrayObject - * @param className className.equals(Table) ? {Table:{Content}} => {Content} - * @return - */ - public static JSONArray toArray(JSONObject arrayObject, String className) { - Set set = arrayObject == null ? null : arrayObject.keySet(); - if (set == null || set.isEmpty()) { - return null; - } - - // [{...},{...},...] - String parentString = StringUtil.getTrimedString(JSON.toJSONString(arrayObject)); - if (parentString.isEmpty()) { - return null; - } - if (parentString.startsWith("[")) { - if (parentString.endsWith("]") == false) { - parentString += "]"; - } - return JSON.parseArray(parentString); - } - - //{"0":{Table:{...}}, "1":{Table:{...}}...} - - className = StringUtil.getTrimedString(className); - boolean isContainer = true; - - JSONArray array = new JSONArray(set.size()); - JSONObject value; - boolean isFirst = true; - int index; - for (String key : set) {//0, 1, 2,... - value = StringUtil.isNumer(key) == false ? null : arrayObject.getJSONObject(key);// Table:{} - if (value != null) { - try { - index = Integer.valueOf(0 + key); - if (isFirst && isTableKey(className) && value.containsKey(className)) {// 判断是否需要提取table - isContainer = false; - } - array.set(index, isContainer ? value : value.getJSONObject(className)); - } catch (Exception e) { - e.printStackTrace(); - } - } - isFirst = false; - } - return array; - } - - - - // /** - // * @return - // */ - // public JSONObject format() { - // return format(this); - // } - /**将Item[]:[{Table:{}}, {Table:{}}...] 或 Item[]:{0:{Table:{}}, 1:{Table:{}}...} - * 转化为 itemList:[{Table:{}}, {Table:{}}],如果 Item.equals(Table),则将 {Table:{Content}} 转化为 {Content} - * @param target - * @param response - * @return - */ - public static JSONObject format(final JSONObject response) { - //太长查看不方便,不如debug Log.i(TAG, "format response = \n" + JSON.toJSONString(response)); - if (response == null || response.isEmpty()) { - Log.i(TAG, "format response == null || response.isEmpty() >> return response;"); - return response; - } - JSONObject transferredObject = new JSONObject(true); - - Set set = response.keySet(); - if (set != null) { - - Object value; - String arrayKey; - for (String key : set) { - value = response.get(key); - - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredObject.put(replaceArray(key), format(key, (JSONArray) value)); - } else if (value instanceof JSONObject) {//APIJSON Array转为常规JSONArray - if (isArrayKey(key)) {//APIJSON Array转为常规JSONArray - arrayKey = key.substring(0, key.lastIndexOf(KEY_ARRAY)); - transferredObject.put(getArrayKey(getSimpleName(arrayKey)) - , format(key, toArray((JSONObject) value, arrayKey)));//需要将name:alias传至toArray - } else {//常规JSONObject,往下一级提取 - transferredObject.put(getSimpleName(key), format((JSONObject) value)); - } - } else {//其它Object,直接填充 - transferredObject.put(getSimpleName(key), value); - } - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredObject = " + JSON.toJSONString(transferredObject)); - return transferredObject; - } - - /** - * @param responseArray - * @return - */ - public static JSONArray format(String name, final JSONArray responseArray) { - //太长查看不方便,不如debug Log.i(TAG, "format responseArray = \n" + JSON.toJSONString(responseArray)); - if (responseArray == null || responseArray.isEmpty()) { - Log.i(TAG, "format responseArray == null || responseArray.isEmpty() >> return response;"); - return responseArray; - } - int index = name == null ? -1 : name.lastIndexOf(KEY_ARRAY); - String className = index < 0 ? "" : name.substring(0, index); - - JSONArray transferredArray = new JSONArray(); - - Object value; - boolean isContainer = true; - boolean isFirst = true; - for (int i = 0; i < responseArray.size(); i++) { - value = responseArray.get(i); - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredArray.add(format(null, (JSONArray) value)); - } else if (value instanceof JSONObject) {//JSONObject,往下一级提取 - //判断是否需要提取child - if (isFirst && isTableKey(className) && ((JSONObject) value).containsKey(className)) { - isContainer = false; - } - //直接添加child 或 添加提取出的child - transferredArray.add(format(isContainer ? (JSONObject)value : ((JSONObject)value).getJSONObject(className) )); - isFirst = false; - } else {//其它Object,直接填充 - transferredArray.add(responseArray.get(i)); - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredArray = " + JSON.toJSONString(transferredArray)); - return transferredArray; - } - - /**替换key+KEY_ARRAY为keyList - * @param key - * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} - */ - public static String replaceArray(String key) { - if (isArrayKey(key)) { - key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); - } - return getSimpleName(key); - } - /**获取列表变量名 - * @param key => StringUtil.getNoBlankString(key) - * @return empty ? "list" : key + "List" 且首字母小写 - */ - public static String getArrayKey(String key) { - return StringUtil.addSuffix(key, "list"); - } - - /**获取简单名称 - * @param fullName name 或 name:alias - * @return name > name; name:alias > alias - */ - public static String getSimpleName(String fullName) { - //key:alias -> alias; key:alias[] -> alias[] - int index = fullName == null ? -1 : fullName.indexOf(":"); - if (index >= 0) { - fullName = fullName.substring(index + 1); - } - return fullName; - } - - -} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/Wallet.java b/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/Wallet.java deleted file mode 100644 index ba2459c47..000000000 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/Wallet.java +++ /dev/null @@ -1,101 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.model; - -import static zuo.biao.apijson.RequestRole.ADMIN; -import static zuo.biao.apijson.RequestRole.OWNER; - -import java.math.BigDecimal; - -import zuo.biao.apijson.MethodAccess; - -/**钱包类,已用UserPrivacy替代 - * @author Lemon - * @see - *
POST_GET:
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
- *
POST:post/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
PUT:put/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id,balance+"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
DELETE:delete/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- */ -@Deprecated -@MethodAccess( - GET = {}, - HEAD = {}, - POST_GET = {OWNER, ADMIN}, - POST_HEAD = {OWNER, ADMIN}, - POST = {ADMIN}, - DELETE = {ADMIN} - ) -public class Wallet extends BaseModel { - private static final long serialVersionUID = 1L; - - public BigDecimal balance; - - /**默认构造方法,JSON等解析时必须要有 - */ - public Wallet() { - super(); - } - public Wallet(long id) { - this(); - setId(id); - } - - - public Wallet setUserId(long userId) { - setId(userId); - return this; - } - - public BigDecimal getBalance() { - return balance; - } - public Wallet setBalance(BigDecimal balance) { - this.balance = balance; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/BaseModel.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/BaseModel.java deleted file mode 100644 index fd6eb9c21..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/BaseModel.java +++ /dev/null @@ -1,196 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Map; - -/**base model for reduce model codes - * @author Lemon - * @use extends BaseModel - */ -@SuppressWarnings("serial") -public abstract class BaseModel implements Serializable { - - private Long id; - private Long date; - - public Long getId() { - return id; - } - public BaseModel setId(Long id) { - this.id = id; - return this; - } - public Long getDate() { - return date; - } - public BaseModel setDate(Long date) { - this.date = date; - return this; - } - - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否为空 - * @param collection - * @return - */ - public static boolean isEmpty(Collection collection) { - return collection == null || collection.isEmpty(); - } - /**判断map是否为空 - * @param - * @param - * @param map - * @return - */ - public static boolean isEmpty(Map map) { - return map == null || map.isEmpty(); - } - //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //判断是否包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否包含object - * @param collection - * @param object - * @return - */ - public static boolean isContain(Collection collection, T object) { - return collection != null && collection.contains(object); - } - /**判断map是否包含key - * @param - * @param - * @param map - * @param key - * @return - */ - public static boolean isContainKey(Map map, K key) { - return map != null && map.containsKey(key); - } - /**判断map是否包含value - * @param - * @param - * @param map - * @param value - * @return - */ - public static boolean isContainValue(Map map, V value) { - return map != null && map.containsValue(value); - } - //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取数量 - * @param - * @param array - * @return - */ - public static int count(T[] array) { - return array == null ? 0 : array.length; - } - /**获取数量 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - public static int count(Collection collection) { - return collection == null ? 0 : collection.size(); - } - /**获取数量 - * @param - * @param - * @param map - * @return - */ - public static int count(Map map) { - return map == null ? 0 : map.size(); - } - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取 - * @param - * @param array - * @return - */ - public static T get(T[] array, int position) { - return position < 0 || position >= count(array) ? null : array[position]; - } - /**获取 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - @SuppressWarnings("unchecked") - public static T get(Collection collection, int position) { - return (T) (collection == null ? null : get(collection.toArray(), position)); - } - /**获取 - * @param - * @param - * @param map null ? null - * @param key null ? null : map.get(key); - * @return - */ - public static V get(Map map, K key) { - return key == null || map == null ? null : map.get(key); - } - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取非空值 - * @param value - * @return - */ - public static boolean value(Boolean value) { - return value == null ? false : value; - } - /**获取非空值 - * @param value - * @return - */ - public static int value(Integer value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static long value(Long value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static float value(Float value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static double value(Double value) { - return value == null ? 0 : value; - } - //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/FunctionList.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/FunctionList.java deleted file mode 100644 index 6dc2d3407..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/FunctionList.java +++ /dev/null @@ -1,142 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.util.Collection; -import java.util.Map; - -/**可远程调用的函数列表 - * @author Lemon - */ -public interface FunctionList { - - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否为空 - * @param collection - * @return - */ - public boolean isEmpty(Collection collection); - /**判断map是否为空 - * @param - * @param - * @param map - * @return - */ - public boolean isEmpty(Map map); - //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //判断是否为包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否包含object - * @param collection - * @param object - * @return - */ - public boolean isContain(Collection collection, T object); - /**判断map是否包含key - * @param - * @param - * @param map - * @param key - * @return - */ - public boolean isContainKey(Map map, K key); - /**判断map是否包含value - * @param - * @param - * @param map - * @param value - * @return - */ - public boolean isContainValue(Map map, V value); - //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取数量 - * @param - * @param array - * @return - */ - public int count(T[] array); - /**获取数量 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - public int count(Collection collection); - /**获取数量 - * @param - * @param - * @param map - * @return - */ - public int count(Map map); - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取 - * @param - * @param array - * @return - */ - public T get(T[] array, int position); - /**获取 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - public T get(Collection collection, int position); - /**获取 - * @param - * @param - * @param map null ? null - * @param key null ? null : map.get(key); - * @return - */ - public V get(Map map, K key); - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取非空值 - * @param value - * @return - */ - public boolean value(Boolean value); - /**获取非空值 - * @param value - * @return - */ - public int value(Integer value); - /**获取非空值 - * @param value - * @return - */ - public long value(Long value); - /**获取非空值 - * @param value - * @return - */ - public float value(Float value); - /**获取非空值 - * @param value - * @return - */ - public double value(Double value); - //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java deleted file mode 100644 index e1fdb9060..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java +++ /dev/null @@ -1,434 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import static zuo.biao.apijson.StringUtil.UTF_8; -import static zuo.biao.apijson.StringUtil.bigAlphaPattern; -import static zuo.biao.apijson.StringUtil.namePattern; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Set; - - -/**use this class instead of com.alibaba.fastjson.JSONObject, not encode in default cases - * @author Lemon - */ -public class JSONObject extends com.alibaba.fastjson.JSONObject { - private static final long serialVersionUID = 8907029699680768212L; - - /**ordered - */ - public JSONObject() { - super(true); - } - /**transfer Object to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(Object, boolean)} - */ - public JSONObject(Object object) { - this(object, false); - } - /**transfer Object to JSONObject - * @param object - * @param encode - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(Object object, boolean encode) { - this(toJSONString(object), encode); - } - /**parse JSONObject with JSON String - * encode = false; - * @param json - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(String json) { - this(json, false); - } - /**parse JSONObject with JSON String - * @param json - * @param encode - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(String json, boolean encode) { - this(parseObject(json), encode); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object) { - this(object, false); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * @param object - * @param encode - * @see {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object, boolean encode) { - this(); - add(object, encode); - } - - - - - /**put key-value in object into this - * encode = false; - * @param object - * @return {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object) { - return add(object, false); - } - /**put key-value in object into this - * @param object - * @param encode - * @return this - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object, boolean encode) { - //TODO putAll(object); - - Set set = object == null ? null : object.keySet(); - if (set != null) { - for (String key : set) { - put(key, object.get(key), encode); - } - } - return this; - } - - - - /** - * @param key if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param decode if decode && value instanceof String, value = URLDecoder.decode((String) value, UTF_8) - * @return - */ - public Object get(Object key, boolean decode) { - if (decode) { - if (key instanceof String) { - if (((String) key).endsWith("+") || ((String) key).endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLDecoder.decode((String) key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } - } - Object value = super.get(key); - if (value instanceof String) { - try { - value = URLDecoder.decode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - return value; - } - return super.get(key); - } - - /** - * encode = false - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - public Object put(Object value) { - return put(value, false); - } - /** - * key = value.getClass().getSimpleName() - * @param value must be annotated by {@link APIJSONRequest} - * @param encode - * @return {@link #put(String, Object, boolean)} - */ - public Object put(Object value, boolean encode) { - return put(null, value, encode); - } - /** - * @param key if StringUtil.isNotEmpty(key, true) == false, - *
key = value == null ? null : value.getClass().getSimpleName(); - *
>> if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param value URLEncoder.encode((String) value, UTF_8); - * @param encode if value instanceof String, value = URLEncoder.encode((String) value, UTF_8); - * @return - */ - public Object put(String key, Object value, boolean encode) { - if (StringUtil.isNotEmpty(key, true) == false) { - Class clazz = value == null ? null : value.getClass(); - if (clazz == null || clazz.getAnnotation(APIJSONRequest.class) == null) { - throw new IllegalArgumentException("put StringUtil.isNotEmpty(key, true) == false" + - " && clazz == null || clazz.getAnnotation(APIJSONRequest.class) == null" + - " \n key为空时仅支持 类型被@APIJSONRequest注解 的value !!!" + - " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + - " \n 如果是类似 key[]:{} 结构的请求,建议add(...)方法!"); - } - key = value.getClass().getSimpleName(); - } - if (encode) { - if (key.endsWith("+") || key.endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLEncoder.encode(key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - if (value instanceof String) {//只在value instanceof String时encode key?{@link #get(Object, boolean)}内做不到 - try { - value = URLEncoder.encode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - } - return super.put(key, value); - } - - - - //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final String KEY_ARRAY = "[]"; - - /**判断是否为Array的key - * @param key - * @return - */ - public static boolean isArrayKey(String key) { - return key != null && key.endsWith(KEY_ARRAY); - } - /**判断是否为对应Table的key - * @param key - * @return - */ - public static boolean isTableKey(String key) { - return isWord(key) && bigAlphaPattern.matcher(key.substring(0, 1)).matches(); - } - /**判断是否为词,只能包含字母,数字或下划线 - * @param key - * @return - */ - public static boolean isWord(String key) { - return StringUtil.isNotEmpty(key, false) && namePattern.matcher(key).matches(); - } - //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final String KEY_COLUMN = "@column";//@key关键字都放这个类 - public static final String KEY_GROUP = "@group";//@key关键字都放这个类 - public static final String KEY_HAVING = "@having";//@key关键字都放这个类 - public static final String KEY_ORDER = "@order";//@key关键字都放这个类 - - /**set keys need to be returned - * @param keys key0, key1, key2 ... - * @return {@link #setColumn(String)} - */ - public JSONObject setColumn(String... keys) { - return setColumn(StringUtil.getString(keys, true)); - } - /**set keys need to be returned - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setColumn(String keys) { - put(KEY_COLUMN, keys); - return this; - } - public String getColumn() { - return getString(KEY_COLUMN); - } - - /**set keys for group by - * @param keys key0, key1, key2 ... - * @return {@link #setGroup(String)} - */ - public JSONObject setGroup(String... keys) { - return setGroup(StringUtil.getString(keys, true)); - } - /**set keys for group by - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setGroup(String keys) { - put(KEY_GROUP, keys); - return this; - } - public String getGroup() { - return getString(KEY_GROUP); - } - - /**set keys for having - * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... - * @return {@link #setHaving(String)} - */ - public JSONObject setHaving(String... keys) { - return setHaving(StringUtil.getString(keys, true)); - } - /**set keys for having - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setHaving(String keys) { - put(KEY_HAVING, keys); - return this; - } - public String getHaving() { - return getString(KEY_HAVING); - } - - /**set keys for order by - * @param keys key0, key1+, key2- ... - * @return {@link #setOrder(String)} - */ - public JSONObject setOrder(String... keys) { - return setOrder(StringUtil.getString(keys, true)); - } - /**set keys for order by - * @param keys "key0,key1+,key2-..." - * @return - */ - public JSONObject setOrder(String keys) { - put(KEY_ORDER, keys); - return this; - } - public String getOrder() { - return getString(KEY_ORDER); - } - - - //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //Request,默认encode <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - - /** - * encode = true - * @param value - * @param parts path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... - * @return #put(key+"@", StringUtil.getString(keys, "/"), true) - */ - public Object putPath(String key, String... keys) { - return put(key+"@", StringUtil.getString(keys, "/"), true); - } - - /** - * encode = true - * @param key - * @param isNull - * @return {@link #putNull(String, boolean, boolean)} - */ - public JSONObject putNull(String key, boolean isNull) { - return putNull(key, isNull, true); - } - /** - * @param key - * @param isNull - * @param encode - * @return put(key+"{}", SQL.isNull(isNull), encode); - */ - public JSONObject putNull(String key, boolean isNull, boolean encode) { - put(key+"{}", SQL.isNull(isNull), encode); - return this; - } - /** - * trim = false - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty) { - return putEmpty(key, isEmpty, false); - } - /** - * encode = true - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim) { - return putEmpty(key, isEmpty, trim, true); - } - /** - * @param key - * @param isEmpty - * @param encode - * @return put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim, boolean encode) { - put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - return this; - } - /** - * encode = true - * @param key - * @param compare <=0, >5 ... - * @return {@link #putLength(String, String, boolean)} - */ - public JSONObject putLength(String key, String compare) { - return putLength(key, compare, true); - } - /** - * @param key - * @param compare <=0, >5 ... - * @param encode - * @return put(key+"{}", SQL.length(key) + compare, encode); - */ - public JSONObject putLength(String key, String compare, boolean encode) { - put(key+"{}", SQL.length(key) + compare, encode); - return this; - } - - /**设置搜索 - * type = SEARCH_TYPE_CONTAIN_FULL - * @param key - * @param value - * @return {@link #putSearch(String, String, int)} - */ - public JSONObject putSearch(String key, String value) { - return putSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); - } - /**设置搜索 - * encode = true - * @param key - * @param value - * @param type - * @return {@link #putSearch(String, String, int, boolean)} - */ - public JSONObject putSearch(String key, String value, int type) { - return putSearch(key, value, type, true); - } - /**设置搜索 - * @param key - * @param value - * @param type - * @param encode - * @return put(key+"$", SQL.search(value, type), encode); - */ - public JSONObject putSearch(String key, String value, int type, boolean encode) { - put(key+"$", SQL.search(value, type), encode); - return this; - } - - //Request,默认encode >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java deleted file mode 100644 index 6bd3bce73..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java +++ /dev/null @@ -1,204 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -/**encapsulator for request JSONObject, encode in default cases - * @author Lemon - * @see #toArray - * @use JSONRequest request = new JSONRequest(...); - *
request.put(...);//not a must - *
request.toArray(...);//not a must - */ -public class JSONRequest extends JSONObject { - - private static final long serialVersionUID = -2223023180338466812L; - - public JSONRequest() { - super(); - } - /** - * encode = true - * @param object must be annotated by {@link APIJSONRequest} - * @see {@link #JSONRequest(String, Object)} - */ - public JSONRequest(Object object) { - this(null, object); - } - /** - * encode = true - * @param name - * @param object - * @see {@link #JSONRequest(String, Object, boolean)} - */ - public JSONRequest(String name, Object object) { - this(name, object, true); - } - /** - * @param object must be annotated by {@link APIJSONRequest} - * @param encode - * @see {@link #JSONRequest(String, Object, boolean)} - */ - public JSONRequest(Object object, boolean encode) { - this(null, object, encode); - } - /** - * @param name - * @param object - * @param encode - * @see {@link #put(String, Object, boolean)} - */ - public JSONRequest(String name, Object object, boolean encode) { - this(); - put(name, object, encode); - } - - - - - - - public static final String KEY_TAG = "tag";//只在最外层,最外层用JSONRequest - - public JSONObject setTag(String tag) { - put(KEY_TAG, tag); - return this; - } - public String getTag() { - return getString(KEY_TAG); - } - - - //array object <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final int QUERY_TABLE = 0; - public static final int QUERY_TOTAL = 1; - public static final int QUERY_ALL = 2; - - public static final String KEY_QUERY = "query"; - public static final String KEY_COUNT = "count"; - public static final String KEY_PAGE = "page"; - - /** - * @param query what need to query, Table,total,ALL? - * @return - */ - public JSONRequest setQuery(int query) { - put(KEY_QUERY, query); - return this; - } - public int getQuery() { - return getIntValue(KEY_QUERY); - } - - /** - * @param count - * @return - */ - public JSONRequest setCount(int count) { - put(KEY_COUNT, count); - return this; - } - public int getCount() { - return getIntValue(KEY_COUNT); - } - - /** - * @param page - * @return - */ - public JSONRequest setPage(int page) { - put(KEY_PAGE, page); - return this; - } - public int getPage() { - return getIntValue(KEY_PAGE); - } - //array object >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - // 导致JSONObject add >> get = null - // /** - // * decode = true - // * @param key - // * return {@link #get(Object, boolean)} - // */ - // @Override - // public Object get(Object key) { - // return get(key, true); - // } - - /** - * encode = true - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - @Override - public Object put(Object value) { - return put(value, true); - } - /** - * encode = true - * @param key - * @param value - * return {@link #put(String, Object, boolean)} - */ - @Override - public Object put(String key, Object value) { - return put(key, value, true); - } - - - /**create a parent JSONObject named KEY_ARRAY - * encode = true; - * @param count - * @param page - * @return {@link #toArray(int, int, boolean)} - */ - public JSONRequest toArray(int count, int page) { - return toArray(count, page, true); - } - /**create a parent JSONObject named KEY_ARRAY - * encode = true; - * @param count - * @param page - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, boolean encode) { - return toArray(count, page, null, encode); - } - /**create a parent JSONObject named name+KEY_ARRAY - * encode = true; - * @param count - * @param page - * @param name - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, String name) { - return toArray(count, page, name, true); - } - /**create a parent JSONObject named name+KEY_ARRAY. - * @param count - * @param page - * @param name - * @param encode - * @return {name+KEY_ARRAY : this}. if needs to be put, use {@link #add(com.alibaba.fastjson.JSONObject)} instead - */ - public JSONRequest toArray(int count, int page, String name, boolean encode) { - return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page), encode); - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java deleted file mode 100644 index 40379e2f9..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java +++ /dev/null @@ -1,480 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import static zuo.biao.apijson.StringUtil.bigAlphaPattern; - -import java.util.List; -import java.util.Set; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -/**parser for response JSON String - * @author Lemon - * @see #getList - * @see #toArray - * @use JSONResponse response = new JSONResponse(...); - *
JSONArray array = JSONResponse.toArray(response.getJSONObject(KEY_ARRAY));//not a must - *
User user = JSONResponse.getObject(response, User.class);//not a must - *
List list = JSONResponse.getList(response.getJSONObject("Comment[]"), Comment.class);//not a must - */ -@SuppressWarnings("serial") -public class JSONResponse extends zuo.biao.apijson.JSONObject { - private static final String TAG = "JSONResponse"; - - public JSONResponse() { - super(); - } - public JSONResponse(String json) { - this(parseObject(json)); - } - public JSONResponse(JSONObject object) { - super(format(object)); - } - - //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final int STATUS_SUCCEED = 200; - - - public static final String KEY_ID = "id"; - public static final String KEY_STATUS = "status"; - public static final String KEY_COUNT = "count"; - public static final String KEY_TOTAL = "total"; - public static final String KEY_MESSAGE = "message"; - - /**获取id - * @return - */ - public long getId() { - return getLongValue(KEY_ID); - } - /**获取状态 - * @return - */ - public int getStatus() { - return getIntValue(KEY_STATUS); - } - /**获取数量 - * @return - */ - public int getCount() { - return getIntValue(KEY_COUNT); - } - /**获取数量 - * @return - */ - public int getTotal() { - try { - return getIntValue(KEY_TOTAL); - } catch (Exception e) { - // TODO: handle exception - } - return 0; - } - /**获取信息 - * @return - */ - public String getMessage() { - return getString(KEY_MESSAGE); - } - - /**是否成功 - * @return - */ - public boolean isSucceed() { - return isSucceed(getStatus()); - } - /**是否成功 - * @param status - * @return - */ - public static boolean isSucceed(int status) { - return status == STATUS_SUCCEED; - } - /**是否成功 - * @param response - * @return - */ - public static boolean isSucceed(JSONResponse response) { - return response != null && response.isSucceed(); - } - - /**校验服务端是否存在table - * @return - */ - public boolean isExist() { - return isExist(getCount()); - } - /**校验服务端是否存在table - * @param count - * @return - */ - public static boolean isExist(int count) { - return count > 0; - } - /**校验服务端是否存在table - * @param response - * @return - */ - public static boolean isExist(JSONResponse response) { - return response != null && response.isExist(); - } - - /**获取内部的JSONResponse - * @param key - * @return - */ - public JSONResponse getJSONResponse(String key) { - return getObject(key, JSONResponse.class); - } - //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - - - /** - * key = clazz.getSimpleName() - * @param clazz - * @return - */ - public T getObject(Class clazz) { - return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); - } - /** - * @param key - * @param clazz - * @return - */ - public T getObject(String key, Class clazz) { - return getObject(this, key, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static T getObject(JSONObject object, String key, Class clazz) { - return toObject(object == null ? null : object.getJSONObject(key), clazz); - } - - /** - * @param clazz - * @return - */ - public T toObject(Class clazz) { - return toObject(this, clazz); - } - /** - * @param object - * @param clazz - * @return - */ - public static T toObject(JSONObject object, Class clazz) { - return JSON.parseObject(JSON.toJSONString(object), clazz); - } - - - - - /** - * key = KEY_ARRAY - * @param clazz - * @return - */ - public List getList(Class clazz) { - return getList(KEY_ARRAY, clazz); - } - /** - * arrayObject = this - * @param key - * @param clazz - * @return - */ - public List getList(String key, Class clazz) { - return getList(this, key, clazz); - } - - /** - * key = KEY_ARRAY - * @param object - * @param clazz - * @return - */ - public static List getList(JSONObject object, Class clazz) { - return getList(object, KEY_ARRAY, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static List getList(JSONObject object, String key, Class clazz) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? JSON.parseArray((JSONArray) obj, clazz) : toList((JSONObject) obj, clazz); - } - /** - * @param clazz - * @return - */ - public List toList(Class clazz) { - return toList(this, clazz); - } - /** - * @param arrayObject - * @param clazz - * @return - */ - public static List toList(JSONObject arrayObject, Class clazz) { - return clazz == null ? null : JSON.parseArray(JSON.toJSONString( - toArray(arrayObject, clazz.getSimpleName())), clazz); - } - - /** - * key = KEY_ARRAY - * @param className - * @return - */ - public JSONArray getArray(String className) { - return getArray(KEY_ARRAY, className); - } - /** - * @param key - * @param className - * @return - */ - public JSONArray getArray(String key, String className) { - return getArray(this, key, className); - } - /** - * @param object - * @param key - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String className) { - return getArray(object, KEY_ARRAY, className); - } - /** - * key = KEY_ARRAY - * @param object - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String key, String className) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? (JSONArray) obj : toArray((JSONObject) obj, className); - } - - /** - * @param className - * @return - */ - public JSONArray toArray(String className) { - return toArray(this, className); - } - /**{0:{Table:{}}, 1:{Table:{}}...} 转化为 [{Table:{}}, {Table:{}}] - * array.set(index, isContainer ? value : value.getJSONObject(className)); - * @param arrayObject - * @param className className.equals(Table) ? {Table:{Content}} => {Content} - * @return - */ - public static JSONArray toArray(JSONObject arrayObject, String className) { - Set set = arrayObject == null ? null : arrayObject.keySet(); - if (set == null || set.isEmpty()) { - return null; - } - - // [{...},{...},...] - String parentString = StringUtil.getTrimedString(JSON.toJSONString(arrayObject)); - if (parentString.isEmpty()) { - return null; - } - if (parentString.startsWith("[")) { - if (parentString.endsWith("]") == false) { - parentString += "]"; - } - return JSON.parseArray(parentString); - } - - //{"0":{Table:{...}}, "1":{Table:{...}}...} - - className = StringUtil.getTrimedString(className); - boolean isContainer = true; - - JSONArray array = new JSONArray(set.size()); - JSONObject value; - boolean isFirst = true; - int index; - for (String key : set) {//0, 1, 2,... - value = StringUtil.isNumer(key) == false ? null : arrayObject.getJSONObject(key);// Table:{} - if (value != null) { - try { - index = Integer.valueOf(0 + key); - if (isFirst && isTableKey(className) && value.containsKey(className)) {// 判断是否需要提取table - isContainer = false; - } - array.set(index, isContainer ? value : value.getJSONObject(className)); - } catch (Exception e) { - e.printStackTrace(); - } - } - isFirst = false; - } - return array; - } - - - - // /** - // * @return - // */ - // public JSONObject format() { - // return format(this); - // } - /**将Item[]:[{Table:{}}, {Table:{}}...] 或 Item[]:{0:{Table:{}}, 1:{Table:{}}...} - * 转化为 itemList:[{Table:{}}, {Table:{}}],如果 Item.equals(Table),则将 {Table:{Content}} 转化为 {Content} - * @param target - * @param response - * @return - */ - public static JSONObject format(final JSONObject response) { - //太长查看不方便,不如debug Log.i(TAG, "format response = \n" + JSON.toJSONString(response)); - if (response == null || response.isEmpty()) { - Log.i(TAG, "format response == null || response.isEmpty() >> return response;"); - return response; - } - JSONObject transferredObject = new JSONObject(true); - - Set set = response.keySet(); - if (set != null) { - - Object value; - String arrayKey; - for (String key : set) { - value = response.get(key); - - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredObject.put(replaceArray(key), format(key, (JSONArray) value)); - } else if (value instanceof JSONObject) {//APIJSON Array转为常规JSONArray - if (isArrayKey(key)) {//APIJSON Array转为常规JSONArray - arrayKey = key.substring(0, key.lastIndexOf(KEY_ARRAY)); - transferredObject.put(getArrayKey(getSimpleName(arrayKey)) - , format(key, toArray((JSONObject) value, arrayKey)));//需要将name:alias传至toArray - } else {//常规JSONObject,往下一级提取 - transferredObject.put(getSimpleName(key), format((JSONObject) value)); - } - } else {//其它Object,直接填充 - transferredObject.put(getSimpleName(key), value); - } - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredObject = " + JSON.toJSONString(transferredObject)); - return transferredObject; - } - - /** - * @param responseArray - * @return - */ - public static JSONArray format(String name, final JSONArray responseArray) { - //太长查看不方便,不如debug Log.i(TAG, "format responseArray = \n" + JSON.toJSONString(responseArray)); - if (responseArray == null || responseArray.isEmpty()) { - Log.i(TAG, "format responseArray == null || responseArray.isEmpty() >> return response;"); - return responseArray; - } - int index = name == null ? -1 : name.lastIndexOf(KEY_ARRAY); - String className = index < 0 ? "" : name.substring(0, index); - - JSONArray transferredArray = new JSONArray(); - - Object value; - boolean isContainer = true; - boolean isFirst = true; - for (int i = 0; i < responseArray.size(); i++) { - value = responseArray.get(i); - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredArray.add(format(null, (JSONArray) value)); - } else if (value instanceof JSONObject) {//JSONObject,往下一级提取 - //判断是否需要提取child - if (isFirst && isTableKey(className) && ((JSONObject) value).containsKey(className)) { - isContainer = false; - } - //直接添加child 或 添加提取出的child - transferredArray.add(format(isContainer ? (JSONObject)value : ((JSONObject)value).getJSONObject(className) )); - isFirst = false; - } else {//其它Object,直接填充 - transferredArray.add(responseArray.get(i)); - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredArray = " + JSON.toJSONString(transferredArray)); - return transferredArray; - } - - /**替换key+KEY_ARRAY为keyList - * @param key - * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} - */ - public static String replaceArray(String key) { - if (isArrayKey(key)) { - key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); - } - return getSimpleName(key); - } - /**获取列表变量名 - * @param key => StringUtil.getNoBlankString(key) - * @return empty ? "list" : key + "List" 且首字母小写 - */ - public static String getArrayKey(String key) { - key = StringUtil.getNoBlankString(key); - if (key.isEmpty()) { - return "list"; - } - - String first = key.substring(0, 1); - if (bigAlphaPattern.matcher(first).matches()) { - key = first.toLowerCase() + key.substring(1, key.length()); - } - return key + "List"; - } - - /**获取简单名称 - * @param fullName name 或 name:alias - * @return name > name; name:alias > alias - */ - public static String getSimpleName(String fullName) { - //key:alias -> alias; key:alias[] -> alias[] - int index = fullName == null ? -1 : fullName.indexOf(":"); - if (index >= 0) { - fullName = fullName.substring(index + 1); - } - return fullName; - } - - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java deleted file mode 100644 index 6a25809d1..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java +++ /dev/null @@ -1,56 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出一个POST_GET方法 - * @author Lemon - */ -public enum RequestMethod { - - /** - * 常规获取数据方式 - */ - GET, - - /** - * 检查,默认是非空检查,返回数据总数 - */ - HEAD, - - /** - * 通过POST来GET数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 - */ - POST_GET, - - /** - * 通过POST来HEAD数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 - */ - POST_HEAD, - - /** - * 新增(或者说插入)数据 - */ - POST, - - /** - * 修改数据,只修改传入字段对应的值 - */ - PUT, - - /** - * 删除数据 - */ - DELETE -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java deleted file mode 100644 index ac779ec2e..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java +++ /dev/null @@ -1,758 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.io.File; -import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/**通用字符串(String)相关类,为null时返回"" - * @author Lemon - * @use StringUtil. - */ -public class StringUtil { - private static final String TAG = "StringUtil"; - - public StringUtil() { - } - - public static final String UTF_8 = "utf-8"; - - public static final String EMPTY = "无"; - public static final String UNKNOWN = "未知"; - public static final String UNLIMITED = "不限"; - - public static final String I = "我"; - public static final String YOU = "你"; - public static final String HE = "他"; - public static final String SHE = "她"; - public static final String IT = "它"; - - public static final String MALE = "男"; - public static final String FEMALE = "女"; - - public static final String TODO = "未完成"; - public static final String DONE = "已完成"; - - public static final String FAIL = "失败"; - public static final String SUCCESS = "成功"; - - public static final String SUNDAY = "日"; - public static final String MONDAY = "一"; - public static final String TUESDAY = "二"; - public static final String WEDNESDAY = "三"; - public static final String THURSDAY = "四"; - public static final String FRIDAY = "五"; - public static final String SATURDAY = "六"; - - public static final String YUAN = "元"; - - - private static String currentString = ""; - /**获取刚传入处理后的string - * @must 上个影响currentString的方法 和 这个方法都应该在同一线程中,否则返回值可能不对 - * @return - */ - public static String getCurrentString() { - return currentString == null ? "" : currentString; - } - - //获取string,为null时返回"" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取string,为null则返回"" - * @param object - * @return - */ - public static String getString(Object object) { - return object == null ? "" : getString(String.valueOf(object)); - } - /**获取string,为null则返回"" - * @param cs - * @return - */ - public static String getString(CharSequence cs) { - return cs == null ? "" : getString(cs.toString()); - } - /**获取string,为null则返回"" - * @param s - * @return - */ - public static String getString(String s) { - return s == null ? "" : s; - } - /**获取string,为null则返回"" - * ignoreEmptyItem = false; - * split = "," - * @param array - * @return {@link #getString(String[], boolean)} - */ - public static String getString(String[] array) { - return getString(array, false); - } - /**获取string,为null则返回"" - * split = "," - * @param array - * @param ignoreEmptyItem - * @return {@link #getString(String[], String, boolean)} - */ - public static String getString(String[] array, boolean ignoreEmptyItem) { - return getString(array, null, ignoreEmptyItem); - } - /**获取string,为null则返回"" - * ignoreEmptyItem = false; - * @param array - * @param split - * @return {@link #getString(String[], String, boolean)} - */ - public static String getString(String[] array, String split) { - return getString(array, split, false); - } - /**获取string,为null则返回"" - * @param array - * @param split - * @param ignoreEmptyItem - * @return - */ - public static String getString(String[] array, String split, boolean ignoreEmptyItem) { - String s = ""; - if (array != null) { - if (split == null) { - split = ","; - } - for (int i = 0; i < array.length; i++) { - if (ignoreEmptyItem && isEmpty(array[i], true)) { - continue; - } - s += ((i > 0 ? split : "") + array[i]); - } - } - return getString(s); - } - - //获取string,为null时返回"" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //获取去掉前后空格后的string<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取去掉前后空格后的string,为null则返回"" - * @param object - * @return - */ - public static String getTrimedString(Object object) { - return getTrimedString(getString(object)); - } - /**获取去掉前后空格后的string,为null则返回"" - * @param cs - * @return - */ - public static String getTrimedString(CharSequence cs) { - return getTrimedString(getString(cs)); - } - /**获取去掉前后空格后的string,为null则返回"" - * @param s - * @return - */ - public static String getTrimedString(String s) { - return getString(s).trim(); - } - - //获取去掉前后空格后的string>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取去掉所有空格后的string <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取去掉所有空格后的string,为null则返回"" - * @param object - * @return - */ - public static String getNoBlankString(Object object) { - return getNoBlankString(getString(object)); - } - /**获取去掉所有空格后的string,为null则返回"" - * @param cs - * @return - */ - public static String getNoBlankString(CharSequence cs) { - return getNoBlankString(getString(cs)); - } - /**获取去掉所有空格后的string,为null则返回"" - * @param s - * @return - */ - public static String getNoBlankString(String s) { - return getString(s).replaceAll("\\s", ""); - } - - //获取去掉所有空格后的string >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取string的长度<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取string的长度,为null则返回0 - * @param object - * @param trim - * @return - */ - public static int getLength(Object object, boolean trim) { - return getLength(getString(object), trim); - } - /**获取string的长度,为null则返回0 - * @param cs - * @param trim - * @return - */ - public static int getLength(CharSequence cs, boolean trim) { - return getLength(getString(cs), trim); - } - /**获取string的长度,为null则返回0 - * @param s - * @param trim - * @return - */ - public static int getLength(String s, boolean trim) { - s = trim ? getTrimedString(s) : s; - return getString(s).length(); - } - - //获取string的长度>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //判断字符是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**判断字符是否为空 - * @param object - * @param trim - * @return - */ - public static boolean isEmpty(Object object, boolean trim) { - return isEmpty(getString(object), trim); - } - /**判断字符是否为空 - * @param cs - * @param trim - * @return - */ - public static boolean isEmpty(CharSequence cs, boolean trim) { - return isEmpty(getString(cs), trim); - } - /**判断字符是否为空 - * @param s - * @param trim - * @return - */ - public static boolean isEmpty(String s, boolean trim) { - // Log.i(TAG, "getTrimedString s = " + s); - if (s == null) { - return true; - } - if (trim) { - s = s.trim(); - } - if (s.isEmpty()) { - return true; - } - - currentString = s; - - return false; - } - - //判断字符是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //判断字符是否非空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**判断字符是否非空 - * @param object - * @param trim - * @return - */ - public static boolean isNotEmpty(Object object, boolean trim) { - return isNotEmpty(getString(object), trim); - } - /**判断字符是否非空 - * @param cs - * @param trim - * @return - */ - public static boolean isNotEmpty(CharSequence cs, boolean trim) { - return isNotEmpty(getString(cs), trim); - } - /**判断字符是否非空 - * @param s - * @param trim - * @return - */ - public static boolean isNotEmpty(String s, boolean trim) { - return ! isEmpty(s, trim); - } - - //判断字符是否非空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final Pattern alphaPattern; - public static final Pattern bigAlphaPattern; - public static final Pattern namePattern; - public static final Pattern smallAlphaPattern; - static { - alphaPattern = Pattern.compile("[a-zA-Z]"); - bigAlphaPattern = Pattern.compile("[A-Z]"); - namePattern = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 - smallAlphaPattern = Pattern.compile("[a-z]"); - } - - //判断手机格式是否正确 - public static boolean isPhone(String phone) { - if (isNotEmpty(phone, true) == false) { - return false; - } - - Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); - - currentString = phone; - - return p.matcher(phone).matches(); - } - //判断email格式是否正确 - public static boolean isEmail(String email) { - if (isNotEmpty(email, true) == false) { - return false; - } - - String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; - Pattern p = Pattern.compile(str); - - currentString = email; - - return p.matcher(email).matches(); - } - - /**判断是否全是数字 - * @param s - * @return - */ - public static boolean isNumer(String s) { - if (isNotEmpty(s, true) == false) { - return false; - } - - Pattern pattern = Pattern.compile("[0-9]"); - Matcher matcher; - for (int i = 0; i < s.length(); i++) { - matcher = pattern.matcher(s.substring(i, i+1)); - if(! matcher.matches()){ - return false; - } - } - - currentString = s; - - return true; - } - /**判断是否全是字母 - * @param s - * @return - */ - public static boolean isAlpha(String s) { - if (s == null) { - Log.i(TAG, "isNumberOrAlpha inputed == null >> return false;"); - return false; - } - Pattern pAlpha = Pattern.compile("[a-zA-Z]"); - Matcher mAlpha; - for (int i = 0; i < s.length(); i++) { - mAlpha = pAlpha.matcher(s.substring(i, i+1)); - if(! mAlpha.matches()){ - return false; - } - } - - currentString = s; - return true; - } - /**判断是否全是数字或字母 - * @param s - * @return - */ - public static boolean isNumberOrAlpha(String s) { - return isNumer(s) || isAlpha(s); - } - - /**判断字符类型是否是身份证号 - * @param idCard - * @return - */ - public static boolean isIDCard(String idCard) { - if (isNumberOrAlpha(idCard) == false) { - return false; - } - idCard = getString(idCard); - if (idCard.length() == 15) { - Log.i(TAG, "isIDCard idCard.length() == 15 old IDCard"); - currentString = idCard; - return true; - } - if (idCard.length() == 18) { - currentString = idCard; - return true; - } - - return false; - } - - public static final String HTTP = "http"; - public static final String URL_PREFIX = "http://"; - public static final String URL_PREFIXs = "https://"; - public static final String URL_STAFFIX = URL_PREFIX; - public static final String URL_STAFFIXs = URL_PREFIXs; - /**判断字符类型是否是网址 - * @param url - * @return - */ - public static boolean isUrl(String url) { - if (isNotEmpty(url, true) == false) { - return false; - } else if (! url.startsWith(URL_PREFIX) && ! url.startsWith(URL_PREFIXs)) { - return false; - } - - currentString = url; - return true; - } - - public static final String FILE_PATH_PREFIX = "file://"; - /**判断文件路径是否存在 - * @param path - * @return - */ - public static boolean isFilePathExist(String path) { - return StringUtil.isFilePath(path) && new File(path).exists(); - } - - public static final String SEPARATOR = "/"; - /**判断是否为路径 - * @param path - * @return - */ - public static boolean isPath(String path) { - return StringUtil.isNotEmpty(path, true) && path.contains(SEPARATOR) - && path.contains(SEPARATOR + SEPARATOR) == false && path.endsWith(SEPARATOR) == false; - } - - /**判断字符类型是否是路径 - * @param path - * @return - */ - public static boolean isFilePath(String path) { - if (isNotEmpty(path, true) == false) { - return false; - } - - if (! path.contains(".") || path.endsWith(".")) { - return false; - } - - currentString = path; - - return true; - } - - //判断字符类型 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //提取特殊字符<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**去掉string内所有非数字类型字符 - * @param object - * @return - */ - public static String getNumber(Object object) { - return getNumber(getString(object)); - } - /**去掉string内所有非数字类型字符 - * @param cs - * @return - */ - public static String getNumber(CharSequence cs) { - return getNumber(getString(cs)); - } - /**去掉string内所有非数字类型字符 - * @param s - * @return - */ - public static String getNumber(String s) { - return getNumber(s, false); - } - /**去掉string内所有非数字类型字符 - * @param s - * @param onlyStart 中间有非数字时只获取前面的数字 - * @return - */ - public static String getNumber(String s, boolean onlyStart) { - if (isNotEmpty(s, true) == false) { - return ""; - } - - String numberString = ""; - String single; - for (int i = 0; i < s.length(); i++) { - single = s.substring(i, i + 1); - if (isNumer(single)) { - numberString += single; - } else { - if (onlyStart) { - return numberString; - } - } - } - - return numberString; - } - - //提取特殊字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //校正(自动补全等)字符串<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取网址,自动补全 - * @param url - * @return - */ - public static String getCorrectUrl(String url) { - Log.i(TAG, "getCorrectUrl : \n" + url); - if (isNotEmpty(url, true) == false) { - return ""; - } - - // if (! url.endsWith("/") && ! url.endsWith(".html")) { - // url = url + "/"; - // } - - if (isUrl(url) == false) { - return URL_PREFIX + url; - } - return url; - } - - /**获取去掉所有 空格 、"-" 、"+86" 后的phone - * @param phone - * @return - */ - public static String getCorrectPhone(String phone) { - if (isNotEmpty(phone, true) == false) { - return ""; - } - - phone = getNoBlankString(phone); - phone = phone.replaceAll("-", ""); - if (phone.startsWith("+86")) { - phone = phone.substring(3); - } - return phone; - } - - - /**获取邮箱,自动补全 - * @param email - * @return - */ - public static String getCorrectEmail(String email) { - if (isNotEmpty(email, true) == false) { - return ""; - } - - email = getNoBlankString(email); - if (isEmail(email) == false && ! email.endsWith(".com")) { - email += ".com"; - } - - return email; - } - - - public static final int PRICE_FORMAT_DEFAULT = 0; - public static final int PRICE_FORMAT_PREFIX = 1; - public static final int PRICE_FORMAT_SUFFIX = 2; - public static final int PRICE_FORMAT_PREFIX_WITH_BLANK = 3; - public static final int PRICE_FORMAT_SUFFIX_WITH_BLANK = 4; - public static final String[] PRICE_FORMATS = { - "", "¥", "元", "¥ ", " 元" - }; - - /**获取价格,保留两位小数 - * @param price - * @return - */ - public static String getPrice(String price) { - return getPrice(price, PRICE_FORMAT_DEFAULT); - } - /**获取价格,保留两位小数 - * @param price - * @param formatType 添加单位(元) - * @return - */ - public static String getPrice(String price, int formatType) { - if (isNotEmpty(price, true) == false) { - return getPrice(0, formatType); - } - - //单独写到getCorrectPrice? <<<<<<<<<<<<<<<<<<<<<< - String correctPrice = ""; - String s; - for (int i = 0; i < price.length(); i++) { - s = price.substring(i, i + 1); - if (".".equals(s) || isNumer(s)) { - correctPrice += s; - } - } - //单独写到getCorrectPrice? >>>>>>>>>>>>>>>>>>>>>> - - Log.i(TAG, "getPrice <<<<<<<<<<<<<<<<<< correctPrice = " + correctPrice); - if (correctPrice.contains(".")) { - // if (correctPrice.startsWith(".")) { - // correctPrice = 0 + correctPrice; - // } - if (correctPrice.endsWith(".")) { - correctPrice = correctPrice.replaceAll(".", ""); - } - } - - Log.i(TAG, "getPrice correctPrice = " + correctPrice + " >>>>>>>>>>>>>>>>"); - return isNotEmpty(correctPrice, true) ? getPrice(new BigDecimal(0 + correctPrice), formatType) : getPrice(0, formatType); - } - /**获取价格,保留两位小数 - * @param price - * @return - */ - public static String getPrice(BigDecimal price) { - return getPrice(price, PRICE_FORMAT_DEFAULT); - } - /**获取价格,保留两位小数 - * @param price - * @return - */ - public static String getPrice(double price) { - return getPrice(price, PRICE_FORMAT_DEFAULT); - } - /**获取价格,保留两位小数 - * @param price - * @param formatType 添加单位(元) - * @return - */ - public static String getPrice(BigDecimal price, int formatType) { - return getPrice(price == null ? 0 : price.doubleValue(), formatType); - } - /**获取价格,保留两位小数 - * @param price - * @param formatType 添加单位(元) - * @return - */ - public static String getPrice(double price, int formatType) { - String s = new DecimalFormat("#########0.00").format(price); - switch (formatType) { - case PRICE_FORMAT_PREFIX: - return PRICE_FORMATS[PRICE_FORMAT_PREFIX] + s; - case PRICE_FORMAT_SUFFIX: - return s + PRICE_FORMATS[PRICE_FORMAT_SUFFIX]; - case PRICE_FORMAT_PREFIX_WITH_BLANK: - return PRICE_FORMATS[PRICE_FORMAT_PREFIX_WITH_BLANK] + s; - case PRICE_FORMAT_SUFFIX_WITH_BLANK: - return s + PRICE_FORMATS[PRICE_FORMAT_SUFFIX_WITH_BLANK]; - default: - return s; - } - } - - - /**分割路径 - * @param path - * @return - */ - public static String[] splitPath(String path) { - if (StringUtil.isNotEmpty(path, true) == false) { - return null; - } - return isPath(path) ? split(path, SEPARATOR) : new String[] {path}; - } - /**将s分割成String[] - * @param s - * @return - */ - public static String[] split(String s) { - return split(s, null); - } - /**将s用split分割成String[] - * @param s - * @param split - * @return - */ - public static String[] split(String s, String split) { - s = getString(s); - if (s.isEmpty()) { - return null; - } - if (isNotEmpty(split, false) == false) { - split = ","; - } - while (s.startsWith(split)) { - s = s.substring(split.length()); - } - while (s.endsWith(split)) { - s = s.substring(0, s.length() - split.length()); - } - return s.contains(split) ? s.split(split) : new String[]{s}; - } - - /** - * @param key - * @param suffix - * @return key + suffix,第一个字母小写 - */ - public static String addSuffix(String key, String suffix) { - key = StringUtil.getNoBlankString(key); - if (key.isEmpty()) { - return firstCase(suffix); - } - - return firstCase(key) + firstCase(suffix, true); - } - /** - * @param key - */ - public static String firstCase(String key) { - return firstCase(key, false); - } - /** - * @param key - * @param upper - * @return - */ - public static String firstCase(String key, boolean upper) { - key = StringUtil.getString(key); - if (key.isEmpty()) { - return ""; - } - - String first = key.substring(0, 1); - key = (upper ? first.toUpperCase() : first.toLowerCase()) + key.substring(1, key.length()); - - return key; - } - - - //校正(自动补全等)字符串>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/manager/DataManager.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/manager/DataManager.java deleted file mode 100755 index 06559dc1e..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/manager/DataManager.java +++ /dev/null @@ -1,200 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.client.manager; - -import android.content.Context; -import android.content.SharedPreferences; - -import apijson.demo.client.application.APIJSONApplication; -import apijson.demo.client.model.User; -import zuo.biao.library.util.JSON; -import zuo.biao.library.util.Log; -import zuo.biao.library.util.StringUtil; - -/**数据工具类 - * @author Lemon - */ -public class DataManager { - private final String TAG = "DataManager"; - - private Context context; - private DataManager(Context context) { - this.context = context; - } - - private static DataManager instance = new DataManager(APIJSONApplication.getInstance()); - public static DataManager getInstance() { - return instance; - } - - //用户 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - private String PATH_USER = "PATH_USER"; - - public final String KEY_USER = "KEY_USER"; - public final String KEY_USER_ID = "KEY_USER_ID"; - public final String KEY_USER_NAME = "KEY_USER_NAME"; - public final String KEY_USER_PHONE = "KEY_USER_PHONE"; - - public final String KEY_CURRENT_USER_ID = "KEY_CURRENT_USER_ID"; - public final String KEY_LAST_USER_ID = "KEY_LAST_USER_ID"; - - - /**判断是否为当前用户 - * @param userId - * @return - */ - public boolean isCurrentUser(long userId) { - return userId > 0 && userId == getCurrentUserId(); - } - - /**获取当前用户id - * @return - */ - public long getCurrentUserId() { - User user = getCurrentUser(); - return user == null ? 0 : user.getId(); - } - - /**获取当前用户的手机号 - * @return - */ - public String getCurrentUserPhone() { - User user = getCurrentUser(); - return user == null ? "" : user.getPhone(); - } - /**获取当前用户 - * @return - */ - public User getCurrentUser() { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - return sdf == null ? null : getUser(sdf.getLong(KEY_CURRENT_USER_ID, 0)); - } - - - /**获取最后一次登录的用户的手机号 - * @return - */ - public String getLastUserPhone() { - User user = getLastUser(); - return user == null ? "" : user.getPhone(); - } - - /**获取最后一次登录的用户 - * @return - */ - public User getLastUser() { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - return sdf == null ? null : getUser(sdf.getLong(KEY_LAST_USER_ID, 0)); - } - - /**获取用户 - * @param userId - * @return - */ - public User getUser(long userId) { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - if (sdf == null) { - Log.e(TAG, "get sdf == null >> return;"); - return null; - } - Log.i(TAG, "getUser userId = " + userId); - return JSON.parseObject(sdf.getString(StringUtil.getTrimedString(userId), null), User.class); - } - - - /**保存当前用户,只在登录或注销时调用 - * @param user user == null >> user = new User(); - */ - public void saveCurrentUser(User user) { - SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); - if (sdf == null) { - Log.e(TAG, "saveUser sdf == null >> return;"); - return; - } - if (user == null) { - Log.w(TAG, "saveUser user == null >> user = new User();"); - user = new User(); - } - SharedPreferences.Editor editor = sdf.edit(); - editor.remove(KEY_LAST_USER_ID).putLong(KEY_LAST_USER_ID, getCurrentUserId()); - editor.remove(KEY_CURRENT_USER_ID).putLong(KEY_CURRENT_USER_ID, user.getId()); - editor.commit(); - - saveUser(sdf, user); - } - - /**保存用户 - * @param user - */ - public void saveUser(User user) { - saveUser(context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE), user); - } - /**保存用户 - * @param sdf - * @param user - */ - public void saveUser(SharedPreferences sdf, User user) { - if (sdf == null || user == null) { - Log.e(TAG, "saveUser sdf == null || user == null >> return;"); - return; - } - String key = StringUtil.getTrimedString(user.getId()); - Log.i(TAG, "saveUser key = user.getId() = " + user.getId()); - sdf.edit().remove(key).putString(key, JSON.toJSONString(user)).commit(); - } - - /**删除用户 - * @param sdf - * @param userId - */ - public void removeUser(SharedPreferences sdf, long userId) { - if (sdf == null) { - Log.e(TAG, "removeUser sdf == null >> return;"); - return; - } - sdf.edit().remove(StringUtil.getTrimedString(userId)).commit(); - } - - /**设置当前用户手机号 - * @param phone - */ - public void setCurrentUserPhone(String phone) { - User user = getCurrentUser(); - if (user == null) { - user = new User(); - } - user.setPhone(phone); - saveUser(user); - } - - /**设置当前用户姓名 - * @param name - */ - public void setCurrentUserName(String name) { - User user = getCurrentUser(); - if (user == null) { - user = new User(); - } - user.setName(name); - saveUser(user); - } - - //用户 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Verify.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Verify.java deleted file mode 100644 index d9f8ec21d..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Verify.java +++ /dev/null @@ -1,57 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.client.model; - -import zuo.biao.library.util.StringUtil; - - -/**验证码类 - * @author Lemon - */ -public class Verify extends apijson.demo.server.model.Verify { - private static final long serialVersionUID = 4298571449155754300L; - - public Verify() { - super(); - } - public Verify(long phone) { - super(phone); - } - public Verify(String code) { - this(); - setCode(code); - } - - @Override - public Long getId() { - return value(super.getId()); - } - - /**服务器用id作为phone - * @return - */ - public String getPhone() { - return "" + getId(); - } - public Verify setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } - public Verify setPhone(Long phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Comment.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Comment.java deleted file mode 100644 index 83d0ff45a..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Comment.java +++ /dev/null @@ -1,83 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; - -/**评论类 - * @author Lemon - * @see -*
POST:
-{
- "Comment":{
-     "disallow":"id",
-     "necessary":"userId,momentId,content"
- }
-}
- * 
- */ -@APIJSONRequest( - method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.POST, RequestMethod.DELETE}, - POST = "{\"disallow\": \"id\", \"necessary\": \"userId,momentId,content\"}", - DELETE = "{\"necessary\": \"id\"}" - ) -public class Comment extends BaseModel { - private static final long serialVersionUID = -1011007127735372824L; - - private Long toId; - private Long userId; - private Long momentId; - private String content; - public Comment() { - super(); - } - public Comment(long id) { - this(); - setId(id); - } - - - public Long getToId() { - return toId; - } - public Comment setToId(Long toId) { - this.toId = toId; - return this; - } - public Long getUserId() { - return userId; - } - public Comment setUserId(Long userId) { - this.userId = userId; - return this; - } - public Long getMomentId() { - return momentId; - } - public Comment setMomentId(Long momentId) { - this.momentId = momentId; - return this; - } - public String getContent() { - return content; - } - public Comment setContent(String content) { - this.content = content; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Friend.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Friend.java deleted file mode 100644 index fd0d34d0f..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Friend.java +++ /dev/null @@ -1,108 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; - -/**朋友类 - * @author Lemon - * @see - *
POST:
-{
-    "Friend":{
-        "disallow":"state",
-        "necessary":"userId,toUserId"
-    }
-}
- * 
- *
PUT
-{
-    "Friend":{
-        "disallow":"!",
-        "necessary":"id,state"
-    }
-}
- * 
- */ -@APIJSONRequest( - method = {RequestMethod.POST_HEAD, RequestMethod.POST, RequestMethod.PUT}, - POST_HEAD = "{}", - POST = "{\"disallow\": \"state\", \"necessary\": \"userId,toUserId\"}", - PUT = "{\"disallow\": \"!\", \"necessary\": \"id,state\"}" - ) -public class Friend extends BaseModel { - private static final long serialVersionUID = -4478257698563522976L; - - public static final int STATE_SEND = 0; - public static final int STATE_READ = 1; - public static final int STATE_ACCEPT = 2; - public static final int STATE_REFUSE = 4; - - - private Long userId;//加好友方 - private Long toUserId;//被加好友方 - private String letter;//加友时稍的话 - private Integer state;//状态 - - public Friend() { - super(); - } - - public Friend(long id) { - this(); - setId(id); - } - - - public Long getUserId() { - return userId; - } - - public Friend setUserId(Long userId) { - this.userId = userId; - return this; - } - - public Long getToUserId() { - return toUserId; - } - - public Friend setToUserId(Long toUserId) { - this.toUserId = toUserId; - return this; - } - - public String getLetter() { - return letter; - } - - public Friend setLetter(String letter) { - this.letter = letter; - return this; - } - - public Integer getState() { - return state; - } - - public Friend setState(Integer state) { - this.state = state; - return this; - } - - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Login.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Login.java deleted file mode 100644 index 528bc1736..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Login.java +++ /dev/null @@ -1,89 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; - -/**登录类 - * @author Lemon - * @see - *
POST_HEAD:
-{
- "Login":{
-     "disallow":"!",
-     "necessary":"userId,type"
- }
-}
- * 
-*
POST:post_get/login
-{
-    "User":{
-        "necessary":"phone"
-    },
-    "Password":{
-        "disallow":"!",
-        "necessary":"password"
-    }
-}
- * 
-*
POST(logout):post/logout
-{
-    "User":{
-        "necessary":"phone"
-    }
-}
- * 
- */ -@SuppressWarnings("serial") -@APIJSONRequest( - method = {RequestMethod.POST_HEAD, RequestMethod.POST}, - POST_HEAD = "{\"disallow\": \"!\", \"necessary\": \"userId,type\"}", - POST = "{\"User\": {\"necessary\": \"phone\"}, \"Password\": {\"disallow\": \"!\", \"necessary\": \"password\"}}" - ) -public class Login extends BaseModel { - - public static final int TYPE_PASSWORD = 0; - public static final int TYPE_VERIFY = 1; - - private Long userId; - private Integer type; - - public Login() { - super(); - } - public Login(long userId) { - this(); - setUserId(userId); - } - - public Long getUserId() { - return userId; - } - public Login setUserId(Long userId) { - this.userId = userId; - return this; - } - - public Integer getType() { - return type; - } - public Login setType(Integer type) { - this.type = type; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Moment.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Moment.java deleted file mode 100644 index 1d3ecae58..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Moment.java +++ /dev/null @@ -1,101 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import java.util.List; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; - -/**动态类 - * @author Lemon - * @see - *
POST:
-{
- "Moment":{
-     "disallow":"id",
-     "necessary":"userId,pictureList"
- }
-}
- * 
- *
PUT:
-{
- "Moment":{
-     "disallow":"userId,date",
-     "necessary":"id"
- }
-}
- * 
- */ -@APIJSONRequest( - method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, - POST = "{\"disallow\": \"id\", \"necessary\": \"userId,pictureList\"}", - PUT = "{\"disallow\": \"userId,date\", \"necessary\": \"id\"}", - DELETE = "{\"necessary\": \"id\"}" - ) -public class Moment extends BaseModel { - private static final long serialVersionUID = -7437225320551780084L; - - private Long userId; - private String content; - private List pictureList; - private List praiseUserIdList; - private List commentIdList; - - public Moment() { - super(); - } - public Moment(long id) { - this(); - setId(id); - } - - public Long getUserId() { - return userId; - } - public Moment setUserId(Long userId) { - this.userId = userId; - return this; - } - public String getContent() { - return content; - } - public Moment setContent(String content) { - this.content = content; - return this; - } - public List getPictureList() { - return pictureList; - } - public Moment setPictureList(List pictureList) { - this.pictureList = pictureList; - return this; - } - public List getPraiseUserIdList() { - return praiseUserIdList; - } - public Moment setPraiseUserIdList(List praiseUserIdList) { - this.praiseUserIdList = praiseUserIdList; - return this; - } - public List getCommentIdList() { - return commentIdList; - } - public Moment setCommentIdList(List commentIdList) { - this.commentIdList = commentIdList; - return this; - } -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Password.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Password.java deleted file mode 100644 index 69d736975..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Password.java +++ /dev/null @@ -1,95 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; -import zuo.biao.apijson.StringUtil; - -/**密码类 - * @author Lemon - * @see - *
POST_HEAD:
-{
- "Password":{
-     "disallow":"!",
-     "necessary":"id,model"
- }
-}
- * 
- *
PUT:put/loginPassword, put/payPassword
-{
-    "Password":{
-        "disallow":"!",
-        "necessary":"id,password"
-    },
-    "necessary":"oldPassword"
-}
- * 
- */ -@SuppressWarnings("serial") -@APIJSONRequest( - method = {RequestMethod.POST_HEAD, RequestMethod.PUT}, - POST_HEAD = "{\"disallow\": \"!\", \"necessary\": \"id,model\"}", - PUT = "{\"Password\": {\"disallow\": \"!\", \"necessary\": \"id,password\"}, \"necessary\": \"oldPassword\"}" - ) -public class Password extends BaseModel { - - private String model;//table是MySQL关键字不能用! - private Integer type; - private String password; - - public Password() { - super(); - } - public Password(String model, String phone) { - this(); - setModel(model); - setPhone(phone); - } - public Password(String model, String phone, String password) { - this(model, phone); - setPassword(password); - } - - public Password setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } - - public String getModel() { - return StringUtil.isNotEmpty(model, true) ? model : "User"; - } - public Password setModel(String model) { - this.model = model; - return this; - } - public Integer getType() { - return type; - } - public Password setType(Integer type) { - this.type = type; - return this; - } - public String getPassword() { - return password; - } - public Password setPassword(String password) { - this.password = password; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/User.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/User.java deleted file mode 100644 index 7405d776d..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/User.java +++ /dev/null @@ -1,137 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import java.util.List; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; - -/**用户类 - * @author Lemon - * @see - *
POST:post/register/user
-{
-    "User":{
-        "disallow":"id",
-        "necessary":"name,phone"
-    },
-    "necessary":"loginPassword,verify"
-}
- * 
- *
PUT:
-{
-    "User":{
-        "disallow":"phone",
-        "necessary":"id"
-    }
-}
- * 
- *
PUT(User.phone):put/user/phone
-{
-    "User":{
-        "disallow":"!",
-        "necessary":"id,phone"
-    },
-    "necessary":"loginPassword,verify"
-}
- * 
- */ -@APIJSONRequest( - method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.PUT, RequestMethod.DELETE}, - POST = "{\"User\": {\"disallow\": \"id\", \"necessary\": \"name,phone\"}, \"necessary\": \"loginPassword,verify\"}", - PUT = "{\"disallow\": \"phone\", \"necessary\": \"id\"}" - ) -public class User extends BaseModel { - private static final long serialVersionUID = -1635551656020732611L; - - public static final int SEX_MAIL = 0; - public static final int SEX_FEMALE = 1; - public static final int SEX_UNKNOWN = 2; - - - private Integer sex; //性别 - private String head; //头像url - private String name; //姓名 - private String phone; //手机 - private String tag; //标签 - private List pictureList; //照片列表 - private List friendIdList; //朋友列表 - - /**默认构造方法,JSON等解析时必须要有 - */ - public User() { - super(); - } - public User(long id) { - this(); - setId(id); - } - - public Integer getSex() { - return sex; - } - public User setSex(Integer sex) { - this.sex = sex; - return this; - } - public String getHead() { - return head; - } - public User setHead(String head) { - this.head = head; - return this; - } - public String getName() { - return name; - } - public User setName(String name) { - this.name = name; - return this; - } - public String getPhone() { - return phone; - } - public User setPhone(String phone) { - this.phone = phone; - return this; - } - public List getPictureList() { - return pictureList; - } - public User setPictureList(List pictureList) { - this.pictureList = pictureList; - return this; - } - - public String getTag() { - return tag; - } - public User setTag(String tag) { - this.tag = tag; - return this; - } - - public List getFriendIdList() { - return friendIdList; - } - public User setFriendIdList(List friendIdList) { - this.friendIdList = friendIdList; - return this; - } - - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Verify.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Verify.java deleted file mode 100644 index 8f827a5d4..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Verify.java +++ /dev/null @@ -1,84 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; -import zuo.biao.apijson.StringUtil; - -/**验证码类 - * @author Lemon - * @see - *
POST_GET:post_get/authCode
-{
-    "Verify":{
-        "disallow":"id"
-    }
-}
- * 
- *
POST:post/authCode
-{
-    "Verify":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
- */ -@SuppressWarnings("serial") -@APIJSONRequest( - method = {RequestMethod.POST_HEAD, RequestMethod.POST_GET, RequestMethod.POST}, - POST_GET = "{\"necessary\": \"id\"}", - POST = "{\"disallow\": \"!\", \"necessary\": \"id\"}" - ) -public class Verify extends BaseModel { - - private String code; - - public Verify() { - super(); - } - public Verify(String phone) { - this(); - setPhone(phone); - } - public Verify(Long phone) { - this(); - setId(phone); - } - public Verify(String phone, String code) { - this(phone); - setCode(code); - } - - - public String getCode() { - return code; - } - public Verify setCode(String code) { - this.code = code; - return this; - } - - //phone is not column - // public String getPhone() { - // return StringUtil.getString(getId()); - // } - public Verify setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Wallet.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Wallet.java deleted file mode 100644 index 86f6f3b22..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/Wallet.java +++ /dev/null @@ -1,102 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import java.math.BigDecimal; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.BaseModel; -import zuo.biao.apijson.RequestMethod; - -/**钱包类 - * @author Lemon - * @see - *
POST_GET:
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"userId"
-    }
-}
- * 
- *
POST:post/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"userId"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
PUT:put/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"userId,balance+"
-    },
-    "necessary":"payPassword,oldPassword"
-}
- * 
- *
DELETE:delete/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"userId"
-    },
-    "necessary":"payPassword"
-}
- * 
- */ -@APIJSONRequest( - method = {RequestMethod.POST_GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, - POST_GET = "{\"disallow\": \"!\", \"necessary\": \"userId\"}", - POST = "{\"Wallet\": {\"disallow\": \"!\", \"necessary\": \"userId\"}, \"necessary\": \"payPassword\"}", - PUT = "{\"Wallet\": {\"disallow\": \"!\", \"necessary\": \"userId,balance+\"}, \"necessary\": \"payPassword,oldPassword\"}", - DELETE = "{\"Wallet\": {\"disallow\": \"!\", \"necessary\": \"userId\"}, \"necessary\": \"payPassword\"}" - ) -public class Wallet extends BaseModel { - private static final long serialVersionUID = 4298571449155754300L; - - public BigDecimal balance; - - private Long userId; - - /**默认构造方法,JSON等解析时必须要有 - */ - public Wallet() { - super(); - } - public Wallet(long id) { - this(); - setId(id); - } - - public Long getUserId() { - return userId; - } - public Wallet setUserId(Long userId) { - this.userId = userId; - return this; - } - - public BigDecimal getBalance() { - return balance; - } - public Wallet setBalance(BigDecimal balance) { - this.balance = balance; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSON(AndroidStudio).iml b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSON(AndroidStudio).iml deleted file mode 100644 index 8e7b54319..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSON(AndroidStudio).iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/APIJSONLibrary.iml b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/APIJSONLibrary.iml deleted file mode 100644 index 53245c8f7..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/APIJSONLibrary.iml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/APIJSONRequest.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/APIJSONRequest.java deleted file mode 100644 index a00fc0416..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/APIJSONRequest.java +++ /dev/null @@ -1,61 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/**请求方法对应的JSON结构 - * @author Lemon - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface APIJSONRequest { - - /** - * @return 允许的请求方法 - */ - RequestMethod[] method() default {}; - - - /**@see {@link RequestMethod#POST_GET} - * @return 该请求方法允许的结构 - */ - String POST_GET() default ""; - - /**@see {@link RequestMethod#POST_HEAD} - * @return 该请求方法允许的结构 - */ - String POST_HEAD() default ""; - - /**@see {@link RequestMethod#POST} - * @return 该请求方法允许的结构 - */ - String POST() default ""; - - /**@see {@link RequestMethod#PUT} - * @return 该请求方法允许的结构 - */ - String PUT() default ""; - - /**@see {@link RequestMethod#DELETE} - * @return 该请求方法允许的结构 - */ - String DELETE() default ""; -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/FunctionList.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/FunctionList.java deleted file mode 100644 index 6dc2d3407..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/FunctionList.java +++ /dev/null @@ -1,142 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.util.Collection; -import java.util.Map; - -/**可远程调用的函数列表 - * @author Lemon - */ -public interface FunctionList { - - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否为空 - * @param collection - * @return - */ - public boolean isEmpty(Collection collection); - /**判断map是否为空 - * @param - * @param - * @param map - * @return - */ - public boolean isEmpty(Map map); - //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //判断是否为包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否包含object - * @param collection - * @param object - * @return - */ - public boolean isContain(Collection collection, T object); - /**判断map是否包含key - * @param - * @param - * @param map - * @param key - * @return - */ - public boolean isContainKey(Map map, K key); - /**判断map是否包含value - * @param - * @param - * @param map - * @param value - * @return - */ - public boolean isContainValue(Map map, V value); - //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取数量 - * @param - * @param array - * @return - */ - public int count(T[] array); - /**获取数量 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - public int count(Collection collection); - /**获取数量 - * @param - * @param - * @param map - * @return - */ - public int count(Map map); - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取 - * @param - * @param array - * @return - */ - public T get(T[] array, int position); - /**获取 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - public T get(Collection collection, int position); - /**获取 - * @param - * @param - * @param map null ? null - * @param key null ? null : map.get(key); - * @return - */ - public V get(Map map, K key); - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取非空值 - * @param value - * @return - */ - public boolean value(Boolean value); - /**获取非空值 - * @param value - * @return - */ - public int value(Integer value); - /**获取非空值 - * @param value - * @return - */ - public long value(Long value); - /**获取非空值 - * @param value - * @return - */ - public float value(Float value); - /**获取非空值 - * @param value - * @return - */ - public double value(Double value); - //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java deleted file mode 100644 index e52532d6a..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java +++ /dev/null @@ -1,248 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.util.List; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.parser.Feature; -import com.alibaba.fastjson.serializer.SerializerFeature; - -/**阿里FastJSON封装类 防止解析时异常 - * @author Lemon - */ -public class JSON { - private static final String TAG = "JSON"; - - /**判断json格式是否正确 - * @param s - * @return - */ - public static boolean isJsonCorrect(String s) { - //太长 Log.i(TAG, "isJsonCorrect <<<< " + s + " >>>>>>>"); - if (s == null - // || s.equals("[]") - // || s.equals("{}") - || s.equals("") - || s.equals("[null]") - || s.equals("{null}") - || s.equals("null")) { - return false; - } - return true; - } - - /**获取有效的json - * @param s - * @return - */ - public static String getCorrectJson(String s) { - return getCorrectJson(s, false); - } - /**获取有效的json - * @param s - * @param isArray - * @return - */ - public static String getCorrectJson(String s, boolean isArray) { - s = StringUtil.getTrimedString(s); - // if (isArray) { - // if (s.startsWith("\"")) { - // s = s.substring(1); - // } - // if (s.endsWith("\"")) { - // s = s.substring(0, s.length() - 1); - // } - // } - return s;//isJsonCorrect(s) ? s : null; - } - - /**json转JSONObject - * @param json - * @return - */ - public static JSONObject parseObject(Object obj) { - return parseObject(toJSONString(obj)); - } - /**json转JSONObject - * @param json - * @return - */ - public static JSONObject parseObject(String json) { - int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; - features |= Feature.OrderedField.getMask(); - return parseObject(json, features); - } - /**json转JSONObject - * @param json - * @param features - * @return - */ - public static JSONObject parseObject(String json, int features) { - try { - return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), JSONObject.class, features); - } catch (Exception e) { - Log.i(TAG, "parseObject catch \n" + e.getMessage()); - } - return null; - } - - /**JSONObject转实体类 - * @param object - * @param clazz - * @return - */ - public static T parseObject(JSONObject object, Class clazz) { - return parseObject(toJSONString(object), clazz); - } - /**json转实体类 - * @param json - * @param clazz - * @return - */ - public static T parseObject(String json, Class clazz) { - try { - int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; - features |= Feature.OrderedField.getMask(); - return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); - } catch (Exception e) { - Log.i(TAG, "parseObject catch \n" + e.getMessage()); - } - return null; - } - - /**json转JSONArray - * @param json - * @return - */ - public static JSONArray parseArray(String json) { - try { - return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true)); - } catch (Exception e) { - Log.i(TAG, "parseArray catch \n" + e.getMessage()); - } - return null; - } - /**JSONArray转实体类列表 - * @param array - * @param clazz - * @return - */ - public static List parseArray(JSONArray array, Class clazz) { - return parseArray(toJSONString(array), clazz); - } - /**json转实体类列表 - * @param json - * @param clazz - * @return - */ - public static List parseArray(String json, Class clazz) { - try { - return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); - } catch (Exception e) { - Log.i(TAG, "parseArray catch \n" + e.getMessage()); - } - return null; - } - - /**实体类转json - * @param obj - * @return - */ - public static String toJSONString(Object obj) { - if (obj instanceof String) { - return (String) obj; - } - try { - return com.alibaba.fastjson.JSON.toJSONString(obj); - } catch (Exception e) { - Log.e(TAG, "toJSONString catch \n" + e.getMessage()); - } - return null; - } - - /**实体类转json - * @param obj - * @param features - * @return - */ - public static String toJSONString(Object obj, SerializerFeature... features) { - if (obj instanceof String) { - return (String) obj; - } - try { - return com.alibaba.fastjson.JSON.toJSONString(obj, features); - } catch (Exception e) { - Log.e(TAG, "parseArray catch \n" + e.getMessage()); - } - return null; - } - - /**格式化,显示更好看 - * @param json - * @return - */ - public static String format(String json) { - return format(parseObject(json)); - } - /**格式化,显示更好看 - * @param object - * @return - */ - public static String format(JSONObject object) { - return toJSONString(object, SerializerFeature.PrettyFormat); - } - - /**判断是否为JSONObject - * @param obj instanceof String ? parseObject - * @return - */ - public static boolean isJSONObject(Object obj) { - if (obj instanceof JSONObject) { - return true; - } - if (obj instanceof String) { - try { - JSONObject json = parseObject((String) obj); - return json != null && json.isEmpty() == false; - } catch (Exception e) { - Log.e(TAG, "isJSONObject catch \n" + e.getMessage()); - } - } - - return false; - } - /**判断是否为JSONArray - * @param obj instanceof String ? parseArray - * @return - */ - public static boolean isJSONArray(Object obj) { - if (obj instanceof JSONArray) { - return true; - } - if (obj instanceof String) { - try { - JSONArray json = parseArray((String) obj); - return json != null && json.isEmpty() == false; - } catch (Exception e) { - Log.e(TAG, "isJSONArray catch \n" + e.getMessage()); - } - } - - return false; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java deleted file mode 100644 index d030e71f7..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java +++ /dev/null @@ -1,432 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import static zuo.biao.apijson.StringUtil.UTF_8; -import static zuo.biao.apijson.StringUtil.bigAlphaPattern; -import static zuo.biao.apijson.StringUtil.namePattern; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Set; - - -/**use this class instead of com.alibaba.fastjson.JSONObject, not encode in default cases - * @author Lemon - */ -public class JSONObject extends com.alibaba.fastjson.JSONObject { - private static final long serialVersionUID = 8907029699680768212L; - - /**ordered - */ - public JSONObject() { - super(true); - } - /**transfer Object to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(Object, boolean)} - */ - public JSONObject(Object object) { - this(object, false); - } - /**transfer Object to JSONObject - * @param object - * @param encode - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(Object object, boolean encode) { - this(toJSONString(object), encode); - } - /**parse JSONObject with JSON String - * encode = false; - * @param json - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(String json) { - this(json, false); - } - /**parse JSONObject with JSON String - * @param json - * @param encode - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(String json, boolean encode) { - this(parseObject(json), encode); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object) { - this(object, false); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * @param object - * @param encode - * @see {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object, boolean encode) { - this(); - add(object, encode); - } - - - - - /**put key-value in object into this - * encode = false; - * @param object - * @return {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object) { - return add(object, false); - } - /**put key-value in object into this - * @param object - * @param encode - * @return this - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object, boolean encode) { - Set set = object == null ? null : object.keySet(); - if (set != null) { - for (String key : set) { - put(key, object.get(key), encode); - } - } - return this; - } - - - - /** - * @param key if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param decode if decode && value instanceof String, value = URLDecoder.decode((String) value, UTF_8) - * @return - */ - public Object get(Object key, boolean decode) { - if (decode) { - if (key instanceof String) { - if (((String) key).endsWith("+") || ((String) key).endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLDecoder.decode((String) key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } - } - Object value = super.get(key); - if (value instanceof String) { - try { - value = URLDecoder.decode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - return value; - } - return super.get(key); - } - - /** - * encode = false - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - public Object put(Object value) { - return put(value, false); - } - /** - * key = value.getClass().getSimpleName() - * @param value must be annotated by {@link APIJSONRequest} - * @param encode - * @return {@link #put(String, Object, boolean)} - */ - public Object put(Object value, boolean encode) { - return put(null, value, encode); - } - /** - * @param key if StringUtil.isNotEmpty(key, true) == false, - *
key = value == null ? null : value.getClass().getSimpleName(); - *
>> if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param value URLEncoder.encode((String) value, UTF_8); - * @param encode if value instanceof String, value = URLEncoder.encode((String) value, UTF_8); - * @return - */ - public Object put(String key, Object value, boolean encode) { - if (StringUtil.isNotEmpty(key, true) == false) { - Class clazz = value == null ? null : value.getClass(); - if (clazz == null || clazz.getAnnotation(APIJSONRequest.class) == null) { - throw new IllegalArgumentException("put StringUtil.isNotEmpty(key, true) == false" + - " && clazz == null || clazz.getAnnotation(APIJSONRequest.class) == null" + - " \n key为空时仅支持 类型被@APIJSONRequest注解 的value !!!" + - " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + - " \n 如果是类似 key[]:{} 结构的请求,建议add(...)方法!"); - } - key = value.getClass().getSimpleName(); - } - if (encode) { - if (key.endsWith("+") || key.endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLEncoder.encode(key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - if (value instanceof String) {//只在value instanceof String时encode key?{@link #get(Object, boolean)}内做不到 - try { - value = URLEncoder.encode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - } - return super.put(key, value); - } - - - - //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final String KEY_ARRAY = "[]"; - - /**判断是否为Array的key - * @param key - * @return - */ - public static boolean isArrayKey(String key) { - return key != null && key.endsWith(KEY_ARRAY); - } - /**判断是否为对应Table的key - * @param key - * @return - */ - public static boolean isTableKey(String key) { - return isWord(key) && bigAlphaPattern.matcher(key.substring(0, 1)).matches(); - } - /**判断是否为词,只能包含字母,数字或下划线 - * @param key - * @return - */ - public static boolean isWord(String key) { - return StringUtil.isNotEmpty(key, false) && namePattern.matcher(key).matches(); - } - //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final String KEY_COLUMN = "@column";//@key关键字都放这个类 - public static final String KEY_GROUP = "@group";//@key关键字都放这个类 - public static final String KEY_HAVING = "@having";//@key关键字都放这个类 - public static final String KEY_ORDER = "@order";//@key关键字都放这个类 - - /**set keys need to be returned - * @param keys key0, key1, key2 ... - * @return {@link #setColumn(String)} - */ - public JSONObject setColumn(String... keys) { - return setColumn(StringUtil.getString(keys, true)); - } - /**set keys need to be returned - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setColumn(String keys) { - put(KEY_COLUMN, keys); - return this; - } - public String getColumn() { - return getString(KEY_COLUMN); - } - - /**set keys for group by - * @param keys key0, key1, key2 ... - * @return {@link #setGroup(String)} - */ - public JSONObject setGroup(String... keys) { - return setGroup(StringUtil.getString(keys, true)); - } - /**set keys for group by - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setGroup(String keys) { - put(KEY_GROUP, keys); - return this; - } - public String getGroup() { - return getString(KEY_GROUP); - } - - /**set keys for having - * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... - * @return {@link #setHaving(String)} - */ - public JSONObject setHaving(String... keys) { - return setHaving(StringUtil.getString(keys, true)); - } - /**set keys for having - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setHaving(String keys) { - put(KEY_HAVING, keys); - return this; - } - public String getHaving() { - return getString(KEY_HAVING); - } - - /**set keys for order by - * @param keys key0, key1+, key2- ... - * @return {@link #setOrder(String)} - */ - public JSONObject setOrder(String... keys) { - return setOrder(StringUtil.getString(keys, true)); - } - /**set keys for order by - * @param keys "key0,key1+,key2-..." - * @return - */ - public JSONObject setOrder(String keys) { - put(KEY_ORDER, keys); - return this; - } - public String getOrder() { - return getString(KEY_ORDER); - } - - - //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //Request,默认encode <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - - /** - * encode = true - * @param value - * @param parts path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... - * @return #put(key+"@", StringUtil.getString(keys, "/"), true) - */ - public Object putPath(String key, String... keys) { - return put(key+"@", StringUtil.getString(keys, "/"), true); - } - - /** - * encode = true - * @param key - * @param isNull - * @return {@link #putNull(String, boolean, boolean)} - */ - public JSONObject putNull(String key, boolean isNull) { - return putNull(key, isNull, true); - } - /** - * @param key - * @param isNull - * @param encode - * @return put(key+"{}", SQL.isNull(isNull), encode); - */ - public JSONObject putNull(String key, boolean isNull, boolean encode) { - put(key+"{}", SQL.isNull(isNull), encode); - return this; - } - /** - * trim = false - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty) { - return putEmpty(key, isEmpty, false); - } - /** - * encode = true - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim) { - return putEmpty(key, isEmpty, trim, true); - } - /** - * @param key - * @param isEmpty - * @param encode - * @return put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim, boolean encode) { - put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - return this; - } - /** - * encode = true - * @param key - * @param compare <=0, >5 ... - * @return {@link #putLength(String, String, boolean)} - */ - public JSONObject putLength(String key, String compare) { - return putLength(key, compare, true); - } - /** - * @param key - * @param compare <=0, >5 ... - * @param encode - * @return put(key+"{}", SQL.length(key) + compare, encode); - */ - public JSONObject putLength(String key, String compare, boolean encode) { - put(key+"{}", SQL.length(key) + compare, encode); - return this; - } - - /**设置搜索 - * type = SEARCH_TYPE_CONTAIN_FULL - * @param key - * @param value - * @return {@link #putSearch(String, String, int)} - */ - public JSONObject putSearch(String key, String value) { - return putSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); - } - /**设置搜索 - * encode = true - * @param key - * @param value - * @param type - * @return {@link #putSearch(String, String, int, boolean)} - */ - public JSONObject putSearch(String key, String value, int type) { - return putSearch(key, value, type, true); - } - /**设置搜索 - * @param key - * @param value - * @param type - * @param encode - * @return put(key+"$", SQL.search(value, type), encode); - */ - public JSONObject putSearch(String key, String value, int type, boolean encode) { - put(key+"$", SQL.search(value, type), encode); - return this; - } - - //Request,默认encode >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java deleted file mode 100644 index 6bd3bce73..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java +++ /dev/null @@ -1,204 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -/**encapsulator for request JSONObject, encode in default cases - * @author Lemon - * @see #toArray - * @use JSONRequest request = new JSONRequest(...); - *
request.put(...);//not a must - *
request.toArray(...);//not a must - */ -public class JSONRequest extends JSONObject { - - private static final long serialVersionUID = -2223023180338466812L; - - public JSONRequest() { - super(); - } - /** - * encode = true - * @param object must be annotated by {@link APIJSONRequest} - * @see {@link #JSONRequest(String, Object)} - */ - public JSONRequest(Object object) { - this(null, object); - } - /** - * encode = true - * @param name - * @param object - * @see {@link #JSONRequest(String, Object, boolean)} - */ - public JSONRequest(String name, Object object) { - this(name, object, true); - } - /** - * @param object must be annotated by {@link APIJSONRequest} - * @param encode - * @see {@link #JSONRequest(String, Object, boolean)} - */ - public JSONRequest(Object object, boolean encode) { - this(null, object, encode); - } - /** - * @param name - * @param object - * @param encode - * @see {@link #put(String, Object, boolean)} - */ - public JSONRequest(String name, Object object, boolean encode) { - this(); - put(name, object, encode); - } - - - - - - - public static final String KEY_TAG = "tag";//只在最外层,最外层用JSONRequest - - public JSONObject setTag(String tag) { - put(KEY_TAG, tag); - return this; - } - public String getTag() { - return getString(KEY_TAG); - } - - - //array object <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final int QUERY_TABLE = 0; - public static final int QUERY_TOTAL = 1; - public static final int QUERY_ALL = 2; - - public static final String KEY_QUERY = "query"; - public static final String KEY_COUNT = "count"; - public static final String KEY_PAGE = "page"; - - /** - * @param query what need to query, Table,total,ALL? - * @return - */ - public JSONRequest setQuery(int query) { - put(KEY_QUERY, query); - return this; - } - public int getQuery() { - return getIntValue(KEY_QUERY); - } - - /** - * @param count - * @return - */ - public JSONRequest setCount(int count) { - put(KEY_COUNT, count); - return this; - } - public int getCount() { - return getIntValue(KEY_COUNT); - } - - /** - * @param page - * @return - */ - public JSONRequest setPage(int page) { - put(KEY_PAGE, page); - return this; - } - public int getPage() { - return getIntValue(KEY_PAGE); - } - //array object >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - // 导致JSONObject add >> get = null - // /** - // * decode = true - // * @param key - // * return {@link #get(Object, boolean)} - // */ - // @Override - // public Object get(Object key) { - // return get(key, true); - // } - - /** - * encode = true - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - @Override - public Object put(Object value) { - return put(value, true); - } - /** - * encode = true - * @param key - * @param value - * return {@link #put(String, Object, boolean)} - */ - @Override - public Object put(String key, Object value) { - return put(key, value, true); - } - - - /**create a parent JSONObject named KEY_ARRAY - * encode = true; - * @param count - * @param page - * @return {@link #toArray(int, int, boolean)} - */ - public JSONRequest toArray(int count, int page) { - return toArray(count, page, true); - } - /**create a parent JSONObject named KEY_ARRAY - * encode = true; - * @param count - * @param page - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, boolean encode) { - return toArray(count, page, null, encode); - } - /**create a parent JSONObject named name+KEY_ARRAY - * encode = true; - * @param count - * @param page - * @param name - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, String name) { - return toArray(count, page, name, true); - } - /**create a parent JSONObject named name+KEY_ARRAY. - * @param count - * @param page - * @param name - * @param encode - * @return {name+KEY_ARRAY : this}. if needs to be put, use {@link #add(com.alibaba.fastjson.JSONObject)} instead - */ - public JSONRequest toArray(int count, int page, String name, boolean encode) { - return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page), encode); - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java deleted file mode 100644 index 40379e2f9..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java +++ /dev/null @@ -1,480 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import static zuo.biao.apijson.StringUtil.bigAlphaPattern; - -import java.util.List; -import java.util.Set; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -/**parser for response JSON String - * @author Lemon - * @see #getList - * @see #toArray - * @use JSONResponse response = new JSONResponse(...); - *
JSONArray array = JSONResponse.toArray(response.getJSONObject(KEY_ARRAY));//not a must - *
User user = JSONResponse.getObject(response, User.class);//not a must - *
List list = JSONResponse.getList(response.getJSONObject("Comment[]"), Comment.class);//not a must - */ -@SuppressWarnings("serial") -public class JSONResponse extends zuo.biao.apijson.JSONObject { - private static final String TAG = "JSONResponse"; - - public JSONResponse() { - super(); - } - public JSONResponse(String json) { - this(parseObject(json)); - } - public JSONResponse(JSONObject object) { - super(format(object)); - } - - //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final int STATUS_SUCCEED = 200; - - - public static final String KEY_ID = "id"; - public static final String KEY_STATUS = "status"; - public static final String KEY_COUNT = "count"; - public static final String KEY_TOTAL = "total"; - public static final String KEY_MESSAGE = "message"; - - /**获取id - * @return - */ - public long getId() { - return getLongValue(KEY_ID); - } - /**获取状态 - * @return - */ - public int getStatus() { - return getIntValue(KEY_STATUS); - } - /**获取数量 - * @return - */ - public int getCount() { - return getIntValue(KEY_COUNT); - } - /**获取数量 - * @return - */ - public int getTotal() { - try { - return getIntValue(KEY_TOTAL); - } catch (Exception e) { - // TODO: handle exception - } - return 0; - } - /**获取信息 - * @return - */ - public String getMessage() { - return getString(KEY_MESSAGE); - } - - /**是否成功 - * @return - */ - public boolean isSucceed() { - return isSucceed(getStatus()); - } - /**是否成功 - * @param status - * @return - */ - public static boolean isSucceed(int status) { - return status == STATUS_SUCCEED; - } - /**是否成功 - * @param response - * @return - */ - public static boolean isSucceed(JSONResponse response) { - return response != null && response.isSucceed(); - } - - /**校验服务端是否存在table - * @return - */ - public boolean isExist() { - return isExist(getCount()); - } - /**校验服务端是否存在table - * @param count - * @return - */ - public static boolean isExist(int count) { - return count > 0; - } - /**校验服务端是否存在table - * @param response - * @return - */ - public static boolean isExist(JSONResponse response) { - return response != null && response.isExist(); - } - - /**获取内部的JSONResponse - * @param key - * @return - */ - public JSONResponse getJSONResponse(String key) { - return getObject(key, JSONResponse.class); - } - //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - - - /** - * key = clazz.getSimpleName() - * @param clazz - * @return - */ - public T getObject(Class clazz) { - return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); - } - /** - * @param key - * @param clazz - * @return - */ - public T getObject(String key, Class clazz) { - return getObject(this, key, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static T getObject(JSONObject object, String key, Class clazz) { - return toObject(object == null ? null : object.getJSONObject(key), clazz); - } - - /** - * @param clazz - * @return - */ - public T toObject(Class clazz) { - return toObject(this, clazz); - } - /** - * @param object - * @param clazz - * @return - */ - public static T toObject(JSONObject object, Class clazz) { - return JSON.parseObject(JSON.toJSONString(object), clazz); - } - - - - - /** - * key = KEY_ARRAY - * @param clazz - * @return - */ - public List getList(Class clazz) { - return getList(KEY_ARRAY, clazz); - } - /** - * arrayObject = this - * @param key - * @param clazz - * @return - */ - public List getList(String key, Class clazz) { - return getList(this, key, clazz); - } - - /** - * key = KEY_ARRAY - * @param object - * @param clazz - * @return - */ - public static List getList(JSONObject object, Class clazz) { - return getList(object, KEY_ARRAY, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static List getList(JSONObject object, String key, Class clazz) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? JSON.parseArray((JSONArray) obj, clazz) : toList((JSONObject) obj, clazz); - } - /** - * @param clazz - * @return - */ - public List toList(Class clazz) { - return toList(this, clazz); - } - /** - * @param arrayObject - * @param clazz - * @return - */ - public static List toList(JSONObject arrayObject, Class clazz) { - return clazz == null ? null : JSON.parseArray(JSON.toJSONString( - toArray(arrayObject, clazz.getSimpleName())), clazz); - } - - /** - * key = KEY_ARRAY - * @param className - * @return - */ - public JSONArray getArray(String className) { - return getArray(KEY_ARRAY, className); - } - /** - * @param key - * @param className - * @return - */ - public JSONArray getArray(String key, String className) { - return getArray(this, key, className); - } - /** - * @param object - * @param key - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String className) { - return getArray(object, KEY_ARRAY, className); - } - /** - * key = KEY_ARRAY - * @param object - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String key, String className) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? (JSONArray) obj : toArray((JSONObject) obj, className); - } - - /** - * @param className - * @return - */ - public JSONArray toArray(String className) { - return toArray(this, className); - } - /**{0:{Table:{}}, 1:{Table:{}}...} 转化为 [{Table:{}}, {Table:{}}] - * array.set(index, isContainer ? value : value.getJSONObject(className)); - * @param arrayObject - * @param className className.equals(Table) ? {Table:{Content}} => {Content} - * @return - */ - public static JSONArray toArray(JSONObject arrayObject, String className) { - Set set = arrayObject == null ? null : arrayObject.keySet(); - if (set == null || set.isEmpty()) { - return null; - } - - // [{...},{...},...] - String parentString = StringUtil.getTrimedString(JSON.toJSONString(arrayObject)); - if (parentString.isEmpty()) { - return null; - } - if (parentString.startsWith("[")) { - if (parentString.endsWith("]") == false) { - parentString += "]"; - } - return JSON.parseArray(parentString); - } - - //{"0":{Table:{...}}, "1":{Table:{...}}...} - - className = StringUtil.getTrimedString(className); - boolean isContainer = true; - - JSONArray array = new JSONArray(set.size()); - JSONObject value; - boolean isFirst = true; - int index; - for (String key : set) {//0, 1, 2,... - value = StringUtil.isNumer(key) == false ? null : arrayObject.getJSONObject(key);// Table:{} - if (value != null) { - try { - index = Integer.valueOf(0 + key); - if (isFirst && isTableKey(className) && value.containsKey(className)) {// 判断是否需要提取table - isContainer = false; - } - array.set(index, isContainer ? value : value.getJSONObject(className)); - } catch (Exception e) { - e.printStackTrace(); - } - } - isFirst = false; - } - return array; - } - - - - // /** - // * @return - // */ - // public JSONObject format() { - // return format(this); - // } - /**将Item[]:[{Table:{}}, {Table:{}}...] 或 Item[]:{0:{Table:{}}, 1:{Table:{}}...} - * 转化为 itemList:[{Table:{}}, {Table:{}}],如果 Item.equals(Table),则将 {Table:{Content}} 转化为 {Content} - * @param target - * @param response - * @return - */ - public static JSONObject format(final JSONObject response) { - //太长查看不方便,不如debug Log.i(TAG, "format response = \n" + JSON.toJSONString(response)); - if (response == null || response.isEmpty()) { - Log.i(TAG, "format response == null || response.isEmpty() >> return response;"); - return response; - } - JSONObject transferredObject = new JSONObject(true); - - Set set = response.keySet(); - if (set != null) { - - Object value; - String arrayKey; - for (String key : set) { - value = response.get(key); - - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredObject.put(replaceArray(key), format(key, (JSONArray) value)); - } else if (value instanceof JSONObject) {//APIJSON Array转为常规JSONArray - if (isArrayKey(key)) {//APIJSON Array转为常规JSONArray - arrayKey = key.substring(0, key.lastIndexOf(KEY_ARRAY)); - transferredObject.put(getArrayKey(getSimpleName(arrayKey)) - , format(key, toArray((JSONObject) value, arrayKey)));//需要将name:alias传至toArray - } else {//常规JSONObject,往下一级提取 - transferredObject.put(getSimpleName(key), format((JSONObject) value)); - } - } else {//其它Object,直接填充 - transferredObject.put(getSimpleName(key), value); - } - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredObject = " + JSON.toJSONString(transferredObject)); - return transferredObject; - } - - /** - * @param responseArray - * @return - */ - public static JSONArray format(String name, final JSONArray responseArray) { - //太长查看不方便,不如debug Log.i(TAG, "format responseArray = \n" + JSON.toJSONString(responseArray)); - if (responseArray == null || responseArray.isEmpty()) { - Log.i(TAG, "format responseArray == null || responseArray.isEmpty() >> return response;"); - return responseArray; - } - int index = name == null ? -1 : name.lastIndexOf(KEY_ARRAY); - String className = index < 0 ? "" : name.substring(0, index); - - JSONArray transferredArray = new JSONArray(); - - Object value; - boolean isContainer = true; - boolean isFirst = true; - for (int i = 0; i < responseArray.size(); i++) { - value = responseArray.get(i); - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredArray.add(format(null, (JSONArray) value)); - } else if (value instanceof JSONObject) {//JSONObject,往下一级提取 - //判断是否需要提取child - if (isFirst && isTableKey(className) && ((JSONObject) value).containsKey(className)) { - isContainer = false; - } - //直接添加child 或 添加提取出的child - transferredArray.add(format(isContainer ? (JSONObject)value : ((JSONObject)value).getJSONObject(className) )); - isFirst = false; - } else {//其它Object,直接填充 - transferredArray.add(responseArray.get(i)); - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredArray = " + JSON.toJSONString(transferredArray)); - return transferredArray; - } - - /**替换key+KEY_ARRAY为keyList - * @param key - * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} - */ - public static String replaceArray(String key) { - if (isArrayKey(key)) { - key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); - } - return getSimpleName(key); - } - /**获取列表变量名 - * @param key => StringUtil.getNoBlankString(key) - * @return empty ? "list" : key + "List" 且首字母小写 - */ - public static String getArrayKey(String key) { - key = StringUtil.getNoBlankString(key); - if (key.isEmpty()) { - return "list"; - } - - String first = key.substring(0, 1); - if (bigAlphaPattern.matcher(first).matches()) { - key = first.toLowerCase() + key.substring(1, key.length()); - } - return key + "List"; - } - - /**获取简单名称 - * @param fullName name 或 name:alias - * @return name > name; name:alias > alias - */ - public static String getSimpleName(String fullName) { - //key:alias -> alias; key:alias[] -> alias[] - int index = fullName == null ? -1 : fullName.indexOf(":"); - if (index >= 0) { - fullName = fullName.substring(index + 1); - } - return fullName; - } - - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java deleted file mode 100644 index 6a25809d1..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java +++ /dev/null @@ -1,56 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出一个POST_GET方法 - * @author Lemon - */ -public enum RequestMethod { - - /** - * 常规获取数据方式 - */ - GET, - - /** - * 检查,默认是非空检查,返回数据总数 - */ - HEAD, - - /** - * 通过POST来GET数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 - */ - POST_GET, - - /** - * 通过POST来HEAD数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 - */ - POST_HEAD, - - /** - * 新增(或者说插入)数据 - */ - POST, - - /** - * 修改数据,只修改传入字段对应的值 - */ - PUT, - - /** - * 删除数据 - */ - DELETE -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONTest.iml b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONTest.iml deleted file mode 100644 index 1a46b0589..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONTest.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/Test.iml b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/Test.iml deleted file mode 100644 index 29df7991d..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/Test.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/app.iml b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/app.iml deleted file mode 100644 index 892b4e68b..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/app.iml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/BaseModel.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/BaseModel.java deleted file mode 100644 index 8f6d961e0..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/BaseModel.java +++ /dev/null @@ -1,196 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.model; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Map; - -/**base model for reduce model codes - * @author Lemon - * @use extends BaseModel - */ -@SuppressWarnings("serial") -public abstract class BaseModel implements Serializable { - - private Long id; - private Long date; - - public Long getId() { - return id; - } - public BaseModel setId(Long id) { - this.id = id; - return this; - } - public Long getDate() { - return date; - } - public BaseModel setDate(Long date) { - this.date = date; - return this; - } - - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否为空 - * @param collection - * @return - */ - public static boolean isEmpty(Collection collection) { - return collection == null || collection.isEmpty(); - } - /**判断map是否为空 - * @param - * @param - * @param map - * @return - */ - public static boolean isEmpty(Map map) { - return map == null || map.isEmpty(); - } - //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - //判断是否包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**判断collection是否包含object - * @param collection - * @param object - * @return - */ - public static boolean isContain(Collection collection, T object) { - return collection != null && collection.contains(object); - } - /**判断map是否包含key - * @param - * @param - * @param map - * @param key - * @return - */ - public static boolean isContainKey(Map map, K key) { - return map != null && map.containsKey(key); - } - /**判断map是否包含value - * @param - * @param - * @param map - * @param value - * @return - */ - public static boolean isContainValue(Map map, V value) { - return map != null && map.containsValue(value); - } - //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取数量 - * @param - * @param array - * @return - */ - public static int count(T[] array) { - return array == null ? 0 : array.length; - } - /**获取数量 - * @param - * @param collection collection, Vector, Set等都是Collection的子类 - * @return - */ - public static int count(Collection collection) { - return collection == null ? 0 : collection.size(); - } - /**获取数量 - * @param - * @param - * @param map - * @return - */ - public static int count(Map map) { - return map == null ? 0 : map.size(); - } - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取 - * @param - * @param array - * @return - */ - public static T get(T[] array, int position) { - return position < 0 || position >= count(array) ? null : array[position]; - } - /**获取 - * @param - * @param collection List, Vector, Set等都是Collection的子类 - * @return - */ - @SuppressWarnings("unchecked") - public static T get(Collection collection, int position) { - return (T) (collection == null ? null : get(collection.toArray(), position)); - } - /**获取 - * @param - * @param - * @param map null ? null - * @param key null ? null : map.get(key); - * @return - */ - public static V get(Map map, K key) { - return key == null || map == null ? null : map.get(key); - } - //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取非空值 - * @param value - * @return - */ - public static boolean value(Boolean value) { - return value == null ? false : value; - } - /**获取非空值 - * @param value - * @return - */ - public static int value(Integer value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static long value(Long value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static float value(Float value) { - return value == null ? 0 : value; - } - /**获取非空值 - * @param value - * @return - */ - public static double value(Double value) { - return value == null ? 0 : value; - } - //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Comment.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Comment.java deleted file mode 100644 index 4a6199d04..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Comment.java +++ /dev/null @@ -1,72 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.model; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.RequestMethod; - -/**评论类 - * @author Lemon - */ -@APIJSONRequest( - method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, - DELETE = "{necessaryColumns:id}" - ) -public class Comment extends BaseModel { - private static final long serialVersionUID = -1011007127735372824L; - - private Long toId; - private Long userId; - private Long momentId; - private String content; - public Comment() { - super(); - } - public Comment(long id) { - this(); - setId(id); - } - - - public Long getToId() { - return toId; - } - public Comment setToId(Long toId) { - this.toId = toId; - return this; - } - public Long getUserId() { - return userId; - } - public Comment setUserId(Long userId) { - this.userId = userId; - return this; - } - public Long getMomentId() { - return momentId; - } - public Comment setMomentId(Long momentId) { - this.momentId = momentId; - return this; - } - public String getContent() { - return content; - } - public Comment setContent(String content) { - this.content = content; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Moment.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Moment.java deleted file mode 100644 index 583909a64..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Moment.java +++ /dev/null @@ -1,89 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.model; - -import java.util.List; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.RequestMethod; - -/**作品类 - * @author Lemon - */ -@APIJSONRequest( - method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, - DELETE = "{necessaryColumns:id}" - ) -public class Moment extends BaseModel { - private static final long serialVersionUID = -7437225320551780084L; - - private Long userId; - private String content; - private String picture; - private List pictureList; - private List praiseUserIdList; - private List commentIdList; - - public Moment() { - super(); - } - public Moment(long id) { - this(); - setId(id); - } - - public Long getUserId() { - return userId; - } - public Moment setUserId(Long userId) { - this.userId = userId; - return this; - } - public String getContent() { - return content; - } - public Moment setContent(String content) { - this.content = content; - return this; - } - public String getPicture() { - return picture; - } - public Moment setPicture(String picture) { - this.picture = picture; - return this; - } - public List getPictureList() { - return pictureList; - } - public Moment setPictureList(List pictureList) { - this.pictureList = pictureList; - return this; - } - public List getPraiseUserIdList() { - return praiseUserIdList; - } - public Moment setPraiseUserIdList(List praiseUserIdList) { - this.praiseUserIdList = praiseUserIdList; - return this; - } - public List getCommentIdList() { - return commentIdList; - } - public Moment setCommentIdList(List commentIdList) { - this.commentIdList = commentIdList; - return this; - } -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Wallet.java b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Wallet.java deleted file mode 100644 index 29dcca3de..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/Wallet.java +++ /dev/null @@ -1,63 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.model; - -import java.math.BigDecimal; - -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.RequestMethod; - -/**钱包类 - * @author Lemon - */ -@APIJSONRequest( - method = {RequestMethod.POST_GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, - POST_GET = "{Wallet:{disallowColumns:!, necessaryColumns:userId}, necessaryColumns:currentUserId,loginPassword}", - DELETE = "{necessaryColumns:id}" - ) -public class Wallet extends BaseModel { - private static final long serialVersionUID = 4298571449155754300L; - - public BigDecimal balance; - - private Long userId; - - /**默认构造方法,JSON等解析时必须要有 - */ - public Wallet() { - super(); - } - public Wallet(long id) { - this(); - setId(id); - } - - public Long getUserId() { - return userId; - } - public Wallet setUserId(Long userId) { - this.userId = userId; - return this; - } - - public BigDecimal getBalance() { - return balance; - } - public Wallet setBalance(BigDecimal balance) { - this.balance = balance; - return this; - } - -} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/local.properties b/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/local.properties deleted file mode 100644 index 0394cc101..000000000 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/local.properties +++ /dev/null @@ -1,12 +0,0 @@ -## This file is automatically generated by Android Studio. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. -# -# Location of the SDK. This is only used by Gradle. -# For customization when using a Version Control System, please read the -# header note. -#Wed Jan 25 15:53:14 CST 2017 -ndk.dir=/Users/Tommy/Library/Android/sdk/ndk-bundle -sdk.dir=/Users/Tommy/Library/Android/sdk diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/Controller.java b/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/Controller.java deleted file mode 100755 index de10f867f..000000000 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/Controller.java +++ /dev/null @@ -1,690 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server; - -import static zuo.biao.apijson.RequestMethod.DELETE; -import static zuo.biao.apijson.RequestMethod.GET; -import static zuo.biao.apijson.RequestMethod.HEAD; -import static zuo.biao.apijson.RequestMethod.POST; -import static zuo.biao.apijson.RequestMethod.POST_GET; -import static zuo.biao.apijson.RequestMethod.POST_HEAD; -import static zuo.biao.apijson.RequestMethod.PUT; - -import java.util.Random; -import java.util.concurrent.TimeoutException; - -import javax.servlet.http.HttpSession; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.alibaba.fastjson.JSONObject; - -import apijson.demo.server.model.BaseModel; -import apijson.demo.server.model.Comment; -import apijson.demo.server.model.Login; -import apijson.demo.server.model.Moment; -import apijson.demo.server.model.Password; -import apijson.demo.server.model.User; -import apijson.demo.server.model.UserPrivacy; -import apijson.demo.server.model.Verify; -import apijson.demo.server.model.Wallet; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONResponse; -import zuo.biao.apijson.Log; -import zuo.biao.apijson.RequestMethod; -import zuo.biao.apijson.StringUtil; -import zuo.biao.apijson.server.JSONRequest; -import zuo.biao.apijson.server.Parser; -import zuo.biao.apijson.server.exception.ConditionErrorException; -import zuo.biao.apijson.server.exception.ConflictException; -import zuo.biao.apijson.server.exception.NotExistException; -import zuo.biao.apijson.server.exception.OutOfRangeException; - -/**request receiver and controller - *
如果用在金融等对安全要求很高的领域,get和head可以测试期间使用明文的HTTP GET,上线版改用非明文的HTTP POST,兼顾系统安全与开发效率。 - *
get,head等接口都用HTTP GET方法请求,post,put,delete等接口都用HTTP POST方法请求。 - *
这样做是为了前端和客户端方便,只需要做GET和POST请求。也可以改用实际对应的方法。 - * @author Lemon - */ -@RestController -@RequestMapping("") -public class Controller { - private static final String TAG = "Controller"; - - //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#GET} - */ - @RequestMapping("get/{request}") - public String get(@PathVariable String request, HttpSession session) { - return new Parser(GET).setSession(session).parse(request); - } - - /**计数 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#HEAD} - */ - @RequestMapping("head/{request}") - public String head(@PathVariable String request, HttpSession session) { - return new Parser(HEAD).setSession(session).parse(request); - } - - /**用POST方法GET,request和response都非明文,浏览器看不到,用于对安全性要求高的GET请求 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#POST_GET} - */ - @RequestMapping(value = "post_get", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String post_get(@RequestBody String request, HttpSession session) { - return new Parser(POST_GET).setSession(session).parse(request); - } - - /**用POST方法HEAD,request和response都非明文,浏览器看不到,用于对安全性要求高的HEAD请求 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#POST_HEAD} - */ - @RequestMapping(value = "post_head", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String post_head(@RequestBody String request, HttpSession session) { - return new Parser(POST_HEAD).setSession(session).parse(request); - } - - /**新增 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#POST} - */ - @RequestMapping(value = "post", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String post(@RequestBody String request, HttpSession session) { - return new Parser(POST).setSession(session).parse(request); - } - - /**修改 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#PUT} - */ - @RequestMapping(value = "put", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String put(@RequestBody String request, HttpSession session) { - return new Parser(PUT).setSession(session).parse(request); - } - - /**删除 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#DELETE} - */ - @RequestMapping(value = "delete", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String delete(@RequestBody String request, HttpSession session) { - return new Parser(DELETE).setSession(session).parse(request); - } - - //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - - - - - - - - - - public static final String USER_; - public static final String MOMENT_; - public static final String COMMENT_; - public static final String WALLET_; - public static final String PASSWORD_; - public static final String USER_PRIVACY_; - public static final String VERIFY_; - static { - USER_ = User.class.getSimpleName(); - MOMENT_ = Moment.class.getSimpleName(); - COMMENT_ = Comment.class.getSimpleName(); - WALLET_ = Wallet.class.getSimpleName(); - PASSWORD_ = Password.class.getSimpleName(); - USER_PRIVACY_ = UserPrivacy.class.getSimpleName(); - VERIFY_ = Verify.class.getSimpleName(); - } - - public static final String TOTAL = JSONResponse.KEY_TOTAL; - - public static final String RANGE = "range"; - - public static final String ID = "id"; - public static final String USER_ID = "userId"; - public static final String CURRENT_USER_ID = "currentUserId"; - - public static final String NAME = "name"; - public static final String PHONE = "phone"; - public static final String PASSWORD = "password"; - public static final String LOGIN_PASSWORD = "loginPassword"; - public static final String PAY_PASSWORD = "payPassword"; - public static final String OLD_PASSWORD = "oldPassword"; - public static final String VERIFY = "verify"; - - public static final String SEX = "sex"; - public static final String TYPE = "type"; - public static final String CONTENT = "content"; - - - - - public static final String DATE_UP = "date+";//同 "date ASC" - public static final String DATE_DOWN = "date-";//同 "date DESC" - - public static final String ID_AT = ID + "@"; - public static final String USER_ID_AT = USER_ID + "@"; - public static final String MOMENT_ID_AT = "momentId@"; - public static final String COMMENT_ID_AT = "commentId@"; - - public static final String ID_IN = ID + "{}"; - public static final String USER_ID_IN = USER_ID + "{}"; - public static final String MOMENT_ID_IN = "momentId{}"; - public static final String COMMENT_ID_IN = "commentId{}"; - - public static final String NAME_SEARCH = NAME + "$"; - public static final String PHONE_SEARCH = PHONE + "$"; - public static final String CONTENT_SEARCH = CONTENT + "$"; - - - - public static final String COLUMNS_USER_SIMPLE = "id,name"; - public static final String COLUMNS_USER = "id,sex,name,head"; - - - - - /**生成验证码,修改为post请求 - * @param phone - * @return - */ - @RequestMapping(value = "post/verify", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject postVerify(@RequestBody String request) { - JSONObject requestObject; - String phone; - try { - requestObject = Parser.parseRequest(request, POST); - phone = requestObject.getString(PHONE); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - new Parser(DELETE, true).parse(newVerifyRequest(phone, null)); - - JSONObject response = new Parser(POST, true).parseResponse( - newVerifyRequest(phone, "" + (new Random().nextInt(9999) + 1000))); - - JSONObject verify = null; - try { - verify = response.getJSONObject(VERIFY_); - } catch (Exception e) { - // TODO: handle exception - } - if (verify == null || JSONResponse.isSucceed(verify.getIntValue(JSONResponse.KEY_CODE)) == false) { - new Parser(DELETE, true).parseResponse(new JSONRequest(new Verify(phone))); - return response; - } - - //TODO 这里直接返回验证码,方便测试。实际上应该只返回成功信息,验证码通过短信发送 - JSONObject object = new JSONObject(); - object.put(PHONE, phone); - return getVerify(JSON.toJSONString(object)); - } - - /**获取验证码 - * @param phone - * @return - */ - @RequestMapping(value = "post_get/verify", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject getVerify(@RequestBody String request) { - JSONObject requestObject; - String phone; - try { - requestObject = Parser.parseRequest(request, POST_GET); - phone = requestObject.getString(PHONE); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - return new Parser(POST_GET, true).parseResponse(newVerifyRequest(phone, null)); - } - - /**校验验证码 - * @param phone - * @param code - * @return - */ - @RequestMapping(value = "post_head/verify", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject headVerify(@RequestBody String request) { - String phone; - String verify; - try { - JSONObject requestObject = Parser.parseRequest(request, POST_HEAD); - phone = requestObject.getString(PHONE); - verify = requestObject.getString(VERIFY); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - return headVerify(phone, verify); - } - - /**校验验证码 - * @param phone - * @param vfy - * @return - */ - public JSONObject headVerify(String phone, String vfy) { - JSONResponse response = new JSONResponse( - new Parser(POST_GET, true).parseResponse( - new JSONRequest(new Verify(phone)).setTag(VERIFY_) - ) - ); - Verify verify = response.getObject(Verify.class); - if (verify == null) { - return Parser.newErrorResult(new NullPointerException("验证码为空!")); - } - - //验证码过期 - if (System.currentTimeMillis() > (60000 + BaseModel.value(verify.getDate()))) { - new Parser(DELETE, true).parseResponse( - new JSONRequest(new Verify(phone)).setTag(VERIFY_) - ); - return Parser.newErrorResult(new TimeoutException("验证码已过期!")); - } - - return new JSONResponse( - new Parser(POST_HEAD, true).parseResponse( - new JSONRequest(new Verify(phone, vfy)) - ) - ); - } - - - /**新建一个验证码请求 - * @param phone - * @param verify - * @return - */ - private JSONObject newVerifyRequest(String phone, String verify) { - return new JSONRequest(new Verify(phone, verify)).setTag(VERIFY_); - } - - - - /**用户登录 - * @param request 只用String,避免encode后未decode - * @return - */ - @RequestMapping(value = "login", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject login(@RequestBody String request, HttpSession session) { - JSONObject requestObject = null; - try { - requestObject = Parser.parseRequest(request, POST); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - String typeString = requestObject.getString(TYPE);//登录类型 - String phone = requestObject.getString(PHONE);//手机 - String password = requestObject.getString(PASSWORD);//密码 - - //判断手机号是否合法 - if (StringUtil.isPhone(phone) == false) { - return Parser.newErrorResult(new IllegalArgumentException("手机号不合法!")); - } - - //判断密码是否合法 - if ("1".equals(typeString)) { - if (StringUtil.isVerify(password) == false) { - return Parser.newErrorResult(new IllegalArgumentException("验证码不合法!")); - } - } else { - if (StringUtil.isPassword(password) == false) { - return Parser.newErrorResult(new IllegalArgumentException("密码不合法!")); - } - } - - //手机号是否已注册 - JSONObject phoneResponse = new Parser(POST_HEAD, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - JSONResponse response = new JSONResponse(phoneResponse).getJSONResponse(USER_PRIVACY_); - if (JSONResponse.isSucceed(response) == false) { - return response; - } - if(JSONResponse.isExist(response) == false) { - return Parser.newErrorResult(new NotExistException("手机号未注册")); - } - - //根据phone获取User - JSONObject privacyResponse = new Parser(POST_GET, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - response = new JSONResponse(privacyResponse); - - UserPrivacy userPrivacy = response == null ? null : response.getObject(UserPrivacy.class); - long userId = userPrivacy == null ? 0 : BaseModel.value(userPrivacy.getId()); - if (userId <= 0) { - return privacyResponse; - } - - //校验凭证 - int type = Integer.valueOf(0 + StringUtil.getNumber(typeString)); - if (type == Login.TYPE_PASSWORD) {//password密码登录 - response = new JSONResponse( - new Parser(POST_HEAD, true).parseResponse( - new JSONRequest(new UserPrivacy(userId).setPassword(password)) - ) - ); - } else {//verify手机验证码登录 - response = new JSONResponse(headVerify(phone, password)); - } - if (JSONResponse.isSucceed(response) == false) { - return response; - } - response = response.getJSONResponse(type == Login.TYPE_PASSWORD ? USER_PRIVACY_ : VERIFY_); - if (JSONResponse.isExist(response) == false) { - return Parser.newErrorResult(new ConditionErrorException("账号或密码错误")); - } - - response = new JSONResponse( - new Parser(POST_GET, true).parseResponse( - new JSONRequest(new User(userId)) - ) - ); - User user = response.getObject(User.class); - if (user == null || BaseModel.value(user.getId()) != userId) { - return Parser.newErrorResult(new NullPointerException("服务器内部错误")); - } - - //登录状态保存至session - session.setAttribute(USER_ID, userId);//用户id - session.setAttribute(TYPE, type);//登录方式 - session.setAttribute(USER_, user);//用户 - session.setAttribute(USER_PRIVACY_, userPrivacy);//用户隐私信息 - session.setMaxInactiveInterval(1*60);//设置session过期时间 - - return response; - } - - /**退出登录,清空session - * @param session - * @return - */ - @RequestMapping(value = "logout", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject logout(HttpSession session) { - long userId = AccessVerifier.getUserId(session);//必须在session.invalidate();前! - session.invalidate(); - - JSONObject result = Parser.newSuccessResult(); - JSONObject user = Parser.newSuccessResult(); - user.put(ID, userId); - result.put(USER_, user); - - return result; - } - - - /**注册 - * @param request 只用String,避免encode后未decode - * @return - */ - @RequestMapping(value = "register", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject register(@RequestBody String request) { - JSONObject requestObject = null; - try { - requestObject = Parser.getCorrectRequest(POST, Parser.parseRequest(request, POST)); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - String phone = requestObject.getString(PHONE); - String password = StringUtil.getString(requestObject.getString(PASSWORD)); - String verify = StringUtil.getString(requestObject.getString(VERIFY)); - requestObject.remove(PHONE); - requestObject.remove(PASSWORD); - requestObject.remove(VERIFY); - - if (StringUtil.isPhone(phone) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.phone: " + phone + " 不合法!")); - } - if (StringUtil.isPassword(password) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.password: " + password + " 不合法!不能小于6个字符!")); - } - if (StringUtil.isVerify(verify) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.verify: " + verify + " 不合法!不能小于6个字符!")); - } - - - JSONResponse response = new JSONResponse(headVerify(phone, verify)); - if (JSONResponse.isSucceed(response) == false) { - return response; - } - - //手机号或验证码错误 - if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { - return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); - } - - //验证手机号是否已经注册 - JSONObject check = new Parser(POST_HEAD, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - JSONObject checkUser = check == null ? null : check.getJSONObject(USER_PRIVACY_); - if (checkUser == null || checkUser.getIntValue(JSONResponse.KEY_COUNT) > 0) { - return Parser.newErrorResult(new ConflictException("手机号" + phone + "已经注册")); - } - - //生成User - JSONObject result = new Parser(POST, true).parseResponse(requestObject); - response = new JSONResponse(result); - if (JSONResponse.isSucceed(response) == false) { - return result; - } - - response = response.getJSONResponse(USER_); - long userId = response == null ? 0 : response.getId(); - - //生成UserPrivacy - response = new JSONResponse( - new Parser(POST, true).parseResponse( - new JSONRequest( - new UserPrivacy(userId).setPhone(phone).setPassword(password) - ) - ) - ); - if (JSONResponse.isSucceed(response.getJSONResponse(USER_PRIVACY_)) == false) {//创建失败,删除新增的无效User和userPrivacy - - new Parser(DELETE, true).parseResponse( - new JSONRequest( - new User(userId) - ) - ); - - new Parser(DELETE, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - - return Parser.extendErrorResult(result, new Exception("服务器内部错误")); - } - - return result; - } - - - /**设置密码 - * @param request 只用String,避免encode后未decode - * @return - */ - @RequestMapping(value = "put/password", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject putPassword(@RequestBody String request){ - JSONObject requestObject = null; - try { - requestObject = Parser.parseRequest(request, POST); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - String phone = requestObject.getString(PHONE); - String password = StringUtil.getString(requestObject.getString(PASSWORD)); - String verify = StringUtil.getString(requestObject.getString(VERIFY)); - - if (StringUtil.isPhone(phone) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.phone: " + phone + " 不合法!")); - } - if (StringUtil.isPassword(password) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.password: " + password + " 不合法!不能小于6个字符!")); - } - if (StringUtil.isVerify(verify) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.verify: " + verify + " 不合法!不能小于6个字符!")); - } - - //校验验证码 - JSONResponse response = new JSONResponse(headVerify(phone, requestObject.getString(VERIFY))); - if (JSONResponse.isSucceed(response) == false) { - return response; - } - //手机号或验证码错误 - if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { - return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); - } - - response = new JSONResponse( - new Parser(GET, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ) - ); - UserPrivacy privacy = response.getObject(UserPrivacy.class); - long userId = privacy == null ? 0 : privacy.getId(); - //修改密码 - return new Parser(PUT, true).parseResponse( - new JSONRequest( - new UserPrivacy(userId).setPassword(password) - ) - ); - } - - - - /**充值/提现 - * @param request 只用String,避免encode后未decode - * @param session - * @return - */ - @RequestMapping(value = "put/balance", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject putBalance(@RequestBody String request, HttpSession session) { - JSONObject requestObject = null; - try { - AccessVerifier.verifyLogin(session); - requestObject = Parser.getCorrectRequest(PUT, Parser.parseRequest(request, PUT)); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - //验证密码<<<<<<<<<<<<<<<<<<<<<<< - - JSONObject pwdObj = requestObject.getJSONObject(PASSWORD_); - requestObject.remove(PASSWORD_); - if (pwdObj == null || pwdObj.getIntValue(TYPE) != Password.TYPE_PAY) { - return Parser.extendErrorResult(requestObject, new ConditionErrorException("Password type必须是支付类型!")); - } - - JSONResponse response = new JSONResponse( - new Parser(POST_HEAD, true).setSession(session).parseResponse( - new JSONRequest(PASSWORD_, pwdObj) - ) - ); - response = response.getJSONResponse(PASSWORD_); - if (response == null || response.isExist() == false) { - return Parser.extendErrorResult(requestObject, new ConditionErrorException("支付密码错误!")); - } - - //验证密码>>>>>>>>>>>>>>>>>>>>>>>> - - - //验证金额范围<<<<<<<<<<<<<<<<<<<<<<< - - JSONObject wallet = requestObject.getJSONObject(WALLET_); - long id = wallet == null ? null : wallet.getLong(ID); - if (id <= 0) { - return Parser.extendErrorResult(requestObject, new ConditionErrorException("请设置Wallet及内部的id!")); - } - - double change = wallet.getDoubleValue("balance+"); - if (change == 0) { - return Parser.extendErrorResult(requestObject, new OutOfRangeException("balance+的值不能为0!")); - } - if (Math.abs(change) > 10000) { - return Parser.extendErrorResult(requestObject, new OutOfRangeException("单次 充值/提现 的金额不能超过10000元!")); - } - - //验证金额范围>>>>>>>>>>>>>>>>>>>>>>>> - - if (change < 0) {//提现 - response = new JSONResponse( - new Parser(POST_GET, true).parseResponse( - new JSONRequest( - new Wallet(id).setUserId(AccessVerifier.getUserId(session)) - ) - ) - ); - Wallet w = response == null ? null : response.getObject(Wallet.class); - if (w == null) { - return Parser.extendErrorResult(requestObject, new Exception("服务器内部错误!")); - } - - if (w.getBalance() == null || w.getBalance().doubleValue() < -change) { - return Parser.extendErrorResult(requestObject, new OutOfRangeException("余额不足!")); - } - } - - //不免验证,里面会验证身份 - return new Parser(PUT).setSession(session).parseResponse(requestObject); - } - - -} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Password.java b/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Password.java deleted file mode 100644 index f0c9b8c48..000000000 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Password.java +++ /dev/null @@ -1,94 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import static zuo.biao.apijson.RequestRole.ADMIN; -import static zuo.biao.apijson.RequestRole.LOGIN; -import static zuo.biao.apijson.RequestRole.OWNER; -import static zuo.biao.apijson.RequestRole.UNKNOWN; - -import zuo.biao.apijson.MethodAccess; -import zuo.biao.apijson.StringUtil; - -/**密码类,已用UserPrivacy替代 - * @author Lemon - * @see - *
POST_HEAD:
-{
- "Password":{
-     "disallow":"!",
-     "necessary":"id,type"
- }
-}
- * 
- *
PUT:put/loginPassword, put/payPassword
-{
-    "Password":{
-        "disallow":"!",
-        "necessary":"id,type,password"
-    },
-    "necessary":"oldPassword"
-}
- * 
- */ -@Deprecated -@MethodAccess( - GET = {}, - HEAD = {}, - POST_HEAD = {OWNER, ADMIN}, - POST = {UNKNOWN, LOGIN, OWNER, ADMIN} - ) -public class Password extends BaseModel { - private static final long serialVersionUID = 1L; - - public static final int TYPE_LOGIN = 0; - public static final int TYPE_PAY = 1; - - private Integer type; - private String password; - - public Password() { - super(); - } - public Password(String phone) { - this(); - setPhone(phone); - } - public Password(String phone, String password) { - this(phone); - setPassword(password); - } - - public Password setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } - - public Integer getType() { - return type; - } - public Password setType(Integer type) { - this.type = type; - return this; - } - public String getPassword() { - return password; - } - public Password setPassword(String password) { - this.password = password; - return this; - } - -} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Wallet.java b/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Wallet.java deleted file mode 100644 index c70aa7e37..000000000 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Wallet.java +++ /dev/null @@ -1,101 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import static zuo.biao.apijson.RequestRole.ADMIN; -import static zuo.biao.apijson.RequestRole.OWNER; - -import java.math.BigDecimal; - -import zuo.biao.apijson.MethodAccess; - -/**钱包类,已用UserPrivacy替代 - * @author Lemon - * @see - *
POST_GET:
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
- *
POST:post/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
PUT:put/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id,balance+"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
DELETE:delete/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- */ -@Deprecated -@MethodAccess( - GET = {}, - HEAD = {}, - POST_GET = {OWNER, ADMIN}, - POST_HEAD = {OWNER, ADMIN}, - POST = {ADMIN}, - DELETE = {ADMIN} - ) -public class Wallet extends BaseModel { - private static final long serialVersionUID = 1L; - - public BigDecimal balance; - - /**默认构造方法,JSON等解析时必须要有 - */ - public Wallet() { - super(); - } - public Wallet(long id) { - this(); - setId(id); - } - - - public Wallet setUserId(long userId) { - setId(userId); - return this; - } - - public BigDecimal getBalance() { - return balance; - } - public Wallet setBalance(BigDecimal balance) { - this.balance = balance; - return this; - } - -} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONObject.java deleted file mode 100644 index 4d3581764..000000000 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONObject.java +++ /dev/null @@ -1,453 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import static zuo.biao.apijson.StringUtil.UTF_8; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Set; - -/**use this class instead of com.alibaba.fastjson.JSONObject, not encode in default cases - * @author Lemon - */ -public class JSONObject extends com.alibaba.fastjson.JSONObject { - private static final long serialVersionUID = 1L; - - /**ordered - */ - public JSONObject() { - super(true); - } - /**transfer Object to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(Object, boolean)} - */ - public JSONObject(Object object) { - this(object, false); - } - /**transfer Object to JSONObject - * @param object - * @param encode - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(Object object, boolean encode) { - this(toJSONString(object), encode); - } - /**parse JSONObject with JSON String - * encode = false; - * @param json - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(String json) { - this(json, false); - } - /**parse JSONObject with JSON String - * @param json - * @param encode - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(String json, boolean encode) { - this(parseObject(json), encode); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object) { - this(object, false); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * @param object - * @param encode - * @see {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object, boolean encode) { - this(); - add(object, encode); - } - - - - - /**put key-value in object into this - * encode = false; - * @param object - * @return {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object) { - return add(object, false); - } - /**put key-value in object into this - * @param object - * @param encode - * @return this - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object, boolean encode) { - //TODO putAll(object); - - Set set = object == null ? null : object.keySet(); - if (set != null) { - for (String key : set) { - put(key, object.get(key), encode); - } - } - return this; - } - - - - /** - * @param key if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param decode if decode && value instanceof String, value = URLDecoder.decode((String) value, UTF_8) - * @return - */ - public Object get(Object key, boolean decode) { - if (decode) { - if (key instanceof String) { - if (((String) key).endsWith("+") || ((String) key).endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLDecoder.decode((String) key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } - } - Object value = super.get(key); - if (value instanceof String) { - try { - value = URLDecoder.decode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - return value; - } - return super.get(key); - } - - /** - * encode = false - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - public Object put(Object value) { - return put(value, false); - } - /** - * key = value.getClass().getSimpleName() - * @param value must be annotated by {@link APIJSONRequest} - * @param encode - * @return {@link #put(String, Object, boolean)} - */ - public Object put(Object value, boolean encode) { - return put(null, value, encode); - } - /** - * @param key if StringUtil.isNotEmpty(key, true) == false, - *
key = value == null ? null : value.getClass().getSimpleName(); - *
>> if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param value URLEncoder.encode((String) value, UTF_8); - * @param encode if value instanceof String, value = URLEncoder.encode((String) value, UTF_8); - * @return - */ - public Object put(String key, Object value, boolean encode) { - if (StringUtil.isNotEmpty(key, true) == false) { - Class clazz = value == null ? null : value.getClass(); - if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { - throw new IllegalArgumentException("put StringUtil.isNotEmpty(key, true) == false" + - " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + - " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + - " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + - " \n 如果是类似 key[]:{} 结构的请求,建议add(...)方法!"); - } - key = value.getClass().getSimpleName(); - } - if (encode) { - if (key.endsWith("+") || key.endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLEncoder.encode(key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - if (value instanceof String) {//只在value instanceof String时encode key?{@link #get(Object, boolean)}内做不到 - try { - value = URLEncoder.encode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - } - return super.put(key, value); - } - - - - //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final String KEY_ARRAY = "[]"; - - /**判断是否为Array的key - * @param key - * @return - */ - public static boolean isArrayKey(String key) { - return key != null && key.endsWith(KEY_ARRAY); - } - /**判断是否为对应Table的key - * @param key - * @return - */ - public static boolean isTableKey(String key) { - return StringUtil.isBigWord(key); - } - //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< - /** - * 角色,拥有对某些数据的某些操作的权限 - */ - public static final String KEY_ROLE = "@role"; - /** - * 数据库,Table在非默认schema内时需要声明 - */ - public static final String KEY_SCHEMA = "@schema"; - /** - * 查询的Table字段或SQL函数 - */ - public static final String KEY_COLUMN = "@column"; - /** - * 分组方式 - */ - public static final String KEY_GROUP = "@group"; - /** - * 聚合函数条件,一般和@group一起用 - */ - public static final String KEY_HAVING = "@having"; - /** - * 排序方式 - */ - public static final String KEY_ORDER = "@order"; - //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> - - - /**set role of request sender - * @param role - * @return this - */ - public JSONObject setRole(String role) { - put(KEY_ROLE, role); - return this; - } - - /**set schema where table was put - * @param schema - * @return this - */ - public JSONObject setSchema(String schema) { - put(KEY_SCHEMA, schema); - return this; - } - - /**set keys need to be returned - * @param keys key0, key1, key2 ... - * @return {@link #setColumn(String)} - */ - public JSONObject setColumn(String... keys) { - return setColumn(StringUtil.getString(keys, true)); - } - /**set keys need to be returned - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setColumn(String keys) { - put(KEY_COLUMN, keys); - return this; - } - - /**set keys for group by - * @param keys key0, key1, key2 ... - * @return {@link #setGroup(String)} - */ - public JSONObject setGroup(String... keys) { - return setGroup(StringUtil.getString(keys, true)); - } - /**set keys for group by - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setGroup(String keys) { - put(KEY_GROUP, keys); - return this; - } - - /**set keys for having - * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... - * @return {@link #setHaving(String)} - */ - public JSONObject setHaving(String... keys) { - return setHaving(StringUtil.getString(keys, true)); - } - /**set keys for having - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setHaving(String keys) { - put(KEY_HAVING, keys); - return this; - } - - /**set keys for order by - * @param keys key0, key1+, key2- ... - * @return {@link #setOrder(String)} - */ - public JSONObject setOrder(String... keys) { - return setOrder(StringUtil.getString(keys, true)); - } - /**set keys for order by - * @param keys "key0,key1+,key2-..." - * @return - */ - public JSONObject setOrder(String keys) { - put(KEY_ORDER, keys); - return this; - } - - - //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //Request,默认encode <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - - /** - * encode = true - * @param value - * @param parts path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... - * @return #put(key+"@", StringUtil.getString(keys, "/"), true) - */ - public Object putPath(String key, String... keys) { - return put(key+"@", StringUtil.getString(keys, "/"), true); - } - - /** - * encode = true - * @param key - * @param isNull - * @return {@link #putNull(String, boolean, boolean)} - */ - public JSONObject putNull(String key, boolean isNull) { - return putNull(key, isNull, true); - } - /** - * @param key - * @param isNull - * @param encode - * @return put(key+"{}", SQL.isNull(isNull), encode); - */ - public JSONObject putNull(String key, boolean isNull, boolean encode) { - put(key+"{}", SQL.isNull(isNull), encode); - return this; - } - /** - * trim = false - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty) { - return putEmpty(key, isEmpty, false); - } - /** - * encode = true - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim) { - return putEmpty(key, isEmpty, trim, true); - } - /** - * @param key - * @param isEmpty - * @param encode - * @return put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim, boolean encode) { - put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - return this; - } - /** - * encode = true - * @param key - * @param compare <=0, >5 ... - * @return {@link #putLength(String, String, boolean)} - */ - public JSONObject putLength(String key, String compare) { - return putLength(key, compare, true); - } - /** - * @param key - * @param compare <=0, >5 ... - * @param encode - * @return put(key+"{}", SQL.length(key) + compare, encode); - */ - public JSONObject putLength(String key, String compare, boolean encode) { - put(key+"{}", SQL.length(key) + compare, encode); - return this; - } - - /**设置搜索 - * type = SEARCH_TYPE_CONTAIN_FULL - * @param key - * @param value - * @return {@link #putSearch(String, String, int)} - */ - public JSONObject putSearch(String key, String value) { - return putSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); - } - /**设置搜索 - * encode = true - * @param key - * @param value - * @param type - * @return {@link #putSearch(String, String, int, boolean)} - */ - public JSONObject putSearch(String key, String value, int type) { - return putSearch(key, value, type, true); - } - /**设置搜索 - * @param key - * @param value - * @param type - * @param encode - * @return put(key+"$", SQL.search(value, type), encode); - */ - public JSONObject putSearch(String key, String value, int type, boolean encode) { - put(key+"$", SQL.search(value, type), encode); - return this; - } - - //Request,默认encode >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONResponse.java deleted file mode 100644 index 1135a3f9e..000000000 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONResponse.java +++ /dev/null @@ -1,500 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.util.List; -import java.util.Set; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -/**parser for response JSON String - * @author Lemon - * @see #getList - * @see #toArray - * @use JSONResponse response = new JSONResponse(json); - *
JSONArray array = JSONResponse.toArray(response.getJSONObject("[]"));//not a must - *
User user = JSONResponse.getObject(response, User.class);//not a must - *
List list = JSONResponse.getList(response.getJSONObject("Comment[]"), Comment.class);//not a must - */ -public class JSONResponse extends zuo.biao.apijson.JSONObject { - private static final long serialVersionUID = 1L; - - private static final String TAG = "JSONResponse"; - - public JSONResponse() { - super(); - } - public JSONResponse(String json) { - this(parseObject(json)); - } - public JSONResponse(JSONObject object) { - super(format(object)); - } - - //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final int CODE_SUCCEED = 200; - public static final int CODE_PARTIAL_SUCCEED = 206; - public static final int CODE_UNSUPPORTED_ENCODING = 400; - public static final int CODE_ILLEGAL_ACCESS = 401; - public static final int CODE_UNSUPPORTED_OPERATION = 403; - public static final int CODE_NOT_FOUND = 404; - public static final int CODE_ILLEGAL_ARGUMENT = 406; - public static final int CODE_NOT_LOGGED_IN = 407; - public static final int CODE_TIME_OUT = 408; - public static final int CODE_CONFLICT = 409; - public static final int CODE_CONDITION_ERROR = 412; - public static final int CODE_UNSUPPORTED_TYPE = 415; - public static final int CODE_OUT_OF_RANGE = 416; - public static final int CODE_NULL_POINTER = 417; - public static final int CODE_SERVER_ERROR = 500; - - - public static final String KEY_CODE = "code"; - public static final String KEY_MSG = "msg"; - public static final String KEY_ID = "id"; - public static final String KEY_COUNT = "count"; - public static final String KEY_TOTAL = "total"; - - /**获取状态 - * @return - */ - public int getCode() { - try { - return getIntValue(KEY_CODE); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取信息 - * @return - */ - public String getMsg() { - return getString(KEY_MSG); - } - /**获取id - * @return - */ - public long getId() { - try { - return getLongValue(KEY_ID); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取数量 - * @return - */ - public int getCount() { - try { - return getIntValue(KEY_COUNT); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取总数 - * @return - */ - public int getTotal() { - try { - return getIntValue(KEY_TOTAL); - } catch (Exception e) { - //empty - } - return 0; - } - - - /**是否成功 - * @return - */ - public boolean isSucceed() { - return isSucceed(getCode()); - } - /**是否成功 - * @param code - * @return - */ - public static boolean isSucceed(int code) { - return code == CODE_SUCCEED; - } - /**是否成功 - * @param response - * @return - */ - public static boolean isSucceed(JSONResponse response) { - return response != null && response.isSucceed(); - } - - /**校验服务端是否存在table - * @return - */ - public boolean isExist() { - return isExist(getCount()); - } - /**校验服务端是否存在table - * @param count - * @return - */ - public static boolean isExist(int count) { - return count > 0; - } - /**校验服务端是否存在table - * @param response - * @return - */ - public static boolean isExist(JSONResponse response) { - return response != null && response.isExist(); - } - - /**获取内部的JSONResponse - * @param key - * @return - */ - public JSONResponse getJSONResponse(String key) { - return getObject(key, JSONResponse.class); - } - //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - - - /** - * key = clazz.getSimpleName() - * @param clazz - * @return - */ - public T getObject(Class clazz) { - return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); - } - /** - * @param key - * @param clazz - * @return - */ - public T getObject(String key, Class clazz) { - return getObject(this, key, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static T getObject(JSONObject object, String key, Class clazz) { - return toObject(object == null ? null : object.getJSONObject(key), clazz); - } - - /** - * @param clazz - * @return - */ - public T toObject(Class clazz) { - return toObject(this, clazz); - } - /** - * @param object - * @param clazz - * @return - */ - public static T toObject(JSONObject object, Class clazz) { - return JSON.parseObject(JSON.toJSONString(object), clazz); - } - - - - - /** - * key = KEY_ARRAY - * @param clazz - * @return - */ - public List getList(Class clazz) { - return getList(KEY_ARRAY, clazz); - } - /** - * arrayObject = this - * @param key - * @param clazz - * @return - */ - public List getList(String key, Class clazz) { - return getList(this, key, clazz); - } - - /** - * key = KEY_ARRAY - * @param object - * @param clazz - * @return - */ - public static List getList(JSONObject object, Class clazz) { - return getList(object, KEY_ARRAY, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static List getList(JSONObject object, String key, Class clazz) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? JSON.parseArray((JSONArray) obj, clazz) : toList((JSONObject) obj, clazz); - } - /** - * @param clazz - * @return - */ - public List toList(Class clazz) { - return toList(this, clazz); - } - /** - * @param arrayObject - * @param clazz - * @return - */ - public static List toList(JSONObject arrayObject, Class clazz) { - return clazz == null ? null : JSON.parseArray(JSON.toJSONString( - toArray(arrayObject, clazz.getSimpleName())), clazz); - } - - /** - * key = KEY_ARRAY - * @param className - * @return - */ - public JSONArray getArray(String className) { - return getArray(KEY_ARRAY, className); - } - /** - * @param key - * @param className - * @return - */ - public JSONArray getArray(String key, String className) { - return getArray(this, key, className); - } - /** - * @param object - * @param key - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String className) { - return getArray(object, KEY_ARRAY, className); - } - /** - * key = KEY_ARRAY - * @param object - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String key, String className) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? (JSONArray) obj : toArray((JSONObject) obj, className); - } - - /** - * @param className - * @return - */ - public JSONArray toArray(String className) { - return toArray(this, className); - } - /**{0:{Table:{}}, 1:{Table:{}}...} 转化为 [{Table:{}}, {Table:{}}] - * array.set(index, isContainer ? value : value.getJSONObject(className)); - * @param arrayObject - * @param className className.equals(Table) ? {Table:{Content}} => {Content} - * @return - */ - public static JSONArray toArray(JSONObject arrayObject, String className) { - Set set = arrayObject == null ? null : arrayObject.keySet(); - if (set == null || set.isEmpty()) { - return null; - } - - // [{...},{...},...] - String parentString = StringUtil.getTrimedString(JSON.toJSONString(arrayObject)); - if (parentString.isEmpty()) { - return null; - } - if (parentString.startsWith("[")) { - if (parentString.endsWith("]") == false) { - parentString += "]"; - } - return JSON.parseArray(parentString); - } - - //{"0":{Table:{...}}, "1":{Table:{...}}...} - - className = StringUtil.getTrimedString(className); - boolean isContainer = true; - - JSONArray array = new JSONArray(set.size()); - JSONObject value; - boolean isFirst = true; - int index; - for (String key : set) {//0, 1, 2,... - value = StringUtil.isNumer(key) == false ? null : arrayObject.getJSONObject(key);// Table:{} - if (value != null) { - try { - index = Integer.valueOf(0 + key); - if (isFirst && isTableKey(className) && value.containsKey(className)) {// 判断是否需要提取table - isContainer = false; - } - array.set(index, isContainer ? value : value.getJSONObject(className)); - } catch (Exception e) { - e.printStackTrace(); - } - } - isFirst = false; - } - return array; - } - - - - // /** - // * @return - // */ - // public JSONObject format() { - // return format(this); - // } - /**将Item[]:[{Table:{}}, {Table:{}}...] 或 Item[]:{0:{Table:{}}, 1:{Table:{}}...} - * 转化为 itemList:[{Table:{}}, {Table:{}}],如果 Item.equals(Table),则将 {Table:{Content}} 转化为 {Content} - * @param target - * @param response - * @return - */ - public static JSONObject format(final JSONObject response) { - //太长查看不方便,不如debug Log.i(TAG, "format response = \n" + JSON.toJSONString(response)); - if (response == null || response.isEmpty()) { - Log.i(TAG, "format response == null || response.isEmpty() >> return response;"); - return response; - } - JSONObject transferredObject = new JSONObject(true); - - Set set = response.keySet(); - if (set != null) { - - Object value; - String arrayKey; - for (String key : set) { - value = response.get(key); - - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredObject.put(replaceArray(key), format(key, (JSONArray) value)); - } else if (value instanceof JSONObject) {//APIJSON Array转为常规JSONArray - if (isArrayKey(key)) {//APIJSON Array转为常规JSONArray - arrayKey = key.substring(0, key.lastIndexOf(KEY_ARRAY)); - transferredObject.put(getArrayKey(getSimpleName(arrayKey)) - , format(key, toArray((JSONObject) value, arrayKey)));//需要将name:alias传至toArray - } else {//常规JSONObject,往下一级提取 - transferredObject.put(getSimpleName(key), format((JSONObject) value)); - } - } else {//其它Object,直接填充 - transferredObject.put(getSimpleName(key), value); - } - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredObject = " + JSON.toJSONString(transferredObject)); - return transferredObject; - } - - /** - * @param responseArray - * @return - */ - public static JSONArray format(String name, final JSONArray responseArray) { - //太长查看不方便,不如debug Log.i(TAG, "format responseArray = \n" + JSON.toJSONString(responseArray)); - if (responseArray == null || responseArray.isEmpty()) { - Log.i(TAG, "format responseArray == null || responseArray.isEmpty() >> return response;"); - return responseArray; - } - int index = name == null ? -1 : name.lastIndexOf(KEY_ARRAY); - String className = index < 0 ? "" : name.substring(0, index); - - JSONArray transferredArray = new JSONArray(); - - Object value; - boolean isContainer = true; - boolean isFirst = true; - for (int i = 0; i < responseArray.size(); i++) { - value = responseArray.get(i); - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredArray.add(format(null, (JSONArray) value)); - } else if (value instanceof JSONObject) {//JSONObject,往下一级提取 - //判断是否需要提取child - if (isFirst && isTableKey(className) && ((JSONObject) value).containsKey(className)) { - isContainer = false; - } - //直接添加child 或 添加提取出的child - transferredArray.add(format(isContainer ? (JSONObject)value : ((JSONObject)value).getJSONObject(className) )); - isFirst = false; - } else {//其它Object,直接填充 - transferredArray.add(responseArray.get(i)); - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredArray = " + JSON.toJSONString(transferredArray)); - return transferredArray; - } - - /**替换key+KEY_ARRAY为keyList - * @param key - * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} - */ - public static String replaceArray(String key) { - if (isArrayKey(key)) { - key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); - } - return getSimpleName(key); - } - /**获取列表变量名 - * @param key => StringUtil.getNoBlankString(key) - * @return empty ? "list" : key + "List" 且首字母小写 - */ - public static String getArrayKey(String key) { - return StringUtil.addSuffix(key, "list"); - } - - /**获取简单名称 - * @param fullName name 或 name:alias - * @return name > name; name:alias > alias - */ - public static String getSimpleName(String fullName) { - //key:alias -> alias; key:alias[] -> alias[] - int index = fullName == null ? -1 : fullName.indexOf(":"); - if (index >= 0) { - fullName = fullName.substring(index + 1); - } - return fullName; - } - - -} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/Controller.java b/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/Controller.java deleted file mode 100755 index de10f867f..000000000 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/Controller.java +++ /dev/null @@ -1,690 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server; - -import static zuo.biao.apijson.RequestMethod.DELETE; -import static zuo.biao.apijson.RequestMethod.GET; -import static zuo.biao.apijson.RequestMethod.HEAD; -import static zuo.biao.apijson.RequestMethod.POST; -import static zuo.biao.apijson.RequestMethod.POST_GET; -import static zuo.biao.apijson.RequestMethod.POST_HEAD; -import static zuo.biao.apijson.RequestMethod.PUT; - -import java.util.Random; -import java.util.concurrent.TimeoutException; - -import javax.servlet.http.HttpSession; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.alibaba.fastjson.JSONObject; - -import apijson.demo.server.model.BaseModel; -import apijson.demo.server.model.Comment; -import apijson.demo.server.model.Login; -import apijson.demo.server.model.Moment; -import apijson.demo.server.model.Password; -import apijson.demo.server.model.User; -import apijson.demo.server.model.UserPrivacy; -import apijson.demo.server.model.Verify; -import apijson.demo.server.model.Wallet; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONResponse; -import zuo.biao.apijson.Log; -import zuo.biao.apijson.RequestMethod; -import zuo.biao.apijson.StringUtil; -import zuo.biao.apijson.server.JSONRequest; -import zuo.biao.apijson.server.Parser; -import zuo.biao.apijson.server.exception.ConditionErrorException; -import zuo.biao.apijson.server.exception.ConflictException; -import zuo.biao.apijson.server.exception.NotExistException; -import zuo.biao.apijson.server.exception.OutOfRangeException; - -/**request receiver and controller - *
如果用在金融等对安全要求很高的领域,get和head可以测试期间使用明文的HTTP GET,上线版改用非明文的HTTP POST,兼顾系统安全与开发效率。 - *
get,head等接口都用HTTP GET方法请求,post,put,delete等接口都用HTTP POST方法请求。 - *
这样做是为了前端和客户端方便,只需要做GET和POST请求。也可以改用实际对应的方法。 - * @author Lemon - */ -@RestController -@RequestMapping("") -public class Controller { - private static final String TAG = "Controller"; - - //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#GET} - */ - @RequestMapping("get/{request}") - public String get(@PathVariable String request, HttpSession session) { - return new Parser(GET).setSession(session).parse(request); - } - - /**计数 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#HEAD} - */ - @RequestMapping("head/{request}") - public String head(@PathVariable String request, HttpSession session) { - return new Parser(HEAD).setSession(session).parse(request); - } - - /**用POST方法GET,request和response都非明文,浏览器看不到,用于对安全性要求高的GET请求 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#POST_GET} - */ - @RequestMapping(value = "post_get", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String post_get(@RequestBody String request, HttpSession session) { - return new Parser(POST_GET).setSession(session).parse(request); - } - - /**用POST方法HEAD,request和response都非明文,浏览器看不到,用于对安全性要求高的HEAD请求 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#POST_HEAD} - */ - @RequestMapping(value = "post_head", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String post_head(@RequestBody String request, HttpSession session) { - return new Parser(POST_HEAD).setSession(session).parse(request); - } - - /**新增 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#POST} - */ - @RequestMapping(value = "post", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String post(@RequestBody String request, HttpSession session) { - return new Parser(POST).setSession(session).parse(request); - } - - /**修改 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#PUT} - */ - @RequestMapping(value = "put", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String put(@RequestBody String request, HttpSession session) { - return new Parser(PUT).setSession(session).parse(request); - } - - /**删除 - * @param request 只用String,避免encode后未decode - * @param session - * @return - * @see {@link RequestMethod#DELETE} - */ - @RequestMapping(value = "delete", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public String delete(@RequestBody String request, HttpSession session) { - return new Parser(DELETE).setSession(session).parse(request); - } - - //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - - - - - - - - - - public static final String USER_; - public static final String MOMENT_; - public static final String COMMENT_; - public static final String WALLET_; - public static final String PASSWORD_; - public static final String USER_PRIVACY_; - public static final String VERIFY_; - static { - USER_ = User.class.getSimpleName(); - MOMENT_ = Moment.class.getSimpleName(); - COMMENT_ = Comment.class.getSimpleName(); - WALLET_ = Wallet.class.getSimpleName(); - PASSWORD_ = Password.class.getSimpleName(); - USER_PRIVACY_ = UserPrivacy.class.getSimpleName(); - VERIFY_ = Verify.class.getSimpleName(); - } - - public static final String TOTAL = JSONResponse.KEY_TOTAL; - - public static final String RANGE = "range"; - - public static final String ID = "id"; - public static final String USER_ID = "userId"; - public static final String CURRENT_USER_ID = "currentUserId"; - - public static final String NAME = "name"; - public static final String PHONE = "phone"; - public static final String PASSWORD = "password"; - public static final String LOGIN_PASSWORD = "loginPassword"; - public static final String PAY_PASSWORD = "payPassword"; - public static final String OLD_PASSWORD = "oldPassword"; - public static final String VERIFY = "verify"; - - public static final String SEX = "sex"; - public static final String TYPE = "type"; - public static final String CONTENT = "content"; - - - - - public static final String DATE_UP = "date+";//同 "date ASC" - public static final String DATE_DOWN = "date-";//同 "date DESC" - - public static final String ID_AT = ID + "@"; - public static final String USER_ID_AT = USER_ID + "@"; - public static final String MOMENT_ID_AT = "momentId@"; - public static final String COMMENT_ID_AT = "commentId@"; - - public static final String ID_IN = ID + "{}"; - public static final String USER_ID_IN = USER_ID + "{}"; - public static final String MOMENT_ID_IN = "momentId{}"; - public static final String COMMENT_ID_IN = "commentId{}"; - - public static final String NAME_SEARCH = NAME + "$"; - public static final String PHONE_SEARCH = PHONE + "$"; - public static final String CONTENT_SEARCH = CONTENT + "$"; - - - - public static final String COLUMNS_USER_SIMPLE = "id,name"; - public static final String COLUMNS_USER = "id,sex,name,head"; - - - - - /**生成验证码,修改为post请求 - * @param phone - * @return - */ - @RequestMapping(value = "post/verify", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject postVerify(@RequestBody String request) { - JSONObject requestObject; - String phone; - try { - requestObject = Parser.parseRequest(request, POST); - phone = requestObject.getString(PHONE); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - new Parser(DELETE, true).parse(newVerifyRequest(phone, null)); - - JSONObject response = new Parser(POST, true).parseResponse( - newVerifyRequest(phone, "" + (new Random().nextInt(9999) + 1000))); - - JSONObject verify = null; - try { - verify = response.getJSONObject(VERIFY_); - } catch (Exception e) { - // TODO: handle exception - } - if (verify == null || JSONResponse.isSucceed(verify.getIntValue(JSONResponse.KEY_CODE)) == false) { - new Parser(DELETE, true).parseResponse(new JSONRequest(new Verify(phone))); - return response; - } - - //TODO 这里直接返回验证码,方便测试。实际上应该只返回成功信息,验证码通过短信发送 - JSONObject object = new JSONObject(); - object.put(PHONE, phone); - return getVerify(JSON.toJSONString(object)); - } - - /**获取验证码 - * @param phone - * @return - */ - @RequestMapping(value = "post_get/verify", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject getVerify(@RequestBody String request) { - JSONObject requestObject; - String phone; - try { - requestObject = Parser.parseRequest(request, POST_GET); - phone = requestObject.getString(PHONE); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - return new Parser(POST_GET, true).parseResponse(newVerifyRequest(phone, null)); - } - - /**校验验证码 - * @param phone - * @param code - * @return - */ - @RequestMapping(value = "post_head/verify", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject headVerify(@RequestBody String request) { - String phone; - String verify; - try { - JSONObject requestObject = Parser.parseRequest(request, POST_HEAD); - phone = requestObject.getString(PHONE); - verify = requestObject.getString(VERIFY); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - return headVerify(phone, verify); - } - - /**校验验证码 - * @param phone - * @param vfy - * @return - */ - public JSONObject headVerify(String phone, String vfy) { - JSONResponse response = new JSONResponse( - new Parser(POST_GET, true).parseResponse( - new JSONRequest(new Verify(phone)).setTag(VERIFY_) - ) - ); - Verify verify = response.getObject(Verify.class); - if (verify == null) { - return Parser.newErrorResult(new NullPointerException("验证码为空!")); - } - - //验证码过期 - if (System.currentTimeMillis() > (60000 + BaseModel.value(verify.getDate()))) { - new Parser(DELETE, true).parseResponse( - new JSONRequest(new Verify(phone)).setTag(VERIFY_) - ); - return Parser.newErrorResult(new TimeoutException("验证码已过期!")); - } - - return new JSONResponse( - new Parser(POST_HEAD, true).parseResponse( - new JSONRequest(new Verify(phone, vfy)) - ) - ); - } - - - /**新建一个验证码请求 - * @param phone - * @param verify - * @return - */ - private JSONObject newVerifyRequest(String phone, String verify) { - return new JSONRequest(new Verify(phone, verify)).setTag(VERIFY_); - } - - - - /**用户登录 - * @param request 只用String,避免encode后未decode - * @return - */ - @RequestMapping(value = "login", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject login(@RequestBody String request, HttpSession session) { - JSONObject requestObject = null; - try { - requestObject = Parser.parseRequest(request, POST); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - String typeString = requestObject.getString(TYPE);//登录类型 - String phone = requestObject.getString(PHONE);//手机 - String password = requestObject.getString(PASSWORD);//密码 - - //判断手机号是否合法 - if (StringUtil.isPhone(phone) == false) { - return Parser.newErrorResult(new IllegalArgumentException("手机号不合法!")); - } - - //判断密码是否合法 - if ("1".equals(typeString)) { - if (StringUtil.isVerify(password) == false) { - return Parser.newErrorResult(new IllegalArgumentException("验证码不合法!")); - } - } else { - if (StringUtil.isPassword(password) == false) { - return Parser.newErrorResult(new IllegalArgumentException("密码不合法!")); - } - } - - //手机号是否已注册 - JSONObject phoneResponse = new Parser(POST_HEAD, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - JSONResponse response = new JSONResponse(phoneResponse).getJSONResponse(USER_PRIVACY_); - if (JSONResponse.isSucceed(response) == false) { - return response; - } - if(JSONResponse.isExist(response) == false) { - return Parser.newErrorResult(new NotExistException("手机号未注册")); - } - - //根据phone获取User - JSONObject privacyResponse = new Parser(POST_GET, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - response = new JSONResponse(privacyResponse); - - UserPrivacy userPrivacy = response == null ? null : response.getObject(UserPrivacy.class); - long userId = userPrivacy == null ? 0 : BaseModel.value(userPrivacy.getId()); - if (userId <= 0) { - return privacyResponse; - } - - //校验凭证 - int type = Integer.valueOf(0 + StringUtil.getNumber(typeString)); - if (type == Login.TYPE_PASSWORD) {//password密码登录 - response = new JSONResponse( - new Parser(POST_HEAD, true).parseResponse( - new JSONRequest(new UserPrivacy(userId).setPassword(password)) - ) - ); - } else {//verify手机验证码登录 - response = new JSONResponse(headVerify(phone, password)); - } - if (JSONResponse.isSucceed(response) == false) { - return response; - } - response = response.getJSONResponse(type == Login.TYPE_PASSWORD ? USER_PRIVACY_ : VERIFY_); - if (JSONResponse.isExist(response) == false) { - return Parser.newErrorResult(new ConditionErrorException("账号或密码错误")); - } - - response = new JSONResponse( - new Parser(POST_GET, true).parseResponse( - new JSONRequest(new User(userId)) - ) - ); - User user = response.getObject(User.class); - if (user == null || BaseModel.value(user.getId()) != userId) { - return Parser.newErrorResult(new NullPointerException("服务器内部错误")); - } - - //登录状态保存至session - session.setAttribute(USER_ID, userId);//用户id - session.setAttribute(TYPE, type);//登录方式 - session.setAttribute(USER_, user);//用户 - session.setAttribute(USER_PRIVACY_, userPrivacy);//用户隐私信息 - session.setMaxInactiveInterval(1*60);//设置session过期时间 - - return response; - } - - /**退出登录,清空session - * @param session - * @return - */ - @RequestMapping(value = "logout", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject logout(HttpSession session) { - long userId = AccessVerifier.getUserId(session);//必须在session.invalidate();前! - session.invalidate(); - - JSONObject result = Parser.newSuccessResult(); - JSONObject user = Parser.newSuccessResult(); - user.put(ID, userId); - result.put(USER_, user); - - return result; - } - - - /**注册 - * @param request 只用String,避免encode后未decode - * @return - */ - @RequestMapping(value = "register", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject register(@RequestBody String request) { - JSONObject requestObject = null; - try { - requestObject = Parser.getCorrectRequest(POST, Parser.parseRequest(request, POST)); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - String phone = requestObject.getString(PHONE); - String password = StringUtil.getString(requestObject.getString(PASSWORD)); - String verify = StringUtil.getString(requestObject.getString(VERIFY)); - requestObject.remove(PHONE); - requestObject.remove(PASSWORD); - requestObject.remove(VERIFY); - - if (StringUtil.isPhone(phone) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.phone: " + phone + " 不合法!")); - } - if (StringUtil.isPassword(password) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.password: " + password + " 不合法!不能小于6个字符!")); - } - if (StringUtil.isVerify(verify) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.verify: " + verify + " 不合法!不能小于6个字符!")); - } - - - JSONResponse response = new JSONResponse(headVerify(phone, verify)); - if (JSONResponse.isSucceed(response) == false) { - return response; - } - - //手机号或验证码错误 - if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { - return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); - } - - //验证手机号是否已经注册 - JSONObject check = new Parser(POST_HEAD, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - JSONObject checkUser = check == null ? null : check.getJSONObject(USER_PRIVACY_); - if (checkUser == null || checkUser.getIntValue(JSONResponse.KEY_COUNT) > 0) { - return Parser.newErrorResult(new ConflictException("手机号" + phone + "已经注册")); - } - - //生成User - JSONObject result = new Parser(POST, true).parseResponse(requestObject); - response = new JSONResponse(result); - if (JSONResponse.isSucceed(response) == false) { - return result; - } - - response = response.getJSONResponse(USER_); - long userId = response == null ? 0 : response.getId(); - - //生成UserPrivacy - response = new JSONResponse( - new Parser(POST, true).parseResponse( - new JSONRequest( - new UserPrivacy(userId).setPhone(phone).setPassword(password) - ) - ) - ); - if (JSONResponse.isSucceed(response.getJSONResponse(USER_PRIVACY_)) == false) {//创建失败,删除新增的无效User和userPrivacy - - new Parser(DELETE, true).parseResponse( - new JSONRequest( - new User(userId) - ) - ); - - new Parser(DELETE, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ); - - return Parser.extendErrorResult(result, new Exception("服务器内部错误")); - } - - return result; - } - - - /**设置密码 - * @param request 只用String,避免encode后未decode - * @return - */ - @RequestMapping(value = "put/password", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject putPassword(@RequestBody String request){ - JSONObject requestObject = null; - try { - requestObject = Parser.parseRequest(request, POST); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - String phone = requestObject.getString(PHONE); - String password = StringUtil.getString(requestObject.getString(PASSWORD)); - String verify = StringUtil.getString(requestObject.getString(VERIFY)); - - if (StringUtil.isPhone(phone) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.phone: " + phone + " 不合法!")); - } - if (StringUtil.isPassword(password) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.password: " + password + " 不合法!不能小于6个字符!")); - } - if (StringUtil.isVerify(verify) == false) { - return Parser.extendErrorResult(requestObject - , new IllegalArgumentException("User.verify: " + verify + " 不合法!不能小于6个字符!")); - } - - //校验验证码 - JSONResponse response = new JSONResponse(headVerify(phone, requestObject.getString(VERIFY))); - if (JSONResponse.isSucceed(response) == false) { - return response; - } - //手机号或验证码错误 - if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { - return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); - } - - response = new JSONResponse( - new Parser(GET, true).parseResponse( - new JSONRequest( - new UserPrivacy().setPhone(phone) - ) - ) - ); - UserPrivacy privacy = response.getObject(UserPrivacy.class); - long userId = privacy == null ? 0 : privacy.getId(); - //修改密码 - return new Parser(PUT, true).parseResponse( - new JSONRequest( - new UserPrivacy(userId).setPassword(password) - ) - ); - } - - - - /**充值/提现 - * @param request 只用String,避免encode后未decode - * @param session - * @return - */ - @RequestMapping(value = "put/balance", method = org.springframework.web.bind.annotation.RequestMethod.POST) - public JSONObject putBalance(@RequestBody String request, HttpSession session) { - JSONObject requestObject = null; - try { - AccessVerifier.verifyLogin(session); - requestObject = Parser.getCorrectRequest(PUT, Parser.parseRequest(request, PUT)); - } catch (Exception e) { - return Parser.newErrorResult(e); - } - - //验证密码<<<<<<<<<<<<<<<<<<<<<<< - - JSONObject pwdObj = requestObject.getJSONObject(PASSWORD_); - requestObject.remove(PASSWORD_); - if (pwdObj == null || pwdObj.getIntValue(TYPE) != Password.TYPE_PAY) { - return Parser.extendErrorResult(requestObject, new ConditionErrorException("Password type必须是支付类型!")); - } - - JSONResponse response = new JSONResponse( - new Parser(POST_HEAD, true).setSession(session).parseResponse( - new JSONRequest(PASSWORD_, pwdObj) - ) - ); - response = response.getJSONResponse(PASSWORD_); - if (response == null || response.isExist() == false) { - return Parser.extendErrorResult(requestObject, new ConditionErrorException("支付密码错误!")); - } - - //验证密码>>>>>>>>>>>>>>>>>>>>>>>> - - - //验证金额范围<<<<<<<<<<<<<<<<<<<<<<< - - JSONObject wallet = requestObject.getJSONObject(WALLET_); - long id = wallet == null ? null : wallet.getLong(ID); - if (id <= 0) { - return Parser.extendErrorResult(requestObject, new ConditionErrorException("请设置Wallet及内部的id!")); - } - - double change = wallet.getDoubleValue("balance+"); - if (change == 0) { - return Parser.extendErrorResult(requestObject, new OutOfRangeException("balance+的值不能为0!")); - } - if (Math.abs(change) > 10000) { - return Parser.extendErrorResult(requestObject, new OutOfRangeException("单次 充值/提现 的金额不能超过10000元!")); - } - - //验证金额范围>>>>>>>>>>>>>>>>>>>>>>>> - - if (change < 0) {//提现 - response = new JSONResponse( - new Parser(POST_GET, true).parseResponse( - new JSONRequest( - new Wallet(id).setUserId(AccessVerifier.getUserId(session)) - ) - ) - ); - Wallet w = response == null ? null : response.getObject(Wallet.class); - if (w == null) { - return Parser.extendErrorResult(requestObject, new Exception("服务器内部错误!")); - } - - if (w.getBalance() == null || w.getBalance().doubleValue() < -change) { - return Parser.extendErrorResult(requestObject, new OutOfRangeException("余额不足!")); - } - } - - //不免验证,里面会验证身份 - return new Parser(PUT).setSession(session).parseResponse(requestObject); - } - - -} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Password.java b/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Password.java deleted file mode 100644 index f0c9b8c48..000000000 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Password.java +++ /dev/null @@ -1,94 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import static zuo.biao.apijson.RequestRole.ADMIN; -import static zuo.biao.apijson.RequestRole.LOGIN; -import static zuo.biao.apijson.RequestRole.OWNER; -import static zuo.biao.apijson.RequestRole.UNKNOWN; - -import zuo.biao.apijson.MethodAccess; -import zuo.biao.apijson.StringUtil; - -/**密码类,已用UserPrivacy替代 - * @author Lemon - * @see - *
POST_HEAD:
-{
- "Password":{
-     "disallow":"!",
-     "necessary":"id,type"
- }
-}
- * 
- *
PUT:put/loginPassword, put/payPassword
-{
-    "Password":{
-        "disallow":"!",
-        "necessary":"id,type,password"
-    },
-    "necessary":"oldPassword"
-}
- * 
- */ -@Deprecated -@MethodAccess( - GET = {}, - HEAD = {}, - POST_HEAD = {OWNER, ADMIN}, - POST = {UNKNOWN, LOGIN, OWNER, ADMIN} - ) -public class Password extends BaseModel { - private static final long serialVersionUID = 1L; - - public static final int TYPE_LOGIN = 0; - public static final int TYPE_PAY = 1; - - private Integer type; - private String password; - - public Password() { - super(); - } - public Password(String phone) { - this(); - setPhone(phone); - } - public Password(String phone, String password) { - this(phone); - setPassword(password); - } - - public Password setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); - return this; - } - - public Integer getType() { - return type; - } - public Password setType(Integer type) { - this.type = type; - return this; - } - public String getPassword() { - return password; - } - public Password setPassword(String password) { - this.password = password; - return this; - } - -} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Wallet.java b/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Wallet.java deleted file mode 100644 index c70aa7e37..000000000 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Wallet.java +++ /dev/null @@ -1,101 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package apijson.demo.server.model; - -import static zuo.biao.apijson.RequestRole.ADMIN; -import static zuo.biao.apijson.RequestRole.OWNER; - -import java.math.BigDecimal; - -import zuo.biao.apijson.MethodAccess; - -/**钱包类,已用UserPrivacy替代 - * @author Lemon - * @see - *
POST_GET:
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
- *
POST:post/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
PUT:put/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id,balance+"
-    },
-    "necessary":"payPassword"
-}
- * 
- *
DELETE:delete/wallet
-{
-    "Wallet":{
-        "disallow":"!",
-        "necessary":"id"
-    },
-    "necessary":"payPassword"
-}
- * 
- */ -@Deprecated -@MethodAccess( - GET = {}, - HEAD = {}, - POST_GET = {OWNER, ADMIN}, - POST_HEAD = {OWNER, ADMIN}, - POST = {ADMIN}, - DELETE = {ADMIN} - ) -public class Wallet extends BaseModel { - private static final long serialVersionUID = 1L; - - public BigDecimal balance; - - /**默认构造方法,JSON等解析时必须要有 - */ - public Wallet() { - super(); - } - public Wallet(long id) { - this(); - setId(id); - } - - - public Wallet setUserId(long userId) { - setId(userId); - return this; - } - - public BigDecimal getBalance() { - return balance; - } - public Wallet setBalance(BigDecimal balance) { - this.balance = balance; - return this; - } - -} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONObject.java deleted file mode 100644 index 4d3581764..000000000 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONObject.java +++ /dev/null @@ -1,453 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import static zuo.biao.apijson.StringUtil.UTF_8; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Set; - -/**use this class instead of com.alibaba.fastjson.JSONObject, not encode in default cases - * @author Lemon - */ -public class JSONObject extends com.alibaba.fastjson.JSONObject { - private static final long serialVersionUID = 1L; - - /**ordered - */ - public JSONObject() { - super(true); - } - /**transfer Object to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(Object, boolean)} - */ - public JSONObject(Object object) { - this(object, false); - } - /**transfer Object to JSONObject - * @param object - * @param encode - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(Object object, boolean encode) { - this(toJSONString(object), encode); - } - /**parse JSONObject with JSON String - * encode = false; - * @param json - * @see {@link #JSONObject(String, boolean)} - */ - public JSONObject(String json) { - this(json, false); - } - /**parse JSONObject with JSON String - * @param json - * @param encode - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(String json, boolean encode) { - this(parseObject(json), encode); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * encode = false; - * @param object - * @see {@link #JSONObject(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object) { - this(object, false); - } - /**transfer com.alibaba.fastjson.JSONObject to JSONObject - * @param object - * @param encode - * @see {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject(com.alibaba.fastjson.JSONObject object, boolean encode) { - this(); - add(object, encode); - } - - - - - /**put key-value in object into this - * encode = false; - * @param object - * @return {@link #add(com.alibaba.fastjson.JSONObject, boolean)} - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object) { - return add(object, false); - } - /**put key-value in object into this - * @param object - * @param encode - * @return this - */ - public JSONObject add(com.alibaba.fastjson.JSONObject object, boolean encode) { - //TODO putAll(object); - - Set set = object == null ? null : object.keySet(); - if (set != null) { - for (String key : set) { - put(key, object.get(key), encode); - } - } - return this; - } - - - - /** - * @param key if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param decode if decode && value instanceof String, value = URLDecoder.decode((String) value, UTF_8) - * @return - */ - public Object get(Object key, boolean decode) { - if (decode) { - if (key instanceof String) { - if (((String) key).endsWith("+") || ((String) key).endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLDecoder.decode((String) key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } - } - Object value = super.get(key); - if (value instanceof String) { - try { - value = URLDecoder.decode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - return value; - } - return super.get(key); - } - - /** - * encode = false - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - public Object put(Object value) { - return put(value, false); - } - /** - * key = value.getClass().getSimpleName() - * @param value must be annotated by {@link APIJSONRequest} - * @param encode - * @return {@link #put(String, Object, boolean)} - */ - public Object put(Object value, boolean encode) { - return put(null, value, encode); - } - /** - * @param key if StringUtil.isNotEmpty(key, true) == false, - *
key = value == null ? null : value.getClass().getSimpleName(); - *
>> if decode && key instanceof String, key = URLDecoder.decode((String) key, UTF_8) - * @param value URLEncoder.encode((String) value, UTF_8); - * @param encode if value instanceof String, value = URLEncoder.encode((String) value, UTF_8); - * @return - */ - public Object put(String key, Object value, boolean encode) { - if (StringUtil.isNotEmpty(key, true) == false) { - Class clazz = value == null ? null : value.getClass(); - if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { - throw new IllegalArgumentException("put StringUtil.isNotEmpty(key, true) == false" + - " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + - " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + - " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + - " \n 如果是类似 key[]:{} 结构的请求,建议add(...)方法!"); - } - key = value.getClass().getSimpleName(); - } - if (encode) { - if (key.endsWith("+") || key.endsWith("-")) { - try {//多层encode导致内部Comment[]传到服务端decode后最终变为Comment%5B%5D - key = URLEncoder.encode(key, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - if (value instanceof String) {//只在value instanceof String时encode key?{@link #get(Object, boolean)}内做不到 - try { - value = URLEncoder.encode((String) value, UTF_8); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - } - return super.put(key, value); - } - - - - //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final String KEY_ARRAY = "[]"; - - /**判断是否为Array的key - * @param key - * @return - */ - public static boolean isArrayKey(String key) { - return key != null && key.endsWith(KEY_ARRAY); - } - /**判断是否为对应Table的key - * @param key - * @return - */ - public static boolean isTableKey(String key) { - return StringUtil.isBigWord(key); - } - //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< - /** - * 角色,拥有对某些数据的某些操作的权限 - */ - public static final String KEY_ROLE = "@role"; - /** - * 数据库,Table在非默认schema内时需要声明 - */ - public static final String KEY_SCHEMA = "@schema"; - /** - * 查询的Table字段或SQL函数 - */ - public static final String KEY_COLUMN = "@column"; - /** - * 分组方式 - */ - public static final String KEY_GROUP = "@group"; - /** - * 聚合函数条件,一般和@group一起用 - */ - public static final String KEY_HAVING = "@having"; - /** - * 排序方式 - */ - public static final String KEY_ORDER = "@order"; - //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> - - - /**set role of request sender - * @param role - * @return this - */ - public JSONObject setRole(String role) { - put(KEY_ROLE, role); - return this; - } - - /**set schema where table was put - * @param schema - * @return this - */ - public JSONObject setSchema(String schema) { - put(KEY_SCHEMA, schema); - return this; - } - - /**set keys need to be returned - * @param keys key0, key1, key2 ... - * @return {@link #setColumn(String)} - */ - public JSONObject setColumn(String... keys) { - return setColumn(StringUtil.getString(keys, true)); - } - /**set keys need to be returned - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setColumn(String keys) { - put(KEY_COLUMN, keys); - return this; - } - - /**set keys for group by - * @param keys key0, key1, key2 ... - * @return {@link #setGroup(String)} - */ - public JSONObject setGroup(String... keys) { - return setGroup(StringUtil.getString(keys, true)); - } - /**set keys for group by - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setGroup(String keys) { - put(KEY_GROUP, keys); - return this; - } - - /**set keys for having - * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... - * @return {@link #setHaving(String)} - */ - public JSONObject setHaving(String... keys) { - return setHaving(StringUtil.getString(keys, true)); - } - /**set keys for having - * @param keys "key0,key1,key2..." - * @return - */ - public JSONObject setHaving(String keys) { - put(KEY_HAVING, keys); - return this; - } - - /**set keys for order by - * @param keys key0, key1+, key2- ... - * @return {@link #setOrder(String)} - */ - public JSONObject setOrder(String... keys) { - return setOrder(StringUtil.getString(keys, true)); - } - /**set keys for order by - * @param keys "key0,key1+,key2-..." - * @return - */ - public JSONObject setOrder(String keys) { - put(KEY_ORDER, keys); - return this; - } - - - //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - //Request,默认encode <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - - /** - * encode = true - * @param value - * @param parts path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... - * @return #put(key+"@", StringUtil.getString(keys, "/"), true) - */ - public Object putPath(String key, String... keys) { - return put(key+"@", StringUtil.getString(keys, "/"), true); - } - - /** - * encode = true - * @param key - * @param isNull - * @return {@link #putNull(String, boolean, boolean)} - */ - public JSONObject putNull(String key, boolean isNull) { - return putNull(key, isNull, true); - } - /** - * @param key - * @param isNull - * @param encode - * @return put(key+"{}", SQL.isNull(isNull), encode); - */ - public JSONObject putNull(String key, boolean isNull, boolean encode) { - put(key+"{}", SQL.isNull(isNull), encode); - return this; - } - /** - * trim = false - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty) { - return putEmpty(key, isEmpty, false); - } - /** - * encode = true - * @param key - * @param isEmpty - * @return {@link #putEmpty(String, boolean, boolean, boolean)} - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim) { - return putEmpty(key, isEmpty, trim, true); - } - /** - * @param key - * @param isEmpty - * @param encode - * @return put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - */ - public JSONObject putEmpty(String key, boolean isEmpty, boolean trim, boolean encode) { - put(key+"{}", SQL.isEmpty(key, isEmpty, trim), encode); - return this; - } - /** - * encode = true - * @param key - * @param compare <=0, >5 ... - * @return {@link #putLength(String, String, boolean)} - */ - public JSONObject putLength(String key, String compare) { - return putLength(key, compare, true); - } - /** - * @param key - * @param compare <=0, >5 ... - * @param encode - * @return put(key+"{}", SQL.length(key) + compare, encode); - */ - public JSONObject putLength(String key, String compare, boolean encode) { - put(key+"{}", SQL.length(key) + compare, encode); - return this; - } - - /**设置搜索 - * type = SEARCH_TYPE_CONTAIN_FULL - * @param key - * @param value - * @return {@link #putSearch(String, String, int)} - */ - public JSONObject putSearch(String key, String value) { - return putSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); - } - /**设置搜索 - * encode = true - * @param key - * @param value - * @param type - * @return {@link #putSearch(String, String, int, boolean)} - */ - public JSONObject putSearch(String key, String value, int type) { - return putSearch(key, value, type, true); - } - /**设置搜索 - * @param key - * @param value - * @param type - * @param encode - * @return put(key+"$", SQL.search(value, type), encode); - */ - public JSONObject putSearch(String key, String value, int type, boolean encode) { - put(key+"$", SQL.search(value, type), encode); - return this; - } - - //Request,默认encode >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONResponse.java deleted file mode 100644 index 1135a3f9e..000000000 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONResponse.java +++ /dev/null @@ -1,500 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -import java.util.List; -import java.util.Set; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -/**parser for response JSON String - * @author Lemon - * @see #getList - * @see #toArray - * @use JSONResponse response = new JSONResponse(json); - *
JSONArray array = JSONResponse.toArray(response.getJSONObject("[]"));//not a must - *
User user = JSONResponse.getObject(response, User.class);//not a must - *
List list = JSONResponse.getList(response.getJSONObject("Comment[]"), Comment.class);//not a must - */ -public class JSONResponse extends zuo.biao.apijson.JSONObject { - private static final long serialVersionUID = 1L; - - private static final String TAG = "JSONResponse"; - - public JSONResponse() { - super(); - } - public JSONResponse(String json) { - this(parseObject(json)); - } - public JSONResponse(JSONObject object) { - super(format(object)); - } - - //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public static final int CODE_SUCCEED = 200; - public static final int CODE_PARTIAL_SUCCEED = 206; - public static final int CODE_UNSUPPORTED_ENCODING = 400; - public static final int CODE_ILLEGAL_ACCESS = 401; - public static final int CODE_UNSUPPORTED_OPERATION = 403; - public static final int CODE_NOT_FOUND = 404; - public static final int CODE_ILLEGAL_ARGUMENT = 406; - public static final int CODE_NOT_LOGGED_IN = 407; - public static final int CODE_TIME_OUT = 408; - public static final int CODE_CONFLICT = 409; - public static final int CODE_CONDITION_ERROR = 412; - public static final int CODE_UNSUPPORTED_TYPE = 415; - public static final int CODE_OUT_OF_RANGE = 416; - public static final int CODE_NULL_POINTER = 417; - public static final int CODE_SERVER_ERROR = 500; - - - public static final String KEY_CODE = "code"; - public static final String KEY_MSG = "msg"; - public static final String KEY_ID = "id"; - public static final String KEY_COUNT = "count"; - public static final String KEY_TOTAL = "total"; - - /**获取状态 - * @return - */ - public int getCode() { - try { - return getIntValue(KEY_CODE); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取信息 - * @return - */ - public String getMsg() { - return getString(KEY_MSG); - } - /**获取id - * @return - */ - public long getId() { - try { - return getLongValue(KEY_ID); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取数量 - * @return - */ - public int getCount() { - try { - return getIntValue(KEY_COUNT); - } catch (Exception e) { - //empty - } - return 0; - } - /**获取总数 - * @return - */ - public int getTotal() { - try { - return getIntValue(KEY_TOTAL); - } catch (Exception e) { - //empty - } - return 0; - } - - - /**是否成功 - * @return - */ - public boolean isSucceed() { - return isSucceed(getCode()); - } - /**是否成功 - * @param code - * @return - */ - public static boolean isSucceed(int code) { - return code == CODE_SUCCEED; - } - /**是否成功 - * @param response - * @return - */ - public static boolean isSucceed(JSONResponse response) { - return response != null && response.isSucceed(); - } - - /**校验服务端是否存在table - * @return - */ - public boolean isExist() { - return isExist(getCount()); - } - /**校验服务端是否存在table - * @param count - * @return - */ - public static boolean isExist(int count) { - return count > 0; - } - /**校验服务端是否存在table - * @param response - * @return - */ - public static boolean isExist(JSONResponse response) { - return response != null && response.isExist(); - } - - /**获取内部的JSONResponse - * @param key - * @return - */ - public JSONResponse getJSONResponse(String key) { - return getObject(key, JSONResponse.class); - } - //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - - - - - - /** - * key = clazz.getSimpleName() - * @param clazz - * @return - */ - public T getObject(Class clazz) { - return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); - } - /** - * @param key - * @param clazz - * @return - */ - public T getObject(String key, Class clazz) { - return getObject(this, key, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static T getObject(JSONObject object, String key, Class clazz) { - return toObject(object == null ? null : object.getJSONObject(key), clazz); - } - - /** - * @param clazz - * @return - */ - public T toObject(Class clazz) { - return toObject(this, clazz); - } - /** - * @param object - * @param clazz - * @return - */ - public static T toObject(JSONObject object, Class clazz) { - return JSON.parseObject(JSON.toJSONString(object), clazz); - } - - - - - /** - * key = KEY_ARRAY - * @param clazz - * @return - */ - public List getList(Class clazz) { - return getList(KEY_ARRAY, clazz); - } - /** - * arrayObject = this - * @param key - * @param clazz - * @return - */ - public List getList(String key, Class clazz) { - return getList(this, key, clazz); - } - - /** - * key = KEY_ARRAY - * @param object - * @param clazz - * @return - */ - public static List getList(JSONObject object, Class clazz) { - return getList(object, KEY_ARRAY, clazz); - } - /** - * @param object - * @param key - * @param clazz - * @return - */ - public static List getList(JSONObject object, String key, Class clazz) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? JSON.parseArray((JSONArray) obj, clazz) : toList((JSONObject) obj, clazz); - } - /** - * @param clazz - * @return - */ - public List toList(Class clazz) { - return toList(this, clazz); - } - /** - * @param arrayObject - * @param clazz - * @return - */ - public static List toList(JSONObject arrayObject, Class clazz) { - return clazz == null ? null : JSON.parseArray(JSON.toJSONString( - toArray(arrayObject, clazz.getSimpleName())), clazz); - } - - /** - * key = KEY_ARRAY - * @param className - * @return - */ - public JSONArray getArray(String className) { - return getArray(KEY_ARRAY, className); - } - /** - * @param key - * @param className - * @return - */ - public JSONArray getArray(String key, String className) { - return getArray(this, key, className); - } - /** - * @param object - * @param key - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String className) { - return getArray(object, KEY_ARRAY, className); - } - /** - * key = KEY_ARRAY - * @param object - * @param className - * @return - */ - public static JSONArray getArray(JSONObject object, String key, String className) { - Object obj = object == null ? null : object.get(replaceArray(key)); - if (obj == null) { - return null; - } - return obj instanceof JSONArray ? (JSONArray) obj : toArray((JSONObject) obj, className); - } - - /** - * @param className - * @return - */ - public JSONArray toArray(String className) { - return toArray(this, className); - } - /**{0:{Table:{}}, 1:{Table:{}}...} 转化为 [{Table:{}}, {Table:{}}] - * array.set(index, isContainer ? value : value.getJSONObject(className)); - * @param arrayObject - * @param className className.equals(Table) ? {Table:{Content}} => {Content} - * @return - */ - public static JSONArray toArray(JSONObject arrayObject, String className) { - Set set = arrayObject == null ? null : arrayObject.keySet(); - if (set == null || set.isEmpty()) { - return null; - } - - // [{...},{...},...] - String parentString = StringUtil.getTrimedString(JSON.toJSONString(arrayObject)); - if (parentString.isEmpty()) { - return null; - } - if (parentString.startsWith("[")) { - if (parentString.endsWith("]") == false) { - parentString += "]"; - } - return JSON.parseArray(parentString); - } - - //{"0":{Table:{...}}, "1":{Table:{...}}...} - - className = StringUtil.getTrimedString(className); - boolean isContainer = true; - - JSONArray array = new JSONArray(set.size()); - JSONObject value; - boolean isFirst = true; - int index; - for (String key : set) {//0, 1, 2,... - value = StringUtil.isNumer(key) == false ? null : arrayObject.getJSONObject(key);// Table:{} - if (value != null) { - try { - index = Integer.valueOf(0 + key); - if (isFirst && isTableKey(className) && value.containsKey(className)) {// 判断是否需要提取table - isContainer = false; - } - array.set(index, isContainer ? value : value.getJSONObject(className)); - } catch (Exception e) { - e.printStackTrace(); - } - } - isFirst = false; - } - return array; - } - - - - // /** - // * @return - // */ - // public JSONObject format() { - // return format(this); - // } - /**将Item[]:[{Table:{}}, {Table:{}}...] 或 Item[]:{0:{Table:{}}, 1:{Table:{}}...} - * 转化为 itemList:[{Table:{}}, {Table:{}}],如果 Item.equals(Table),则将 {Table:{Content}} 转化为 {Content} - * @param target - * @param response - * @return - */ - public static JSONObject format(final JSONObject response) { - //太长查看不方便,不如debug Log.i(TAG, "format response = \n" + JSON.toJSONString(response)); - if (response == null || response.isEmpty()) { - Log.i(TAG, "format response == null || response.isEmpty() >> return response;"); - return response; - } - JSONObject transferredObject = new JSONObject(true); - - Set set = response.keySet(); - if (set != null) { - - Object value; - String arrayKey; - for (String key : set) { - value = response.get(key); - - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredObject.put(replaceArray(key), format(key, (JSONArray) value)); - } else if (value instanceof JSONObject) {//APIJSON Array转为常规JSONArray - if (isArrayKey(key)) {//APIJSON Array转为常规JSONArray - arrayKey = key.substring(0, key.lastIndexOf(KEY_ARRAY)); - transferredObject.put(getArrayKey(getSimpleName(arrayKey)) - , format(key, toArray((JSONObject) value, arrayKey)));//需要将name:alias传至toArray - } else {//常规JSONObject,往下一级提取 - transferredObject.put(getSimpleName(key), format((JSONObject) value)); - } - } else {//其它Object,直接填充 - transferredObject.put(getSimpleName(key), value); - } - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredObject = " + JSON.toJSONString(transferredObject)); - return transferredObject; - } - - /** - * @param responseArray - * @return - */ - public static JSONArray format(String name, final JSONArray responseArray) { - //太长查看不方便,不如debug Log.i(TAG, "format responseArray = \n" + JSON.toJSONString(responseArray)); - if (responseArray == null || responseArray.isEmpty()) { - Log.i(TAG, "format responseArray == null || responseArray.isEmpty() >> return response;"); - return responseArray; - } - int index = name == null ? -1 : name.lastIndexOf(KEY_ARRAY); - String className = index < 0 ? "" : name.substring(0, index); - - JSONArray transferredArray = new JSONArray(); - - Object value; - boolean isContainer = true; - boolean isFirst = true; - for (int i = 0; i < responseArray.size(); i++) { - value = responseArray.get(i); - if (value instanceof JSONArray) {//转化JSONArray内部的APIJSON Array - transferredArray.add(format(null, (JSONArray) value)); - } else if (value instanceof JSONObject) {//JSONObject,往下一级提取 - //判断是否需要提取child - if (isFirst && isTableKey(className) && ((JSONObject) value).containsKey(className)) { - isContainer = false; - } - //直接添加child 或 添加提取出的child - transferredArray.add(format(isContainer ? (JSONObject)value : ((JSONObject)value).getJSONObject(className) )); - isFirst = false; - } else {//其它Object,直接填充 - transferredArray.add(responseArray.get(i)); - } - } - - //太长查看不方便,不如debug Log.i(TAG, "format return transferredArray = " + JSON.toJSONString(transferredArray)); - return transferredArray; - } - - /**替换key+KEY_ARRAY为keyList - * @param key - * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} - */ - public static String replaceArray(String key) { - if (isArrayKey(key)) { - key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); - } - return getSimpleName(key); - } - /**获取列表变量名 - * @param key => StringUtil.getNoBlankString(key) - * @return empty ? "list" : key + "List" 且首字母小写 - */ - public static String getArrayKey(String key) { - return StringUtil.addSuffix(key, "list"); - } - - /**获取简单名称 - * @param fullName name 或 name:alias - * @return name > name; name:alias > alias - */ - public static String getSimpleName(String fullName) { - //key:alias -> alias; key:alias[] -> alias[] - int index = fullName == null ? -1 : fullName.indexOf(":"); - if (index >= 0) { - fullName = fullName.substring(index + 1); - } - return fullName; - } - - -} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/SQL.java b/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/SQL.java deleted file mode 100644 index 63f532b52..000000000 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/SQL.java +++ /dev/null @@ -1,290 +0,0 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.*/ - -package zuo.biao.apijson; - -/**SQL语句,函数名尽量和JDK中相同或类似功能的函数的名称一致 - * @author Lemon - */ -public class SQL { - - public static final String OR = " OR "; - public static final String AND = " AND "; - public static final String NOT = " NOT "; - public static final String IS = " is "; - public static final String NULL = " null "; - - /** - * isNull = true - * @return {@link #isNull(boolean)} - */ - public static String isNull() { - return isNull(true); - } - /** - * @param isNull - * @return IS + (isNull ? "" : NOT) + NULL; - */ - public static String isNull(boolean isNull) { - return IS + (isNull ? "" : NOT) + NULL; - } - /** - * isNull = true - * @param s - * @return {@link #isNull(String, boolean)} - */ - public static String isNull(String s) { - return isNull(s, true); - } - /** - * @param s - * @param isNull - * @return s + {@link #isNull(boolean)} - */ - public static String isNull(String s, boolean isNull) { - return s + isNull(isNull); - } - - /** - * isEmpty = true - * @param s - * @return {@link #isEmpty(String, boolean)} - */ - public static String isEmpty(String s) { - return isEmpty(s, true); - } - /** - * trim = false - * @param s - * @param isEmpty - * @return {@link #isEmpty(String, boolean, boolean)} - */ - public static String isEmpty(String s, boolean isEmpty) { - return isEmpty(s, isEmpty, false); - } - /** - * nullable = true - * @param s - * @param isEmpty <=0 - * @param trim s = trim(s); - * @return {@link #isEmpty(String, boolean, boolean, boolean)} - */ - public static String isEmpty(String s, boolean isEmpty, boolean trim) { - return isEmpty(s, isEmpty, trim, true); - } - /** - * @param s - * @param isEmpty <=0 - * @param trim s = trim(s); - * @param nullable isNull(s, true) + OR + - * @return {@link #lengthCompare(String, String)} - */ - public static String isEmpty(String s, boolean isEmpty, boolean trim, boolean nullable) { - if (trim) { - s = trim(s); - } - return (nullable ? isNull(s, true) + OR : "") + lengthCompare(s, (isEmpty ? "<=" : ">") + "0"); - } - /** - * @param s 因为POWER(x,y)等函数含有不只一个key,所以需要客户端添加进去,服务端检测到条件中有'('和')'时就不转换,直接当SQL语句查询 - * @return {@link #length(String)} + compare - */ - public static String lengthCompare(String s, String compare) { - return length(s) + compare; - } - - - /** - * @param s 因为POWER(x,y)等函数含有不只一个key,所以需要客户端添加进去,服务端检测到条件中有'('和')'时就不转换,直接当SQL语句查询 - * @return "length(" + s + ")" - */ - public static String length(String s) { - return "length(" + s + ")"; - } - /** - * @param s 因为POWER(x,y)等函数含有不只一个key,所以需要客户端添加进去,服务端检测到条件中有'('和')'时就不转换,直接当SQL语句查询 - * @return "char_length(" + s + ")" - */ - public static String charLength(String s) { - return "char_length(" + s + ")"; - } - - /** - * @param s - * @return "trim(" + s + ")" - */ - public static String trim(String s) { - return "trim(" + s + ")"; - } - /** - * @param s - * @return "ltrim(" + s + ")" - */ - public static String trimLeft(String s) { - return "ltrim(" + s + ")"; - } - /** - * @param s - * @return "rtrim(" + s + ")" - */ - public static String trimRight(String s) { - return "rtrim(" + s + ")"; - } - - /** - * @param s - * @param n - * @return "left(" + s + "," + n + ")" - */ - public static String left(String s, int n) { - return "left(" + s + "," + n + ")"; - } - /** - * @param s - * @param n - * @return "right(" + s + "," + n + ")" - */ - public static String right(String s, int n) { - return "right(" + s + "," + n + ")"; - } - - /** - * @param s - * @param start - * @param end - * @return "substring(" + s + "," + start + "," + (end-start) + ")" - */ - public static String subString(String s, int start, int end) { - return "substring(" + s + "," + start + "," + (end-start) + ")"; - } - - /** - * @param s - * @param c - * @return "instr(" + s + "," + c + ")" - */ - public static String indexOf(String s, String c) { - return "instr(" + s + "," + c + ")"; - } - - /** - * @param s - * @param c1 - * @param c2 - * @return - */ - public static String replace(String s, String c1, String c2) { - return "replace(" + s + "," + c1 + "," + c2 + ")"; - } - - /** - * @param s1 - * @param s2 - * @return "strcmp(" + s1 + "," + s2 + ")" - */ - public static String equals(String s1, String s2) { - return "strcmp(" + s1 + "," + s2 + ")"; - } - - /** - * @param s - * @return "upper(" + s + ")" - */ - public static String toUpperCase(String s) { - return "upper(" + s + ")"; - } - /** - * @param s - * @return "lower(" + s + ")" - */ - public static String toLowerCase(String s) { - return "lower(" + s + ")"; - } - - - - - - public static final int SEARCH_TYPE_CONTAIN_FULL = 0; - public static final int SEARCH_TYPE_CONTAIN_ORDER = 1; - public static final int SEARCH_TYPE_CONTAIN_SINGLE = 2; - public static final int SEARCH_TYPE_CONTAIN_ANY = 3; - public static final int SEARCH_TYPE_START = 4; - public static final int SEARCH_TYPE_END = 5; - public static final int SEARCH_TYPE_START_SINGLE = 6; - public static final int SEARCH_TYPE_END_SINGLE = 7; - public static final int SEARCH_TYPE_PART_MATCH = 8; - /**获取搜索值 - * @param s - * @return - */ - public static String search(String s) { - return search(s, SEARCH_TYPE_CONTAIN_FULL); - } - /**获取搜索值 - * @param s - * @param type - * @return - */ - public static String search(String s, int type) { - return search(s, type, true); - } - /**获取搜索值 - * @param s - * @param type - * @param ignoreCase - * @return default SEARCH_TYPE_CONTAIN_FULL - */ - public static String search(String s, int type, boolean ignoreCase) { - if (s == null) { - return null; - } - switch (type) { - case SEARCH_TYPE_CONTAIN_SINGLE: - return "_" + s + "_"; - case SEARCH_TYPE_CONTAIN_ORDER: - char[] cs = s.toCharArray(); - if (cs == null) { - return null; - } - String value = "%"; - for (int i = 0; i < cs.length; i++) { - value += cs[i] + "%"; - } - return value; - case SEARCH_TYPE_START: - return s + "%"; - case SEARCH_TYPE_END: - return "%" + s; - case SEARCH_TYPE_START_SINGLE: - return s + "_"; - case SEARCH_TYPE_END_SINGLE: - return "_" + s; - case SEARCH_TYPE_CONTAIN_ANY: - case SEARCH_TYPE_PART_MATCH: - cs = s.toCharArray(); - if (cs == null) { - return null; - } - value = ""; - for (int i = 0; i < cs.length; i++) { - value += search("" + cs[i], SEARCH_TYPE_CONTAIN_FULL, ignoreCase); - } - return value; - default://SEARCH_TYPE_CONTAIN_FULL - return "%" + s + "%"; - } - } - -} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/.classpath b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/.classpath similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/.classpath rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/.classpath diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/.project b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/.project similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/.project rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/.project diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/AndroidManifest.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/AndroidManifest.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/ic_launcher-web.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/ic_launcher-web.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/ic_launcher-web.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/ic_launcher-web.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/proguard-project.txt b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/proguard-project.txt similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/proguard-project.txt rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/proguard-project.txt diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/project.properties b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/project.properties similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/project.properties rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/project.properties diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/angel.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/angel.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/angel.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/angel.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/back_black_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/back_black_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/back_black_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/back_black_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/call_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/call_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/call_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/call_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/comment.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/comment.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/comment.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/comment.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/commented.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/commented.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/commented.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/commented.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/default_head.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/default_head.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/default_head.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/default_head.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/delete_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/earth_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light_small.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light_small.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/edit_light_small.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/flash_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/flash_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/flash_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/flash_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/ic_launcher.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/loading.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/loading.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/loading.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/loading.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_add.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_add.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_add.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_add.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/mail_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/menu_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/off.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/off.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/off.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/off.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/on.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/on.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/on.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/on.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/praise.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/praise.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/praise.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/praise.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/praised.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/praised.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/praised.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/praised.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/qrcode.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/qrcode.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/qrcode.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/qrcode.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/search.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/search.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/search.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/search.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/search_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/search_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/search_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/search_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/send_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/send_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/send_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/send_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/setting_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/star.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/star.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/star.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/star.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/star_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/star_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable-hdpi/star_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable-hdpi/star_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/earth_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/earth_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/earth_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/earth_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/gesture_left.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/gesture_left.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/gesture_left.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/gesture_left.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/gesture_right.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/gesture_right.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/gesture_right.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/gesture_right.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/ic_launcher.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/ic_launcher.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/mail_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/mail_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/mail_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/mail_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/search_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/search_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/search_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/search_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/setting_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/setting_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/setting_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/setting_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/splash.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/splash.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/drawable/splash.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/drawable/splash.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/about_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/about_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/about_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/about_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/comment_container_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/comment_container_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/comment_container_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/comment_container_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/comment_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/comment_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/comment_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/comment_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/comment_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/comment_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/comment_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/comment_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/login_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/login_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/login_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/login_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/main_tab_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/main_tab_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/main_tab_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/main_tab_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/mine_fragment.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/mine_fragment.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/mine_fragment.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/mine_fragment.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/moment_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/moment_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/moment_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/moment_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/moment_list_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/moment_list_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/moment_list_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/moment_list_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/moment_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/moment_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/moment_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/moment_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/number_password_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/number_password_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/number_password_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/number_password_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/password_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/password_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/password_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/password_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/qrcode_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/qrcode_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/qrcode_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/qrcode_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/scan_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/scan_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/scan_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/scan_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/setting_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/setting_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/setting_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/setting_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/user_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/user_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/user_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/user_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/user_list_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/user_list_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/user_list_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/user_list_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/user_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/user_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/user_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/user_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/wallet_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/wallet_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/layout/wallet_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/layout/wallet_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/values/dimens.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/values/dimens.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/values/dimens.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/values/dimens.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/values/strings.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/values/strings.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/values/strings.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/values/strings.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/values/styles.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/values/styles.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/res/values/styles.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/res/values/styles.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/AboutActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/AboutActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/AboutActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/AboutActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/LoginActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/LoginActivity.java similarity index 95% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/LoginActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/LoginActivity.java index 977e44d92..85c83fdaf 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/LoginActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/LoginActivity.java @@ -174,7 +174,7 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { JSONResponse response = new JSONResponse(resultJson); User user = response.getObject(User.class); - if (response.isSucceed() == false) { + if (response.isSuccess() == false) { switch (response.getCode()) { case JSONResponse.CODE_NOT_FOUND: showShortToast("账号不存在,请先注册"); @@ -192,6 +192,7 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { break; } } else { + user.setPhone(phone); APIJSONApplication.getInstance().saveCurrentUser(user); if (APIJSONApplication.getInstance().isLoggedIn() == false) { showShortToast((requestCode == Login.TYPE_PASSWORD ? "密码" : "验证码") + "错误"); diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MainTabActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MainTabActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MainTabActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MainTabActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MineFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MineFragment.java similarity index 98% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MineFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MineFragment.java index cd22c9796..ab7849bf9 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MineFragment.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MineFragment.java @@ -43,7 +43,6 @@ import apijson.demo.client.application.APIJSONApplication; import apijson.demo.client.base.BaseFragment; import apijson.demo.client.interfaces.TopBarMenuCallback; -import apijson.demo.client.model.Login; import apijson.demo.client.model.User; import apijson.demo.client.util.HttpRequest; @@ -320,8 +319,8 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { } switch (requestCode) { case HTTP_LOUOUT: - JSONResponse response = new JSONResponse(resultJson).getJSONResponse(Login.class.getSimpleName()); - boolean succeed = JSONResponse.isSucceed(response); + JSONResponse response = new JSONResponse(resultJson).getJSONResponse(User.class.getSimpleName()); + boolean succeed = JSONResponse.isSuccess(response); Log.d(TAG, succeed ? "服务端退出成功" : "服务端退出失败"); showShortToast(succeed ? "服务端退出成功" : "服务端退出失败"); break; diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentActivity.java similarity index 97% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentActivity.java index b7db3805d..df2327958 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentActivity.java @@ -14,6 +14,22 @@ package apijson.demo.client.activity_fragment; +import java.util.List; + +import zuo.biao.apijson.JSONResponse; +import zuo.biao.library.base.BaseView.OnDataChangedListener; +import zuo.biao.library.interfaces.AdapterCallBack; +import zuo.biao.library.interfaces.CacheCallBack; +import zuo.biao.library.interfaces.OnBottomDragListener; +import zuo.biao.library.manager.CacheManager; +import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; +import zuo.biao.library.ui.AlertDialog; +import zuo.biao.library.ui.AlertDialog.OnDialogButtonClickListener; +import zuo.biao.library.util.CommonUtil; +import zuo.biao.library.util.EditTextUtil; +import zuo.biao.library.util.Log; +import zuo.biao.library.util.SettingUtil; +import zuo.biao.library.util.StringUtil; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -25,12 +41,10 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; - -import java.util.List; - import apijson.demo.client.R; import apijson.demo.client.adapter.CommentAdapter; import apijson.demo.client.application.APIJSONApplication; +import apijson.demo.client.base.BaseHttpListActivity; import apijson.demo.client.manager.HttpManager; import apijson.demo.client.model.Comment; import apijson.demo.client.model.CommentItem; @@ -40,22 +54,7 @@ import apijson.demo.client.util.HttpRequest; import apijson.demo.client.view.CommentView.OnCommentClickListener; import apijson.demo.client.view.MomentView; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONResponse; -import zuo.biao.library.base.BaseHttpListActivity; -import zuo.biao.library.base.BaseView.OnDataChangedListener; -import zuo.biao.library.interfaces.AdapterCallBack; -import zuo.biao.library.interfaces.CacheCallBack; -import zuo.biao.library.interfaces.OnBottomDragListener; -import zuo.biao.library.manager.CacheManager; -import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; -import zuo.biao.library.ui.AlertDialog; -import zuo.biao.library.ui.AlertDialog.OnDialogButtonClickListener; -import zuo.biao.library.util.CommonUtil; -import zuo.biao.library.util.EditTextUtil; -import zuo.biao.library.util.Log; -import zuo.biao.library.util.SettingUtil; -import zuo.biao.library.util.StringUtil; +import apijson.demo.server.model.BaseModel; /**用户列表界面fragment * @author Lemon @@ -351,7 +350,7 @@ private void deleteComment(CommentItem commentItem) { Log.e(TAG, "deleteComment id <= 0 >> return;"); return; } - HttpRequest.deleteComment(id, HTTP_DELETE, this); + HttpRequest.deleteComment(id, BaseModel.value(commentItem.getUserId()), HTTP_DELETE, this); } @@ -367,7 +366,7 @@ public void getListAsync(final int page) { @Override public List parseArray(String json) { - return JSON.parseArray(new JSONResponse(json).getArray(CommentItem.class.getSimpleName()), CommentItem.class); + return new JSONResponse(json).getList(CommentItem.class); } @Override @@ -520,7 +519,7 @@ public void run() { if (requestCode == HTTP_GET_MOMENT) { MomentItem data = JSONResponse.toObject(response, MomentItem.class); if (data == null || data.getId() <= 0) { - if (JSONResponse.isSucceed(response)) { + if (JSONResponse.isSuccess(response)) { showShortToast("动态不存在"); MomentActivity.super.finish();//需要动画,且不需要保存缓存 return; @@ -532,9 +531,12 @@ public void run() { return; } + if (verifyHttpLogin(response.getCode()) == false) { + return; + } JSONResponse comment = response.getJSONResponse(Comment.class.getSimpleName()); - final boolean succeed = JSONResponse.isSucceed(comment); + final boolean succeed = JSONResponse.isSuccess(comment); String operation = "操作"; switch (requestCode) { case HTTP_COMMENT: // 新增评论 diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListActivity.java similarity index 91% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListActivity.java index 02600f72c..0b579666f 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListActivity.java @@ -19,6 +19,7 @@ import android.content.Intent; import android.os.Bundle; import android.view.View; +import android.widget.ImageView; import com.alibaba.fastjson.JSONObject; @@ -134,9 +135,15 @@ protected void onCreate(Bundle savedInstanceState) { //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + private boolean isCurrentUser = false; + + private ImageView ivMomentListForward; private MomentListFragment fragment; @Override public void initView() {//必须在onCreate方法内调用 + ivMomentListForward = (ImageView) findViewById(R.id.ivMomentListForward); + ivMomentListForward.setVisibility(showSearch ? View.VISIBLE : View.GONE); + String title; switch (range) { case MomentListFragment.RANGE_ALL: @@ -146,7 +153,14 @@ public void initView() {//必须在onCreate方法内调用 // title = "动态"; // break; case MomentListFragment.RANGE_USER: - title = APIJSONApplication.getInstance().isCurrentUser(id) ? "我的动态" : "TA的动态"; + isCurrentUser = APIJSONApplication.getInstance().isCurrentUser(id); + title = isCurrentUser ? "我的动态" : "TA的动态"; + if (isCurrentUser) { + ivMomentListForward.setVisibility(View.VISIBLE); + ivMomentListForward.setImageResource(R.drawable.add); + } else { + ivMomentListForward.setVisibility(View.GONE); + } break; case MomentListFragment.RANGE_USER_CIRCLE: title = "朋友圈"; @@ -158,10 +172,9 @@ public void initView() {//必须在onCreate方法内调用 tvBaseTitle.setText(title); autoSetTitle(); - findViewById(R.id.ivMomentListForward).setVisibility(showSearch ? View.VISIBLE : View.GONE); - fragment = MomentListFragment.createInstance(range, id, search); + fragment.setIsAdd(isCurrentUser); fragmentManager .beginTransaction() diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListFragment.java similarity index 85% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListFragment.java index 881f9768e..8025b37e0 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListFragment.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListFragment.java @@ -14,6 +14,19 @@ package apijson.demo.client.activity_fragment; +import java.util.List; + +import zuo.biao.apijson.JSON; +import zuo.biao.apijson.JSONRequest; +import zuo.biao.apijson.JSONResponse; +import zuo.biao.apijson.SQL; +import zuo.biao.apijson.StringUtil; +import zuo.biao.library.base.BaseView.OnDataChangedListener; +import zuo.biao.library.interfaces.AdapterCallBack; +import zuo.biao.library.interfaces.CacheCallBack; +import zuo.biao.library.interfaces.OnBottomDragListener; +import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; +import zuo.biao.library.ui.EditTextInfoWindow; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; @@ -27,30 +40,17 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.TextView; - -import com.alibaba.fastjson.JSONObject; - -import java.util.List; - import apijson.demo.client.R; import apijson.demo.client.adapter.MomentAdapter; import apijson.demo.client.application.APIJSONApplication; import apijson.demo.client.base.BaseHttpListFragment; import apijson.demo.client.interfaces.TopBarMenuCallback; +import apijson.demo.client.model.Moment; import apijson.demo.client.model.MomentItem; import apijson.demo.client.util.CommentUtil; import apijson.demo.client.util.HttpRequest; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONRequest; -import zuo.biao.apijson.JSONResponse; -import zuo.biao.apijson.SQL; -import zuo.biao.apijson.StringUtil; -import zuo.biao.library.base.BaseView.OnDataChangedListener; -import zuo.biao.library.interfaces.AdapterCallBack; -import zuo.biao.library.interfaces.CacheCallBack; -import zuo.biao.library.interfaces.OnBottomDragListener; -import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; -import zuo.biao.library.ui.EditTextInfoWindow; + +import com.alibaba.fastjson.JSONObject; /**用户列表界面fragment * @author Lemon @@ -204,7 +204,7 @@ public void refreshAdapter() { }); } - + private TextView leftMenu; @SuppressLint("InflateParams") @Override @@ -261,6 +261,12 @@ public void initData() {//必须调用 } + private boolean isAdd = false; + public void setIsAdd(boolean isAdd) { + this.isAdd = isAdd; + } + + @Override public void getListAsync(final int page) { HttpRequest.getMomentList(range, id, search, getCacheCount(), page, -page, this); @@ -332,10 +338,17 @@ public void onDragBottom(boolean rightToLeft) { return; } - showShortToast("输入为空则查看全部"); - toActivity(EditTextInfoWindow.createIntent(context - , EditTextInfoWindow.TYPE_NAME, "关键词", null), - REQUEST_TO_EDIT_TEXT_INFO, false); + if (isAdd) { + toActivity(EditTextInfoWindow.createIntent(context + , EditTextInfoWindow.TYPE_NOTE, "发动态", "说点什么吧~"), + REQUEST_TO_EDIT_TEXT_INFO, false); + } else { + showShortToast("输入为空则查看全部"); + toActivity(EditTextInfoWindow.createIntent(context + , EditTextInfoWindow.TYPE_NAME, "关键词", null), + REQUEST_TO_EDIT_TEXT_INFO, false); + } + } } @@ -346,6 +359,40 @@ public void onDataChanged() { } } + private static final int HTTP_ADD = 1; + + @Override + public void onHttpResponse(int requestCode, String resultJson, Exception e) { + JSONResponse response = new JSONResponse(resultJson); + if ((range == RANGE_USER_CIRCLE || requestCode == HTTP_ADD) && verifyHttpLogin(response.getCode()) == false) { + return; + } + switch (requestCode) { + case HTTP_ADD: + response = response.getJSONResponse(Moment.class.getSimpleName()); + + if (JSONResponse.isSuccess(response) == false) { + showShortToast("发布失败,请检查网络后重试"); + } else { + runUiThread(new Runnable() { + + @Override + public void run() { + showShortToast("发布成功"); + lvBaseList.onRefresh(); + } + }); + } + break; + default: + super.onHttpResponse(requestCode, resultJson, e); + break; + } + + } + + + //系统自带监听方法 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -363,14 +410,19 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { case REQUEST_TO_EDIT_TEXT_INFO: if (data != null) { String value = StringUtil.getString(data.getStringExtra(EditTextInfoWindow.RESULT_VALUE)); - String split = ""; - JSONRequest search = new JSONRequest(); - if (StringUtil.isNotEmpty(value, true)) { - split = ":"; - search.putSearch(HttpRequest.CONTENT, value, SQL.SEARCH_TYPE_CONTAIN_ORDER); + + if (isAdd) { + HttpRequest.addMoment(value, HTTP_ADD, this); + } else { + String split = ""; + JSONRequest search = new JSONRequest(); + if (StringUtil.isNotEmpty(value, true)) { + split = ":"; + search.putsSearch(HttpRequest.CONTENT, value, SQL.SEARCH_TYPE_CONTAIN_ORDER); + } + toActivity(MomentListActivity.createIntent(context, range, id, search, false) + .putExtra(INTENT_TITLE, "搜索" + split + value)); } - toActivity(MomentListActivity.createIntent(context, range, id, search, false) - .putExtra(INTENT_TITLE, "搜索" + split + value)); } break; default: diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/NumberPasswordActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/NumberPasswordActivity.java similarity index 95% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/NumberPasswordActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/NumberPasswordActivity.java index 19fdb9769..80af3e746 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/NumberPasswordActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/NumberPasswordActivity.java @@ -33,7 +33,7 @@ import android.widget.TextView; import apijson.demo.client.R; import apijson.demo.client.util.HttpRequest; -import apijson.demo.server.model.Password; +import apijson.demo.server.model.Privacy; /**支付密码设置界面activity * @author Lemon @@ -312,7 +312,7 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { dismissProgressDialog(); switch (requestCode) { case HTTP_SET_PASSWORD: - if (response.isSucceed()) { + if (response.isSuccess()) { showShortToast(R.string.change_succeed); saveAndExit(true); } else { @@ -371,7 +371,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (data != null) { password = data.getStringExtra(NumberPasswordActivity.RESULT_PASSWORD); if (StringUtil.isNotEmpty(password, true)) { - HttpRequest.setPassword(Password.TYPE_PAY, password, phone, verify + HttpRequest.setPassword(Privacy.PASSWORD_TYPE_PAY, password, phone, verify , HTTP_SET_PASSWORD, this); } } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/PasswordActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/PasswordActivity.java similarity index 90% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/PasswordActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/PasswordActivity.java index 3c5e891ee..1a3cbe0b3 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/PasswordActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/PasswordActivity.java @@ -38,7 +38,7 @@ import apijson.demo.client.model.User; import apijson.demo.client.model.Verify; import apijson.demo.client.util.HttpRequest; -import apijson.demo.server.model.UserPrivacy; +import apijson.demo.server.model.Privacy; /**注册、验证码登录、重置密码等密码相关界面 * @author Lemon @@ -87,7 +87,7 @@ public Activity getActivity() { public static final int TYPE_VERIFY = 0; public static final int TYPE_REGISTER = 1; - public static final int TYPE_RESET = 3; + public static final int TYPE_RESET = 2; private int type = TYPE_VERIFY; private String phone; @@ -212,7 +212,7 @@ private void getVerify() { /**从服务器获取验证码 */ - private void getVerifyFromServer() { + private void getVerifyFromServer(int type) { runUiThread(new Runnable() { @Override @@ -221,7 +221,7 @@ public void run() { } }); - HttpRequest.getVerify(StringUtil.getTrimedString(etPasswordPhone), HTTP_GET_VERIFY, this); + HttpRequest.getVerify(type, StringUtil.getTrimedString(etPasswordPhone), HTTP_GET_VERIFY, this); } /**下一步 @@ -245,16 +245,20 @@ private void toNextStep() { case TYPE_REGISTER: register(); break; - default: - checkVerify(true); + case TYPE_VERIFY: + checkVerify(Verify.TYPE_LOGIN, true); + break; + case TYPE_RESET: + checkVerify(Verify.TYPE_PASSWORD, true); break; } } /**验证验证码 + * @param type * @param fromServer */ - private boolean checkVerify(boolean fromServer) { + private boolean checkVerify(int type, boolean fromServer) { if (EditTextUtil.isInputedCorrect(context, etPasswordPhone, EditTextUtil.TYPE_PHONE) == false || EditTextUtil.isInputedCorrect(context, etPasswordVerify, EditTextUtil.TYPE_VERIFY) == false) { return false; @@ -262,7 +266,7 @@ private boolean checkVerify(boolean fromServer) { if (fromServer) { showProgressDialog(); - HttpRequest.checkVerify(StringUtil.getTrimedString(etPasswordPhone), + HttpRequest.checkVerify(type, StringUtil.getTrimedString(etPasswordPhone), StringUtil.getTrimedString(etPasswordVerify), HTTP_CHECK_VERIFY, this); } @@ -271,7 +275,7 @@ private boolean checkVerify(boolean fromServer) { private void register() { - if (checkVerify(false) == false) { + if (checkVerify(Verify.TYPE_REGISTER, false) == false) { return; } showProgressDialog(); @@ -345,23 +349,23 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { dismissProgressDialog(); switch (requestCode) { case HTTP_CHECK_REGISTER: - response2 = response.getJSONResponse(HttpRequest.USER_PRIVACY_); + response2 = response.getJSONResponse(HttpRequest.PRIVACY_); Log.i(TAG, "checkPassword result = " + resultJson); runUiThread(new Runnable() { @Override public void run() { showVerifyGet(false); - if (JSONResponse.isSucceed(response2) == false) { + if (JSONResponse.isSuccess(response2) == false) { showShortToast(R.string.get_failed); } else if (JSONResponse.isExist(response2)) { if (type == TYPE_REGISTER) { showShortToast("手机号已经注册"); } else { - getVerifyFromServer(); + getVerifyFromServer(type == TYPE_VERIFY ? Verify.TYPE_LOGIN : Verify.TYPE_PASSWORD); } } else {//手机号未被注册过 if (type == TYPE_REGISTER) { - getVerifyFromServer(); + getVerifyFromServer(Verify.TYPE_REGISTER); } else { showShortToast("手机号未注册"); } @@ -412,7 +416,7 @@ public void run() { case HTTP_REGISTER: User user = response.getObject(User.class); dismissProgressDialog(); - if (user == null || user.getId() <= 0 || JSONResponse.isSucceed( + if (user == null || user.getId() <= 0 || JSONResponse.isSuccess( response.getJSONResponse(User.class.getSimpleName())) == false) { if (response.getCode() == CODE_TIME_OUT || response.getCode() == 412) { EditTextUtil.showInputedError(context, etPasswordVerify @@ -428,9 +432,9 @@ public void run() { } break; case HTTP_RESET_PASSWORD: - response2 = response.getJSONResponse(UserPrivacy.class.getSimpleName()); + response2 = response.getJSONResponse(Privacy.class.getSimpleName()); dismissProgressDialog(); - if (JSONResponse.isSucceed(response2) == false) { + if (JSONResponse.isSuccess(response2) == false) { EditTextUtil.showInputedError(context, etPasswordVerify , response.getCode() == CODE_TIME_OUT ? "验证码已过期" : "验证码错误"); } else { diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/QRCodeActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/QRCodeActivity.java similarity index 97% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/QRCodeActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/QRCodeActivity.java index 4efa2ac12..126c295e7 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/QRCodeActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/QRCodeActivity.java @@ -133,9 +133,7 @@ public void run() { @Override public void run() { ImageLoaderUtil.loadImage(ivQRCodeHead, user.getHead()); - tvQRCodeName.setText(StringUtil.getTrimedString( - StringUtil.isNotEmpty(user.getName(), true) - ? user.getName() : user.getPhone())); + tvQRCodeName.setText(StringUtil.getTrimedString(user.getName())); } }); diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/ScanActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/ScanActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/ScanActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/ScanActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SettingActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SettingActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SettingActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SettingActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SplashActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SplashActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SplashActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SplashActivity.java index 33f24ae2b..678c76270 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SplashActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/SplashActivity.java @@ -44,5 +44,10 @@ public void finish() { super.finish(); overridePendingTransition(R.anim.fade, R.anim.hold); } + + @Override + public void onBackPressed() { + //super.onBackPressed(); + } } \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserActivity.java similarity index 93% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserActivity.java index a2edbe8c3..6f3f89ea3 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserActivity.java @@ -38,6 +38,7 @@ import apijson.demo.client.util.HttpRequest; import apijson.demo.client.util.MenuUtil; import apijson.demo.client.view.UserView; +import apijson.demo.server.model.Privacy; import zuo.biao.apijson.JSONRequest; import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseView.OnDataChangedListener; @@ -188,12 +189,12 @@ private void setUser(User user_) { * @param momentList_ */ private void setUser(User user_, List momentList_) { + if (user_ == null) { + Log.w(TAG, "setUser user_ == null >> user = new User();"); + user_ = new User(); + } this.user = user_; this.momentList = momentList_; - if (user == null) { - Log.w(TAG, "setUser user == null >> user = new User();"); - user = new User(); - } if (momentList == null) { momentList = new ArrayList<>(); } @@ -211,7 +212,6 @@ public void run() { userView.bindView(user);//方式三 tvUserRemark.setText(StringUtil.getTrimedString(user.getHead())); - tvUserPhone.setText(StringUtil.getTrimedString(user.getPhone())); if (adapter == null) { adapter = new GridAdapter(context); @@ -223,6 +223,26 @@ public void run() { }); } + + private Privacy privacy; + /**显示用户隐私信息 + * @param privacy + */ + private void setPrivacy(Privacy privacy_) { + if (privacy_ == null) { + Log.w(TAG, "setUser user_ == null >> user = new User();"); + privacy_ = new Privacy(); + } + this.privacy = privacy_; + runUiThread(new Runnable() { + + @Override + public void run() { + tvUserPhone.setText(StringUtil.getTrimedString(privacy.getPhone())); + } + }); + } + /**裁剪图片 * @param path */ @@ -270,7 +290,7 @@ public void onDataChanged() { bottomMenuView.bindView(MenuUtil.getMenuList(MenuUtil.USER, id, ! User.isFriend(currentUser, id))); } - runThread(TAG + "run", new Runnable() { + runThread(TAG + "onDataChanged", new Runnable() { @Override public void run() { @@ -284,10 +304,12 @@ public void run() { @Override public void run() { setUser(user, momentList); + setPrivacy(null); } }); HttpRequest.getUser(id, ! isOnEditMode, HTTP_GET, UserActivity.this); + HttpRequest.getPrivacy(id, HTTP_GET_PRIVACY, UserActivity.this); } }); @@ -386,8 +408,8 @@ public void onClick(View v) { break; case R.id.tvUserViewTag: if (isOnEditMode) { - toActivity(EditTextInfoActivity.createIntent(context, "标签" - , StringUtil.getTrimedString(tvUserPhone)), REQUEST_TO_EDIT_TEXT_INFO_TAG); + toActivity(EditTextInfoWindow.createIntent(context + , "标签", user.getTag()), REQUEST_TO_EDIT_TEXT_INFO_TAG, false); } else { CommonUtil.copyText(context, user.getTag()); } @@ -442,6 +464,7 @@ public void onBottomMenuItemClick(int intentCode) { //对应HttpRequest.getUser(id, 0, UserActivity.this); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< protected static final int HTTP_GET = 1; + protected static final int HTTP_GET_PRIVACY = 5; protected static final int HTTP_ADD = 2; protected static final int HTTP_DELETE = 3; protected static final int HTTP_PUT = 4; @@ -450,14 +473,14 @@ public void onBottomMenuItemClick(int intentCode) { public void onHttpResponse(int requestCode, String resultJson, Exception e) { JSONResponse response = new JSONResponse(resultJson); JSONResponse response2 = response.getJSONResponse(User.class.getSimpleName()); - boolean isSucceed = JSONResponse.isSucceed(response2); + boolean isSucceed = JSONResponse.isSuccess(response2); dismissProgressDialog(); switch (requestCode) { case HTTP_GET: User user = response.getObject(User.class); if (user == null || user.getId() <= 0) { - if (JSONResponse.isSucceed(response)) { + if (JSONResponse.isSuccess(response)) { showShortToast("用户已注销"); super.finish();//需要动画,且不需要保存缓存 return; @@ -466,8 +489,14 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { } setUser(user, response.getList(Moment.class.getSimpleName() + "[]", Moment.class)); break; + case HTTP_GET_PRIVACY: + setPrivacy(response.getObject(Privacy.class)); + break; case HTTP_ADD: case HTTP_DELETE: + if (verifyHttpLogin(response.getCode()) == false) { + return; + } if (isSucceed) { showShortToast(requestCode == HTTP_ADD ? R.string.add_succeed : R.string.delete_succeed); sendBroadcast(new Intent(ActionUtil.ACTION_RELOAD_CURRENT_USER)); @@ -476,6 +505,9 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { } break; case HTTP_PUT: + if (verifyHttpLogin(response.getCode()) == false) { + return; + } if (isSucceed) { isDataChanged = false; sendBroadcast(new Intent(ActionUtil.ACTION_RELOAD_CURRENT_USER)); @@ -515,7 +547,7 @@ public void onClick(View v) { break; case R.id.llUserPhone: toActivity(EditTextInfoWindow.createIntent(context, EditTextInfoWindow.TYPE_PHONE - , "手机", user.getPhone()), REQUEST_TO_EDIT_TEXT_INFO_PHONE, false); + , "手机", privacy.getPhone()), REQUEST_TO_EDIT_TEXT_INFO_PHONE, false); break; default: break; @@ -579,7 +611,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { user.setName(value); break; case REQUEST_TO_EDIT_TEXT_INFO_PHONE: - user.setPhone(value); + privacy.setPhone(value); break; case REQUEST_TO_EDIT_TEXT_INFO_REMARK: user.setHead(value); diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListFragment.java index 0ea1fe1c4..056c07ce7 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListFragment.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/UserListFragment.java @@ -337,15 +337,15 @@ public void onDragBottom(boolean rightToLeft) { if (searchType <= 0) { searchType = EditTextInfoWindow.TYPE_PHONE; } - if (searchType == EditTextInfoWindow.TYPE_NAME) { +// if (searchType == EditTextInfoWindow.TYPE_NAME) { toActivity(EditTextInfoWindow.createIntent(context , EditTextInfoWindow.TYPE_NAME, "姓名", null), REQUEST_TO_EDIT_TEXT_INFO_SEARCH, false); - } else { - toActivity(EditTextInfoWindow.createIntent(context - , EditTextInfoWindow.TYPE_PHONE, "手机号", null), - REQUEST_TO_EDIT_TEXT_INFO_ADD, false); - } +// } else { +// toActivity(EditTextInfoWindow.createIntent(context +// , EditTextInfoWindow.TYPE_PHONE, "手机号", null), +// REQUEST_TO_EDIT_TEXT_INFO_ADD, false); +// } } } @@ -358,6 +358,16 @@ public void onDataChanged() { } } + + @Override + public void onHttpResponse(int requestCode, String resultJson, Exception e) { + JSONResponse response = new JSONResponse(resultJson); + if ((range == RANGE_USER_FRIEND) && verifyHttpLogin(response.getCode()) == false) { + return; + } + super.onHttpResponse(requestCode, resultJson, e); + } + //系统自带监听方法 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -383,9 +393,9 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (StringUtil.isNotEmpty(value, true)) { split = ":"; if (isSearch) { - search.putSearch(HttpRequest.NAME, value); + search.putsSearch(HttpRequest.NAME, value); } else { - search.put(HttpRequest.PHONE, value); + search.puts(HttpRequest.PHONE, value); } } intent = isSearch diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/WalletActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/WalletActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/WalletActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/WalletActivity.java index 28b324e54..5588e365a 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/WalletActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/WalletActivity.java @@ -15,7 +15,6 @@ package apijson.demo.client.activity_fragment; import zuo.biao.apijson.JSONResponse; -import zuo.biao.library.base.BaseActivity; import zuo.biao.library.interfaces.OnBottomDragListener; import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; import zuo.biao.library.ui.EditTextInfoActivity; @@ -29,9 +28,9 @@ import android.view.View.OnClickListener; import android.widget.TextView; import apijson.demo.client.R; -import apijson.demo.client.model.Wallet; +import apijson.demo.client.base.BaseActivity; import apijson.demo.client.util.HttpRequest; -import apijson.demo.server.model.UserPrivacy; +import apijson.demo.server.model.Privacy; /**钱包界面 * @author Lemon @@ -84,8 +83,8 @@ public void initView() {//必须调用 } - private UserPrivacy privacy; - public void setWallet(UserPrivacy privacy_) { + private Privacy privacy; + public void setWallet(Privacy privacy_) { this.privacy = privacy_; runUiThread(new Runnable() { @@ -94,7 +93,7 @@ public void run() { dismissProgressDialog(); tvBaseTitle.setText(getTitleName()); if (privacy == null) { - privacy = new UserPrivacy(); + privacy = new Privacy(); } tvWalletCount.setText(StringUtil.getPrice(privacy.getBalance(), StringUtil.PRICE_FORMAT_PREFIX)); } @@ -118,7 +117,7 @@ public void run() { public void initData() {//必须调用 showProgressDialog(getTitleName()); - HttpRequest.getUserPrivacy(HTTP_GET, this); + HttpRequest.getPrivacy(HTTP_GET, this); } public String getTitleName() { @@ -167,7 +166,11 @@ public void onHttpResponse(final int requestCode, final String resultJson, Excep public void run() { JSONResponse response = new JSONResponse(resultJson); - isSucceed = JSONResponse.isSucceed(response); + if (verifyHttpLogin(response.getCode()) == false) { + return; + } + + isSucceed = JSONResponse.isSuccess(response); dismissProgressDialog(); switch (requestCode) { @@ -187,7 +190,7 @@ public void run() { break; case HTTP_GET: if (isSucceed) { - setWallet(response.getObject(UserPrivacy.class)); + setWallet(response.getObject(Privacy.class)); } else { showShortToast(R.string.get_failed); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/CommentAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/CommentAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/CommentAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/CommentAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/MomentAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/MomentAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/MomentAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/MomentAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/UserAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/UserAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/UserAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/adapter/UserAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/application/APIJSONApplication.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/application/APIJSONApplication.java similarity index 93% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/application/APIJSONApplication.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/application/APIJSONApplication.java index 2a81150e7..9bd686d1f 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/application/APIJSONApplication.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/application/APIJSONApplication.java @@ -75,6 +75,10 @@ public void saveCurrentUser(User user) { return; } + if (currentUser != null && user.getId().equals(currentUser.getId()) + && StringUtil.isNotEmpty(user.getPhone(), true) == false) { + user.setPhone(currentUser.getPhone()); + } currentUser = user; DataManager.getInstance().saveCurrentUser(currentUser); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseActivity.java index 682f131f3..df04738e7 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -48,7 +49,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseBottomTabActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseBottomTabActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseBottomTabActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseBottomTabActivity.java index 653476213..c4f2a86f2 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseBottomTabActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseBottomTabActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -48,7 +49,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseFragment.java index bd744df08..bfbe974f7 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseFragment.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseFragment.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -55,7 +56,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListActivity.java index f353b3e21..b90a6074f 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -50,7 +51,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListFragment.java index 283f74611..4e2b70db8 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListFragment.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListFragment.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -61,6 +62,17 @@ private void setCurrentUser() { protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } /**未登录会toLoginActivity(); * @return isLoggedIn */ diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListActivity.java index e6229ad48..3314a6a3f 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -51,7 +52,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListFragment.java index 87fc934ea..69b047fe0 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListFragment.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseListFragment.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -58,7 +59,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/OnTopBarClickListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/OnTopBarClickListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/OnTopBarClickListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/OnTopBarClickListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/TopBarMenuCallback.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/TopBarMenuCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/TopBarMenuCallback.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/interfaces/TopBarMenuCallback.java diff --git a/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/DataManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/DataManager.java new file mode 100755 index 000000000..93c2e5a25 --- /dev/null +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/DataManager.java @@ -0,0 +1,198 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.client.manager; + +import android.content.Context; +import android.content.SharedPreferences; + +import apijson.demo.client.application.APIJSONApplication; +import apijson.demo.client.model.User; +import zuo.biao.library.util.JSON; +import zuo.biao.library.util.Log; +import zuo.biao.library.util.StringUtil; + +/**数据工具类 + * @author Lemon + */ +public class DataManager { + private final String TAG = "DataManager"; + + private Context context; + private DataManager(Context context) { + this.context = context; + } + + private static DataManager instance = new DataManager(APIJSONApplication.getInstance()); + public static DataManager getInstance() { + return instance; + } + + //用户 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + private String PATH_USER = "PATH_USER"; + + public final String KEY_USER = "KEY_USER"; + public final String KEY_USER_ID = "KEY_USER_ID"; + public final String KEY_USER_NAME = "KEY_USER_NAME"; + public final String KEY_USER_PHONE = "KEY_USER_PHONE"; + + public final String KEY_CURRENT_USER_ID = "KEY_CURRENT_USER_ID"; + public final String KEY_LAST_USER_ID = "KEY_LAST_USER_ID"; + + + /**判断是否为当前用户 + * @param userId + * @return + */ + public boolean isCurrentUser(long userId) { + return userId > 0 && userId == getCurrentUserId(); + } + + /**获取当前用户id + * @return + */ + public long getCurrentUserId() { + User user = getCurrentUser(); + return user == null ? 0 : user.getId(); + } + + /**获取当前用户的手机号 + * @return + */ + public String getCurrentUserPhone() { + User user = getCurrentUser(); + return user == null ? "" : user.getPhone(); + } + /**获取当前用户 + * @return + */ + public User getCurrentUser() { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + return sdf == null ? null : getUser(sdf.getLong(KEY_CURRENT_USER_ID, 0)); + } + + + /**获取最后一次登录的用户的手机号 + * @return + */ + public String getLastUserPhone() { + User user = getLastUser(); + return user == null ? "" : user.getPhone(); + } + + /**获取最后一次登录的用户 + * @return + */ + public User getLastUser() { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + return sdf == null ? null : getUser(sdf.getLong(KEY_LAST_USER_ID, 0)); + } + + /**获取用户 + * @param userId + * @return + */ + public User getUser(long userId) { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + if (sdf == null) { + Log.e(TAG, "get sdf == null >> return;"); + return null; + } + Log.i(TAG, "getUser userId = " + userId); + return JSON.parseObject(sdf.getString(StringUtil.getTrimedString(userId), null), User.class); + } + + + /**保存当前用户,只在登录或注销时调用 + * @param user user == null >> user = new User(); + */ + public void saveCurrentUser(User user) { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + if (sdf == null) { + Log.e(TAG, "saveUser sdf == null >> return;"); + return; + } + SharedPreferences.Editor editor = sdf.edit(); + if (user != null) { + editor.remove(KEY_LAST_USER_ID).putLong(KEY_LAST_USER_ID, user.getId()); + } + editor.remove(KEY_CURRENT_USER_ID).putLong(KEY_CURRENT_USER_ID, user == null ? 0 : user.getId()); + editor.commit(); + + saveUser(sdf, user); + } + + /**保存用户 + * @param user + */ + public void saveUser(User user) { + saveUser(context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE), user); + } + /**保存用户 + * @param sdf + * @param user + */ + public void saveUser(SharedPreferences sdf, User user) { + if (sdf == null || user == null) { + Log.e(TAG, "saveUser sdf == null || user == null >> return;"); + return; + } + String key = StringUtil.getTrimedString(user.getId()); + Log.i(TAG, "saveUser key = user.getId() = " + user.getId()); + sdf.edit().remove(key).putString(key, JSON.toJSONString(user)).commit(); + } + + /**删除用户 + * @param sdf + * @param userId + */ + public void removeUser(SharedPreferences sdf, long userId) { + if (sdf == null) { + Log.e(TAG, "removeUser sdf == null >> return;"); + return; + } + sdf.edit().remove(StringUtil.getTrimedString(userId)).commit(); + } + + /**设置当前用户手机号 + * @param phone + */ + public void setCurrentUserPhone(String phone) { + User user = getCurrentUser(); + if (user == null) { + user = new User(); + } + user.setPhone(phone); + saveUser(user); + } + + /**设置当前用户姓名 + * @param name + */ + public void setCurrentUserName(String name) { + User user = getCurrentUser(); + if (user == null) { + user = new User(); + } + user.setName(name); + saveUser(user); + } + + //用户 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + +} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/HttpManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/HttpManager.java similarity index 76% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/HttpManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/HttpManager.java index fbd9631a7..4752a0447 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/HttpManager.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/manager/HttpManager.java @@ -15,37 +15,32 @@ package apijson.demo.client.manager; -import android.content.Context; -import android.os.AsyncTask; -import android.text.TextUtils; - -import com.squareup.okhttp.MediaType; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.RequestBody; -import com.squareup.okhttp.Response; - -import org.json.JSONException; -import org.json.JSONObject; - import java.io.IOException; import java.net.CookieHandler; import java.net.URI; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -import apijson.demo.client.application.APIJSONApplication; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONRequest; +import org.json.JSONException; + import zuo.biao.apijson.StringUtil; import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; import zuo.biao.library.util.Log; +import android.content.Context; +import android.os.AsyncTask; +import android.text.TextUtils; +import apijson.demo.client.application.APIJSONApplication; -import static zuo.biao.apijson.StringUtil.UTF_8; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.RequestBody; +import com.squareup.okhttp.Response; /**HTTP请求管理类 * @author Lemon @@ -85,58 +80,6 @@ public static HttpManager getInstance() { public static final String KEY_COOKIE = "cookie"; - /**GET请求 - * @param url_ 接口url - * @param request 请求 - * @param requestCode - * 请求码,类似onActivityResult中请求码,当同一activity中以实现接口方式发起多个网络请求时,请求结束后都会回调 - * {@link OnHttpResponseListener#onHttpResponse(int, String, Exception)}
- * 在发起请求的类中可以用requestCode来区分各个请求 - * @param listener - */ - public void get(final String url_, final com.alibaba.fastjson.JSONObject request - , final int requestCode, final OnHttpResponseListener listener) { - new AsyncTask() { - - String result; - @Override - protected Exception doInBackground(Void... params) { - String body = request == null || request.isEmpty() ? null : JSON.toJSONString(request); - Log.d(TAG, "\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n get url = " + url_ + "\n request = \n" + body); - try { - String url = StringUtil.getNoBlankString(url_) - + (body == null ? "" : URLEncoder.encode(StringUtil.getNoBlankString(body), UTF_8)); - StringBuffer sb = new StringBuffer(); - sb.append(url); - - OkHttpClient client = getHttpClient(url); - if (client == null) { - return new Exception(TAG + ".get AsyncTask.doInBackground client == null >> return;"); - } - - result = getResponseJson(client, new Request.Builder() - .addHeader(KEY_TOKEN, getToken(url)) - .url(sb.toString()).build()); - Log.d(TAG, "\n get result = \n" + result + "\n >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); - } catch (Exception e) { - Log.e(TAG, "get AsyncTask.doInBackground try { result = getResponseJson(..." + - "} catch (Exception e) {\n" + e.getMessage()); - return e; - } - - return null; - } - - @Override - protected void onPostExecute(Exception exception) { - super.onPostExecute(exception); - listener.onHttpResponse(requestCode, result, exception); - } - - }.execute(); - - } - public static final MediaType TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); /**POST请求 @@ -150,11 +93,6 @@ protected void onPostExecute(Exception exception) { */ public void post(final String url_, final com.alibaba.fastjson.JSONObject request , final int requestCode, final OnHttpResponseListener listener) { - if (request == null || request.containsKey(JSONRequest.KEY_TAG) == false) { - throw new IllegalArgumentException("post " + url_ + " \n" + - " request == null || request.containsKey(JSONRequest.KEY_TAG) == false !!!"); - } - new AsyncTask() { String result; @@ -280,7 +218,7 @@ private String getResponseJson(OkHttpClient client, Request request) throws Exce * @throws JSONException */ public T getValue(String json, String key) throws JSONException { - return getValue(new JSONObject(json), key); + return getValue(JSON.parseObject(json), key); } /**从object中获取key对应的值 * *获取如果T是基本类型容易崩溃,所以需要try-catch diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Comment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Comment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Comment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Comment.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/CommentItem.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/CommentItem.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/CommentItem.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/CommentItem.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Login.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Login.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Login.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Login.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Moment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Moment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Moment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Moment.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/MomentItem.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/MomentItem.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/MomentItem.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/MomentItem.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/User.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/User.java similarity index 87% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/User.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/User.java index bca4c099e..4088dd8cb 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/User.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/User.java @@ -20,10 +20,9 @@ * @author Lemon */ public class User extends apijson.demo.server.model.User { - /** - */ - private static final long serialVersionUID = -8778034378026642371L; + private static final long serialVersionUID = 1L; + private String phone;//为了方便写在这里,登录成功是存入 public User() { super(); @@ -32,6 +31,15 @@ public User(long id) { super(id); } + public String getPhone() { + return phone; + } + public User setPhone(String phone) { + this.phone = phone; + return this; + } + + @Override public Long getId() { return value(super.getId()); @@ -91,7 +99,7 @@ public static boolean isFriend(User user0, long id1) { } //friendIdList - return isContain(user0.getFriendIdList(), id1); + return isContain(user0.getContactIdList(), id1); } } \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Wallet.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Verify.java similarity index 75% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Wallet.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Verify.java index f94aadd22..0d72b828b 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Wallet.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/Verify.java @@ -14,28 +14,24 @@ package apijson.demo.client.model; - -/**钱包类 +/**验证码类 * @author Lemon */ -public class Wallet extends apijson.demo.server.model.Wallet { +public class Verify extends apijson.demo.server.model.Verify { private static final long serialVersionUID = 4298571449155754300L; - - - public Wallet() { + + public Verify() { super(); } - public Wallet(long id) { - super(id); + + public Verify(int type, String phone) { + super(type, phone); } + @Override public Long getId() { - Long value = super.getId(); - return value == null ? 0 : value; - } - public Long getUserId() { - return getId(); + return value(super.getId()); } } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/ActionUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/ActionUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/ActionUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/ActionUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/CommentUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/CommentUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/CommentUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/CommentUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/Constant.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/Constant.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/Constant.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/Constant.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/HttpRequest.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/HttpRequest.java similarity index 79% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/HttpRequest.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/HttpRequest.java index 3b6246e6e..8571b79ee 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/HttpRequest.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/HttpRequest.java @@ -29,13 +29,10 @@ import apijson.demo.client.manager.HttpManager; import apijson.demo.client.model.CommentItem; import apijson.demo.server.model.Comment; -import apijson.demo.server.model.Login; import apijson.demo.server.model.Moment; -import apijson.demo.server.model.Password; +import apijson.demo.server.model.Privacy; import apijson.demo.server.model.User; -import apijson.demo.server.model.UserPrivacy; import apijson.demo.server.model.Verify; -import apijson.demo.server.model.Wallet; /**HTTP请求工具类 * @author Lemon @@ -57,8 +54,8 @@ public class HttpRequest { public static final String URL_HEAD = URL_BASE + "head/"; public static final String URL_GET = URL_BASE + "get/"; public static final String URL_POST = URL_BASE + "post/"; - public static final String URL_POST_HEAD = URL_BASE + "post_head/"; - public static final String URL_POST_GET = URL_BASE + "post_get/"; + public static final String URL_HEADS = URL_BASE + "heads/"; + public static final String URL_GETS = URL_BASE + "gets/"; public static final String URL_PUT = URL_BASE + "put/"; public static final String URL_DELETE = URL_BASE + "delete/"; @@ -68,7 +65,7 @@ public class HttpRequest { * @param listener */ public static void head(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().get(URL_HEAD, request, requestCode, listener); + HttpManager.getInstance().post(URL_HEAD, request, requestCode, listener); } /** * @param request @@ -76,7 +73,7 @@ public static void head(JSONObject request, int requestCode, OnHttpResponseListe * @param listener */ public static void get(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().get(URL_GET, request, requestCode, listener); + HttpManager.getInstance().post(URL_GET, request, requestCode, listener); } /** * @param request @@ -93,8 +90,8 @@ public static void post(JSONObject request, int requestCode, OnHttpResponseListe * @param listener * @must request最外层有tag,部分请求还要currentUserId和对应的password */ - public static void postHead(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().post(URL_POST_HEAD, request, requestCode, listener); + public static void heads(JSONObject request, int requestCode, OnHttpResponseListener listener) { + HttpManager.getInstance().post(URL_HEADS, request, requestCode, listener); } /**用POST方法GET数据,request和response都非明文,浏览器看不到,用于对安全性要求高的GET请求 * @param request @@ -102,8 +99,8 @@ public static void postHead(JSONObject request, int requestCode, OnHttpResponseL * @param listener * @must request最外层有tag,部分请求还要currentUserId和对应的password */ - public static void postGet(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().post(URL_POST_GET, request, requestCode, listener); + public static void gets(JSONObject request, int requestCode, OnHttpResponseListener listener) { + HttpManager.getInstance().post(URL_GETS, request, requestCode, listener); } /** * @param request @@ -133,19 +130,17 @@ public static void delete(JSONObject request, int requestCode, OnHttpResponseLis - //加 _ 表示class名,避免PASSWORD不知道是 Password 还是 password 这种冲突 + //加 _ 表示class名,避免VERIFY不知道是 Verify 还是 verify 这种冲突 public static final String USER_; - public static final String USER_PRIVACY_; + public static final String PRIVACY_; public static final String MOMENT_; public static final String COMMENT_; - public static final String WALLET_; public static final String VERIFY_; static { USER_ = User.class.getSimpleName(); - USER_PRIVACY_ = UserPrivacy.class.getSimpleName(); + PRIVACY_ = Privacy.class.getSimpleName(); MOMENT_ = Moment.class.getSimpleName(); COMMENT_ = Comment.class.getSimpleName(); - WALLET_ = Wallet.class.getSimpleName(); VERIFY_ = Verify.class.getSimpleName(); } @@ -158,7 +153,6 @@ public static void delete(JSONObject request, int requestCode, OnHttpResponseLis public static final String ID = "id"; public static final String USER_ID = "userId"; - public static final String CURRENT_USER_ID = "currentUserId"; public static final String NAME = "name"; public static final String PHONE = "phone"; @@ -210,37 +204,19 @@ public static void delete(JSONObject request, int requestCode, OnHttpResponseLis */ public static void register(String verify, String phone, String password, String name, int sex , int requestCode, OnHttpResponseListener listener) { - JSONObject request = new JSONRequest(new User().setName(name).setSex(sex)) - .setTag(USER_); - request.put(VERIFY, verify); - request.put(PHONE, phone); - request.put(PASSWORD, password); + JSONObject request = new JSONRequest(new Privacy(phone, password)); + request.puts(new User().setName(name).setSex(sex)); + request.puts(VERIFY, verify); HttpManager.getInstance().post(URL_BASE + "register", request, requestCode, listener); } - /**重置密码 - * @param verify - * @param phone - * @param password - * @param requestCode - * @param listener - */ - public static void setPassword(String verify, String phone, String password - , int requestCode, OnHttpResponseListener listener) { - JSONRequest request = new JSONRequest(); - request.put(PHONE, phone); - request.put(VERIFY, verify); - request.put(PASSWORD, password); - HttpManager.getInstance().post(URL_BASE + "put/password" - , request.setTag(PASSWORD), requestCode, listener); - } /** * @param phone * @param requestCode * @param listener */ public static void checkRegister(String phone, int requestCode, OnHttpResponseListener listener) { - head(new JSONRequest(new UserPrivacy().setPhone(phone)), requestCode, listener); + head(new JSONRequest(new Privacy().setPhone(phone)), requestCode, listener); } /**登录 @@ -254,22 +230,14 @@ public static void login(String phone, String password, int type, int requestCod request.put(TYPE, type); request.put(PHONE, phone); request.put(PASSWORD, password); - HttpManager.getInstance().post( - URL_BASE + "login/" - , request.setTag(Login.class.getSimpleName()) - , requestCode, listener - ); + HttpManager.getInstance().post(URL_BASE + "login/", request, requestCode, listener); } /**退出登录 * @param requestCode * @param listener */ public static void logout(int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().post( - URL_BASE + "logout/" - , new JSONRequest().setTag(Login.class.getSimpleName()) - , requestCode, listener - ); + HttpManager.getInstance().post(URL_BASE + "logout/", new JSONRequest(), requestCode, listener); //不能在传到服务器之前销毁session new Handler().postDelayed(new Runnable() { @@ -280,28 +248,67 @@ public void run() { }, 500); } + /**重置登录密码 + * @param verify + * @param phone + * @param password + * @param requestCode + * @param listener + */ + public static void setPassword(String verify, String phone, String password + , int requestCode, OnHttpResponseListener listener) { + setPassword(verify, phone, password, Privacy.PASSWORD_TYPE_LOGIN, requestCode, listener); + } + /**重置密码 + * @param verify + * @param phone + * @param password + * @param type + * @param requestCode + * @param listener + */ + public static void setPassword(String verify, String phone, String password, int type + , int requestCode, OnHttpResponseListener listener) { + JSONRequest request = new JSONRequest(); + request.put(VERIFY, verify); + Privacy privacy = new Privacy().setPhone(phone); + if (type == Privacy.PASSWORD_TYPE_LOGIN) { + privacy.setPassword(password); + } else { + privacy.setPayPassword(password); + } + request.put(privacy); + + HttpManager.getInstance().post(URL_BASE + "put/password", request, requestCode, listener); + } + + + /**获取验证码 + * @param type * @param phone * @param requestCode * @param listener */ - public static void getVerify(String phone, int requestCode, OnHttpResponseListener listener) { + public static void getVerify(int type, String phone, int requestCode, OnHttpResponseListener listener) { HttpManager.getInstance().post(URL_BASE + "post/verify/" - , new JSONRequest(PHONE, phone).setTag(VERIFY_) + , new JSONRequest(PHONE, phone).puts(TYPE, type).setTag(VERIFY_) , requestCode, listener); } /**校验验证码 + * @param type * @param phone * @param verify * @param requestCode * @param listener */ - public static void checkVerify(String phone, String verify, int requestCode, OnHttpResponseListener listener) { + public static void checkVerify(int type, String phone, String verify, int requestCode, OnHttpResponseListener listener) { JSONRequest request = new JSONRequest(); + request.put(TYPE, type); request.put(PHONE, phone); request.put(VERIFY, verify); - HttpManager.getInstance().post(URL_BASE + "post_head/verify" + HttpManager.getInstance().post(URL_BASE + "heads/verify" , request.setTag(VERIFY_) , requestCode, listener); } @@ -317,11 +324,11 @@ public static void checkVerify(String phone, String verify, int requestCode, OnH */ public static void setPassword(int type, String password, String phone, String verify , int requestCode, OnHttpResponseListener listener) { - Password pwd = new Password(phone, password).setType(type); - JSONRequest request = new JSONRequest(pwd); + Privacy privacy = new Privacy(phone, password); + JSONRequest request = new JSONRequest(privacy); request.put(VERIFY, verify); - put(request.setTag(Password.class.getSimpleName()), requestCode, listener); + put(request.setTag(PRIVACY_), requestCode, listener); } //account>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -347,7 +354,7 @@ public static void getUser(long id, int requestCode, OnHttpResponseListener list public static void getUser(long id, boolean withMomentList, int requestCode, OnHttpResponseListener listener) { JSONRequest request = new JSONRequest(new User(id)); if (withMomentList) { - request.add(new JSONRequest(MOMENT_ + request.putsAll(new JSONRequest(MOMENT_ , new JSONRequest(USER_ID, id).setColumn("pictureList").setOrder(DATE_DOWN)) .toArray(3, 0, MOMENT_)); } @@ -366,7 +373,7 @@ public static void setIsFriend(long id, boolean isFriend, int requestCode, OnHtt List list = new ArrayList(); list.add(id); JSONObject userObject = new JSONObject(new User(user.getId())); - userObject.put("contactIdList" + (isFriend ? "+" : "-"), list, true); + userObject.put("contactIdList" + (isFriend ? "+" : "-"), list); put(new JSONRequest(USER_, userObject).setTag(USER_), requestCode, listener); } @@ -442,12 +449,12 @@ public static void getUserList(int range, long id, com.alibaba.fastjson.JSONObje default: break; } - userItem.add(search); + userItem.putsAll(search); } JSONRequest listRequest = new JSONRequest(USER_, userItem); listRequest = listRequest.toArray(count, page, USER_); - request.add(listRequest); + request.putsAll(listRequest); get(request, requestCode, listener); } @@ -472,7 +479,7 @@ public static void getMoment(long id, int requestCode, OnHttpResponseListener li .setColumn(COLUMNS_USER_SIMPLE)); userItem.setQuery(JSONRequest.QUERY_ALL);//同时获取Table和total - request.add(userItem.toArray(10, 0, USER_)); + request.putsAll(userItem.toArray(10, 0, USER_)); request.put("praiseCount@", "/User[]/total");//获取Table的总数total //praise >>>>>>>>>>>>>>>>>> @@ -527,7 +534,7 @@ public static void getMomentList(int range, long id, com.alibaba.fastjson.JSONOb break; } moment.setOrder(DATE_DOWN); - moment.add(search); + moment.putsAll(search); request.put(MOMENT_, moment); request.put(USER_, new JSONRequest(ID_AT, "/Moment/userId").setColumn(COLUMNS_USER)); @@ -538,7 +545,7 @@ public static void getMomentList(int range, long id, com.alibaba.fastjson.JSONOb .setColumn(COLUMNS_USER_SIMPLE)); // userItem.setQuery(JSONRequest.QUERY_ALL); - request.add(userItem.toArray(10, 0, USER_)); + request.putsAll(userItem.toArray(10, 0, USER_)); // request.put("praiseCount@", "/User[]/total"); //praise >>>>>>>>>>>>>>>>>> @@ -549,7 +556,7 @@ public static void getMomentList(int range, long id, com.alibaba.fastjson.JSONOb .setColumn(COLUMNS_USER_SIMPLE)); // commentItem.setQuery(JSONRequest.QUERY_ALL); - request.add(commentItem.toArray(6, 0, CommentItem.class.getSimpleName())); + request.putsAll(commentItem.toArray(6, 0, CommentItem.class.getSimpleName())); // request.put("commentCount@", "/CommentItem[]/total"); //comment >>>>>>>>>>>>>>>>>> @@ -566,11 +573,30 @@ public static void praiseMoment(long id, boolean toPraise, int requestCode, OnHt JSONObject data = new JSONObject(new Moment(id)); List list = new ArrayList(); list.add(application.getCurrentUserId()); - data.put("praiseUserIdList" + (toPraise ? "+" : "-"), list, true); + data.puts("praiseUserIdList" + (toPraise ? "+" : "-"), list); put(new JSONRequest(MOMENT_, data).setTag(MOMENT_), requestCode, listener); } + /**新增动态 + * @param content + * @param requestCode + * @param listener + */ + public static void addMoment(String content, int requestCode, OnHttpResponseListener listener) { + List list = new ArrayList(); + list.add("http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000"); + list.add("http://common.cnblogs.com/images/icon_weibo_24.png"); + + post(new JSONRequest( + new Moment() + .setUserId(application.getCurrentUserId()) + .setContent(content) + .setPictureList(list) + ).setTag(MOMENT_) + , requestCode, listener); + } + /**删除动态 * @param id * @param requestCode @@ -580,6 +606,7 @@ public static void deleteMoment(Long id, int requestCode, OnHttpResponseListener delete(new JSONRequest(new Moment(id)).setTag(MOMENT_), requestCode, listener); } + //Moment>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -598,7 +625,7 @@ public static void getCommentList(long momentId, int count, int page , int requestCode, OnHttpResponseListener listener) { JSONRequest request = new JSONRequest(); JSONObject comment = new JSONObject(new Comment().setMomentId(momentId)); - request.put(COMMENT_, comment.setOrder(DATE_UP)); + request.put(COMMENT_, comment.setOrder("toId+", DATE_UP)); request.put(USER_, new JSONRequest(ID_AT, "/Comment/userId").setColumn(COLUMNS_USER)); // if (page == 0) { @@ -632,11 +659,17 @@ public static void addComment(long momentId, long toCommentId, long toUserId, St } /** * @param id + * @param userId * @param requestCode * @param listener */ - public static void deleteComment(long id, int requestCode, OnHttpResponseListener listener) { - delete(new JSONRequest(new Comment(id)).setTag(COMMENT_), requestCode, listener); + public static void deleteComment(long id, long userId, int requestCode, OnHttpResponseListener listener) { + delete(new JSONRequest( + COMMENT_, new JSONObject( + new Comment(id) + ).setRole(application.isCurrentUser(userId) ? RequestRole.OWNER.name() : RequestRole.ADMIN.name()) + ).setTag(COMMENT_) + , requestCode, listener); } //Comment>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -645,14 +678,24 @@ public static void deleteComment(long id, int requestCode, OnHttpResponseListene //Money<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - /**获取隐私信息 + /**获取当前用户隐私信息 + * @param requestCode + * @param listener + */ + public static void getPrivacy(int requestCode, OnHttpResponseListener listener) { + gets(new JSONRequest( + new Privacy(application.getCurrentUserId()) + ).setTag(PRIVACY_), requestCode, listener); + } + /**获取圈子内用户隐私信息 + * @param id * @param requestCode * @param listener */ - public static void getUserPrivacy(int requestCode, OnHttpResponseListener listener) { - postGet(new JSONRequest( - new UserPrivacy(application.getCurrentUserId()) - ).setTag(USER_PRIVACY_), requestCode, listener); + public static void getPrivacy(long id, int requestCode, OnHttpResponseListener listener) { + gets(new JSONRequest( + PRIVACY_, new JSONObject(new Privacy(id)).setRole(RequestRole.CIRCLE.name()) + ).setTag("Privacy-CIRCLE"), requestCode, listener); } /**修改余额 @@ -662,13 +705,13 @@ public static void getUserPrivacy(int requestCode, OnHttpResponseListener listen * @param listener */ public static void changeBalance(double change, String payPassword, int requestCode, OnHttpResponseListener listener) { - JSONObject userPrivacy = new JSONObject( - new UserPrivacy(application.getCurrentUserId()).setPayPassword(payPassword) + JSONObject privacy = new JSONObject( + new Privacy(application.getCurrentUserId()).setPayPassword(payPassword) ); - userPrivacy.put("balance+", change, true); - JSONRequest request = new JSONRequest(USER_PRIVACY_, userPrivacy); + privacy.puts("balance+", change); + JSONRequest request = new JSONRequest(PRIVACY_, privacy); - HttpManager.getInstance().post(URL_BASE + "put/balance", request.setTag(USER_PRIVACY_), requestCode, listener); + HttpManager.getInstance().post(URL_BASE + "put/balance", request.setTag(PRIVACY_), requestCode, listener); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/MenuUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/MenuUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/MenuUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/util/MenuUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/BaseViewLayout.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/BaseViewLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/BaseViewLayout.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/BaseViewLayout.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentContainerView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentContainerView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentContainerView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentContainerView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentTextView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentTextView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentTextView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentTextView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/CommentView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/EmptyEventGridView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/EmptyEventGridView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/EmptyEventGridView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/EmptyEventGridView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/MomentView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/MomentView.java similarity index 99% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/MomentView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/MomentView.java index 0e2177d2f..05cad282e 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/MomentView.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/MomentView.java @@ -400,7 +400,7 @@ public void onHttpResponse(int requestCode, String result, Exception e) { return; } JSONResponse response = new JSONResponse(result).getJSONResponse(Moment.class.getSimpleName()); - boolean isSucceed = JSONResponse.isSucceed(response); + boolean isSucceed = JSONResponse.isSuccess(response); boolean refresh = false; switch (requestCode) { diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/PraiseTextView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/PraiseTextView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/PraiseTextView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/PraiseTextView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/UserView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/UserView.java similarity index 97% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/UserView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/UserView.java index c92f0802c..beee728e8 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/UserView.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/UserView.java @@ -93,7 +93,7 @@ public void bindView(User data){ tvUserViewName.setText(StringUtil.getTrimedString(data.getName())); tvUserViewId.setText("ID:" + data.getId()); - tvUserViewTag.setText("Tag:" + StringUtil.getNoBlankString(data.getTag())); + tvUserViewTag.setText("Tag:" + StringUtil.getTrimedString(data.getTag())); } @Override diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/BaseModel.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/BaseModel.java similarity index 71% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/BaseModel.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/BaseModel.java index d2f1f639d..551c632b1 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/BaseModel.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/BaseModel.java @@ -15,8 +15,10 @@ package apijson.demo.server.model; import java.io.Serializable; +import java.sql.Timestamp; import java.util.Arrays; import java.util.Collection; +import java.util.Date; import java.util.Map; import com.alibaba.fastjson.JSON; @@ -28,8 +30,9 @@ public abstract class BaseModel implements Serializable { private static final long serialVersionUID = 1L; - private Long id; - private Long date; + private Long id; //主键,唯一标识 + private Long userId; //对应User表中的id,外键 + private Long date; //创建时间,JSON没有Date,TimeStamp类型,都会被转成Long,不能用! public Long getId() { return id; @@ -38,6 +41,13 @@ public BaseModel setId(Long id) { this.id = id; return this; } + public Long getUserId() { + return userId; + } + public BaseModel setUserId(Long userId) { + this.userId = userId; + return this; + } public Long getDate() { return date; } @@ -52,7 +62,29 @@ public String toString() { return JSON.toJSONString(this); } - + + /**获取当前时间戳 + * @return + */ + public static Timestamp currentTimeStamp() { + return new Timestamp(new Date().getTime()); + } + /**获取时间戳 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static Timestamp getTimeStamp(String time) { + return Timestamp.valueOf(time); + } + /**获取时间毫秒值 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static long getTimeMillis(String time) { + return getTimeStamp(time).getTime(); + } + + //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**判断array是否为空 * @param array @@ -218,4 +250,53 @@ public static double value(Double value) { } //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + /**index是否在arr长度范围内 + * @param index + * @param array + * @return + */ + public static boolean isIndexInRange(Integer index, Object[] array) { + return index != null && index >= 0 && index < count(array); + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param index + * @param array + * @return + */ + public static int getIndexInRange(Integer index, Object[] array) { + return getIndexInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static int getIndexInRange(Integer index, Object[] array, int defaultIndex) { + return isIndexInRange(index, array) ? index : defaultIndex; + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param + * @param index + * @param array + * @return + */ + public static T getInRange(Integer index, T[] array) { + return getInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static T getInRange(Integer index, T[] array, int defaultIndex) { + return get(array, getIndexInRange(index, array, defaultIndex)); + } + } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Comment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Comment.java similarity index 94% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Comment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Comment.java index 32f4f69c7..e11555d85 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Comment.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Comment.java @@ -33,7 +33,6 @@ public class Comment extends BaseModel { private static final long serialVersionUID = 1L; private Long toId; - private Long userId; private Long momentId; private String content; public Comment() { @@ -52,11 +51,8 @@ public Comment setToId(Long toId) { this.toId = toId; return this; } - public Long getUserId() { - return userId; - } public Comment setUserId(Long userId) { - this.userId = userId; + super.setUserId(userId); return this; } public Long getMomentId() { diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Login.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Login.java similarity index 94% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Login.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Login.java index b123f241e..f5ba5e4f7 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Login.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Login.java @@ -25,7 +25,7 @@ /**登录类,已用session替代 * @author Lemon * @see - *
POST_HEAD:
+ * 
HEADS:
 {
  "Login":{
      "disallow":"!",
@@ -56,8 +56,8 @@
 @Deprecated
 @SuppressWarnings("serial")
 @MethodAccess(
-		POST_GET = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
-		POST_HEAD = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
+		GETS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
+		HEADS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
 		POST = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
 		PUT = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
 		DELETE = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}
diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Moment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Moment.java
similarity index 96%
rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Moment.java
rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Moment.java
index 21214a1da..b6ddf6844 100644
--- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Moment.java
+++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Moment.java
@@ -50,7 +50,6 @@
 public class Moment extends BaseModel {
 	private static final long serialVersionUID = 1L;
 
-	private Long userId;
 	private String content;
 	private List pictureList;
 	private List praiseUserIdList;
@@ -64,11 +63,9 @@ public Moment(long id) {
 		setId(id);
 	}
 
-	public Long getUserId() {
-		return userId;
-	}
+
 	public Moment setUserId(Long userId) {
-		this.userId = userId;
+		super.setUserId(userId);
 		return this;
 	}
 	public String getContent() {
diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/UserPrivacy.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Privacy.java
similarity index 52%
rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/UserPrivacy.java
rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Privacy.java
index 8904fc820..7fcf3545b 100644
--- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/UserPrivacy.java
+++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Privacy.java
@@ -1,3 +1,17 @@
+/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.*/
+
 package apijson.demo.server.model;
 
 import static zuo.biao.apijson.RequestRole.ADMIN;
@@ -6,33 +20,36 @@
 
 import zuo.biao.apijson.MethodAccess;
 
-/**会员隐私信息表
+/**用户隐私信息
  * @author Lemon
  */
 @MethodAccess(
 		GET = {},
-		POST_GET = {OWNER, ADMIN},
+		GETS = {OWNER, ADMIN},
 		POST = {UNKNOWN, ADMIN},
 		DELETE = {ADMIN}
 		)
-public class UserPrivacy extends BaseModel {
+public class Privacy extends BaseModel {
 	private static final long serialVersionUID = 1L;
 
+	public static final int PASSWORD_TYPE_LOGIN = 0;
+	public static final int PASSWORD_TYPE_PAY = 1;
+	
 	private String phone; //手机
 	private String password; //登录密码,隐藏字段
 	private String payPassword; //支付密码,隐藏字段
 	private Double balance;	//余额
 
-	public UserPrivacy() {
+	public Privacy() {
 		super();
 	}
 
-	public UserPrivacy(long id) {
+	public Privacy(long id) {
 		this();
 		setId(id);
 	}
 
-	public UserPrivacy(String phone, String password) {
+	public Privacy(String phone, String password) {
 		this();
 		setPhone(phone);
 		setPassword(password);
@@ -43,7 +60,7 @@ public UserPrivacy(String phone, String password) {
 	public String getPhone() {
 		return phone;
 	}
-	public UserPrivacy setPhone(String phone) {
+	public Privacy setPhone(String phone) {
 		this.phone = phone;
 		return this;
 	}
@@ -54,7 +71,7 @@ public UserPrivacy setPhone(String phone) {
 	public String get__password() {
 		return password;
 	}
-	public UserPrivacy setPassword(String password) {
+	public Privacy setPassword(String password) {
 		this.password = password;
 		return this;
 	}
@@ -65,7 +82,7 @@ public UserPrivacy setPassword(String password) {
 	public String get__payPassword() {
 		return payPassword;
 	}
-	public UserPrivacy setPayPassword(String payPassword) {
+	public Privacy setPayPassword(String payPassword) {
 		this.payPassword = payPassword;
 		return this;
 	}
@@ -73,7 +90,7 @@ public UserPrivacy setPayPassword(String payPassword) {
 	public Double getBalance() {
 		return balance;
 	}
-	public UserPrivacy setBalance(Double balance) {
+	public Privacy setBalance(Double balance) {
 		this.balance = balance;
 		return this;
 	}
diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/User.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/User.java
similarity index 98%
rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/User.java
rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/User.java
index c16127d20..d4d18d08a 100644
--- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/User.java
+++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/User.java
@@ -55,7 +55,7 @@
 		POST = {UNKNOWN, ADMIN},
 		DELETE = {ADMIN}
 		)
-public class User extends BaseModel{
+public class User extends BaseModel {
 	private static final long serialVersionUID = 1L;
 	
 	public static final int SEX_MAIL = 0;
diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Verify.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Verify.java
similarity index 61%
rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Verify.java
rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Verify.java
index 7bc8be59b..23062a00b 100644
--- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Verify.java
+++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Verify.java
@@ -22,32 +22,15 @@
 import static zuo.biao.apijson.RequestRole.UNKNOWN;
 
 import zuo.biao.apijson.MethodAccess;
-import zuo.biao.apijson.StringUtil;
 
-/**验证码类
+/**验证码
  * @author Lemon
- * @see
- * 
POST_GET:post_get/authCode
-{
-    "Verify":{
-        "disallow":"id"
-    }
-}
- * 
- *
POST:post/authCode
-{
-    "Verify":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
*/ @MethodAccess( GET = {}, HEAD = {}, - POST_GET = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, - POST_HEAD = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + GETS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + HEADS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, POST = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, PUT = {ADMIN}, DELETE = {ADMIN} @@ -55,42 +38,50 @@ public class Verify extends BaseModel { private static final long serialVersionUID = 1L; - private String verify; + public static final int TYPE_LOGIN = 0; //登录 + public static final int TYPE_REGISTER = 1; //注册 + public static final int TYPE_PASSWORD = 2; //设置密码 + + private String phone; //手机 + private String verify; //验证码 + private Integer type; //验证类型 public Verify() { super(); } - public Verify(String phone) { + /**type和phone为联合主键,必传 + * @param type + * @param phone + */ + public Verify(int type, String phone) { this(); + setType(type); setPhone(phone); } - public Verify(Long phone) { - this(); - setId(phone); - } - public Verify(Long phone, Integer verify) { - this(phone); - setVerify(verify == null ? null : ("" + verify)); - } - public Verify(String phone, String verify) { - this(phone); - setVerify(verify); - } public String getVerify() { return verify; } - public void setVerify(String verify) { + public Verify setVerify(String verify) { this.verify = verify; + return this; } - //phone is not column - // public String getPhone() { - // return StringUtil.getString(getId()); - // } + public String getPhone() { + return phone; + } public Verify setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); + this.phone = phone; return this; } + + public Integer getType() { + return type; + } + public Verify setType(Integer type) { + this.type = type; + return this; + } + } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/.classpath b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/.classpath similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/.classpath rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/.classpath diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/.project b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/.project similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/.project rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/.project diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/AndroidManifest.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/AndroidManifest.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/libs/zxing.jar b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/libs/zxing.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/libs/zxing.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/libs/zxing.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/lint.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/lint.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/lint.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/lint.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/proguard.cfg b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/proguard.cfg similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/proguard.cfg rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/proguard.cfg diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/project.properties b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/project.properties similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/project.properties rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/project.properties diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/layout/camera.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/layout/camera.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/layout/camera.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/layout/camera.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/layout/main.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/layout/main.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/layout/main.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/layout/main.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/raw/beep.ogg b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/raw/beep.ogg similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/raw/beep.ogg rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/raw/beep.ogg diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/raw/realm_properties b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/raw/realm_properties similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/raw/realm_properties rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/raw/realm_properties diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/values/colors.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/values/colors.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/values/colors.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/values/colors.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/values/ids.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/values/ids.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/res/values/ids.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/res/values/ids.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/activity/CaptureActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/activity/CaptureActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/activity/CaptureActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/activity/CaptureActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/AutoFocusCallback.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/AutoFocusCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/AutoFocusCallback.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/AutoFocusCallback.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraConfigurationManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraConfigurationManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraConfigurationManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraConfigurationManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/CameraManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/FlashlightManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/FlashlightManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/FlashlightManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/FlashlightManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PlanarYUVLuminanceSource.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PlanarYUVLuminanceSource.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PlanarYUVLuminanceSource.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PlanarYUVLuminanceSource.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PreviewCallback.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PreviewCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PreviewCallback.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/camera/PreviewCallback.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/CaptureActivityHandler.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/CaptureActivityHandler.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/CaptureActivityHandler.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/CaptureActivityHandler.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeFormatManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeFormatManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeFormatManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeFormatManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeHandler.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeHandler.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeHandler.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeHandler.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeThread.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeThread.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeThread.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/DecodeThread.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/FinishListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/FinishListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/FinishListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/FinishListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/InactivityTimer.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/InactivityTimer.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/InactivityTimer.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/InactivityTimer.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/Intents.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/Intents.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/Intents.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/decoding/Intents.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/encoding/EncodingHandler.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/encoding/EncodingHandler.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/encoding/EncodingHandler.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/encoding/EncodingHandler.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderResultPointCallback.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderResultPointCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderResultPointCallback.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderResultPointCallback.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/QRCodeLibrary/src/com/zxing/view/ViewfinderView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/.classpath b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/.classpath similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/.classpath rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/.classpath diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/.project b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/.project similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/.project rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/.project diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/AndroidManifest.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/AndroidManifest.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/ic_launcher-web.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/ic_launcher-web.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/ic_launcher-web.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/ic_launcher-web.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/android-support-v4.jar b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/android-support-v4.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/android-support-v4.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/android-support-v4.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/fastjson-1.2.24.jar b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/fastjson-1.2.24.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/fastjson-1.2.24.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/fastjson-1.2.24.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/lint.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/lint.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/lint.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/lint.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/proguard-project.txt b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/proguard-project.txt similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/proguard-project.txt rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/proguard-project.txt diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/project.properties b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/project.properties similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/project.properties rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/project.properties diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_in.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_in.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_in.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_in_keyboard.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_in_keyboard.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_in_keyboard.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_in_keyboard.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_out.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_out.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_out.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_out_keyboard.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_out_keyboard.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_push_out_keyboard.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_push_out_keyboard.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_window_enter.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_window_enter.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_window_enter.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_window_enter.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_window_exit.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_window_exit.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/bottom_window_exit.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/bottom_window_exit.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/fade.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/fade.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/fade.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/fade.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/hold.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/hold.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/hold.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/hold.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/left_push_in.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/left_push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/left_push_in.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/left_push_in.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/left_push_out.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/left_push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/left_push_out.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/left_push_out.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/null_anim.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/null_anim.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/null_anim.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/null_anim.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/push_in.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/push_in.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/push_in.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/push_out.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/push_out.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/push_out.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/right_push_in.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/right_push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/right_push_in.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/right_push_in.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/right_push_out.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/right_push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/right_push_out.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/right_push_out.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_in_from_bottom.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_in_from_bottom.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_in_from_bottom.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_in_from_bottom.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_in_from_top.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_in_from_top.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_in_from_top.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_in_from_top.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_in_right.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_in_right.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_in_right.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_in_right.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_out_left.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_out_left.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_out_left.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_out_left.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_out_to_bottom.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_out_to_bottom.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_out_to_bottom.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_out_to_bottom.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_out_to_top.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_out_to_top.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/anim/slide_out_to_top.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/anim/slide_out_to_top.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/color/alpha_to_darker_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/color/alpha_to_darker_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/color/alpha_to_darker_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/color/alpha_to_darker_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/color/black_to_white_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/color/black_to_white_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/color/black_to_white_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/color/black_to_white_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/color/white_to_black_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/color/white_to_black_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/color/white_to_black_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/color/white_to_black_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/add.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/add.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/add.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/add.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_small.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_small.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/add_small.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back2_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/back_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/back_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light_small.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light_small.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/cancel_light_small.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/default_head.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/default_head.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/default_head.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/default_head.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_small.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_small.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/down2_small.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward2_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward2_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward2_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_small_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_small_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_small_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/forward_small_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_down.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_down.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_down.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_down.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_up.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_up.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_up.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/triangle_up.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/up2_light.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/up2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/up2_light.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/up2_light.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/xlistview_arrow.png b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/xlistview_arrow.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable-hdpi/xlistview_arrow.png rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable-hdpi/xlistview_arrow.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/alpha3.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/alpha3.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/alpha3.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/alpha3.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/alpha_to_darker_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/alpha_to_darker_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/alpha_to_darker_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/alpha_to_darker_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_black_to_white_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_black_to_white_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_black_to_white_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_black_to_white_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_gray_to_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_gray_to_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_gray_to_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_gray_to_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_green_to_darker_green.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_green_to_darker_green.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_green_to_darker_green.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_green_to_darker_green.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_item_to_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_item_to_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_item_to_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_item_to_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_pressed_common.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_pressed_common.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_pressed_common.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_pressed_common.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_gray.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_gray.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_gray.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/bg_white_to_gray.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_normal_shape.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_normal_shape.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_normal_shape.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_normal_shape.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_pressed_shape.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_pressed_shape.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_pressed_shape.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_pressed_shape.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_normal.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_normal.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_normal.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_pressed.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_pressed.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_normal.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_normal.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_normal.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_pressed.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_pressed.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_round_big_pressed.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_sky_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_sky_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_sky_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_sky_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_small.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_small.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_blue_small.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_blue_small.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_green_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_green_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_green_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_green_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_orange_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_orange_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_orange_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_orange_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_normal.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_normal.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_normal.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_pressed.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_pressed.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/btn_red_round_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray_to_white.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray_to_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray_to_white.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/cilcle_gray_to_white.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_blue.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_blue.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_blue.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_blue.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_green.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_green.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_green.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_green.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_pink.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_pink.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_pink.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_pink.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_white.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_white.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_white.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_yellow.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_yellow.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/circle_yellow.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/circle_yellow.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_common.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_common.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_common.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_common.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_map.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_map.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_map.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_map.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_rec.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_rec.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_rec.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_bg_rec.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_btn_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_btn_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_btn_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_btn_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_left_but_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_left_but_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_left_but_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_left_but_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_right_but_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_right_but_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_right_but_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_right_but_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_web_but_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_web_but_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/dialog_web_but_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/dialog_web_but_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/edit_cusor.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/edit_cusor.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/edit_cusor.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/edit_cusor.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/edit_item_text_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/edit_item_text_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/edit_item_text_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/edit_item_text_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/edit_text_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/edit_text_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/edit_text_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/edit_text_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/green_rounded_rectangle_normal.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/green_rounded_rectangle_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/green_rounded_rectangle_normal.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/green_rounded_rectangle_normal.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/icon_gray_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/icon_gray_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/icon_gray_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/icon_gray_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/icon_white_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/icon_white_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/icon_white_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/icon_white_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/input_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/input_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/input_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/input_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/input_bg_pressed.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/input_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/input_bg_pressed.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/input_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/list_item_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/list_item_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/list_item_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/list_item_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/list_item_blank_divider.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/list_item_blank_divider.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/list_item_blank_divider.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/list_item_blank_divider.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_normal.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_normal.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_normal.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_pressed.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_pressed.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_manage_manager_cancel_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_cancel_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_cancel_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_cancel_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_cancel_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_item_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_item_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_item_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/menu_member_manage_item_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/null_drawable.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/null_drawable.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/null_drawable.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/null_drawable.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/oval_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/oval_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/oval_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/oval_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/oval_white.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/oval_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/oval_white.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/oval_white.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/progress_color_horizontal.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/progress_color_horizontal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/progress_color_horizontal.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/progress_color_horizontal.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/round_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/round_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/round_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/round_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/round_rectangle_empty_white.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/round_rectangle_empty_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/round_rectangle_empty_white.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/round_rectangle_empty_white.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/square_alpha.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/square_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/square_alpha.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/square_alpha.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_center_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_center_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_center_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_center_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_full_white.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_full_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_full_white.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_full_white.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_left_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_full_white.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_full_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_full_white.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_full_white.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_selector.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_selector.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/tab_bg_right_selector.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/to_gray_slight.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/to_gray_slight.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/to_gray_slight.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/to_gray_slight.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/white_btn_bg.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/white_btn_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/drawable/white_btn_bg.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/drawable/white_btn_bg.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/alert_dialog.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/alert_dialog.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/alert_dialog.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/alert_dialog.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/base_list_fragment.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/base_list_fragment.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/base_list_fragment.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/base_list_fragment.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/base_tab_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/base_tab_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/base_tab_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/base_tab_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/base_view_bottom_window.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/base_view_bottom_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/base_view_bottom_window.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/base_view_bottom_window.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/blank_middle.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/blank_middle.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/blank_middle.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/blank_middle.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/bottom_menu_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/bottom_menu_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/bottom_menu_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/bottom_menu_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/bottom_menu_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/bottom_menu_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/bottom_menu_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/bottom_menu_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/bottom_menu_window.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/bottom_menu_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/bottom_menu_window.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/bottom_menu_window.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/divider_horizontal.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/divider_horizontal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/divider_horizontal.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/divider_horizontal.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1dp.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1dp.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1dp.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1dp.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1px.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1px.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1px.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/divider_vertical_1px.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/edit_text_info_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/edit_text_info_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/edit_text_info_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/edit_text_info_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/edit_text_info_window.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/edit_text_info_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/edit_text_info_window.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/edit_text_info_window.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/grid_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/grid_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/grid_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/grid_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/grid_picker_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/grid_picker_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/grid_picker_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/grid_picker_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/grid_picker_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/grid_picker_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/grid_picker_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/grid_picker_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/icon_name_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/icon_name_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/icon_name_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/icon_name_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/image_picker_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/image_picker_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/image_picker_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/image_picker_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/image_picker_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/image_picker_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/image_picker_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/image_picker_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/item_dialog.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/item_dialog.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/item_dialog.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/item_dialog.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/item_dialog_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/item_dialog_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/item_dialog_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/item_dialog_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/key_value_divider.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/key_value_divider.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/key_value_divider.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/key_value_divider.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/key_value_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/key_value_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/key_value_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/key_value_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/key_value_item_2.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/key_value_item_2.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/key_value_item_2.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/key_value_item_2.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/list_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/list_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/list_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/list_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/list_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/list_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/list_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/list_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/select_picture_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/select_picture_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/select_picture_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/select_picture_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/server_setting_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/server_setting_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/server_setting_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/server_setting_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/square_menu.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/square_menu.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/square_menu.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/square_menu.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_menu_list_item.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_menu_list_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_menu_list_item.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_menu_list_item.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_menu_window.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_menu_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_menu_window.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_menu_window.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_right_iv.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_right_iv.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_right_iv.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_right_iv.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_right_tv.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_right_tv.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_right_tv.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_right_tv.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_tab_tv_center.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_tab_tv_center.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_tab_tv_center.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_tab_tv_center.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_tab_view.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_tab_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/top_tab_view.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/top_tab_view.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/web_view_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/web_view_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/web_view_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/web_view_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/xlistview_footer.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/xlistview_footer.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/xlistview_footer.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/xlistview_footer.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/xlistview_header.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/xlistview_header.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/layout/xlistview_header.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/layout/xlistview_header.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/arrays.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/arrays.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/arrays.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/arrays.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/colors.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/colors.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/colors.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/colors.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/dimens.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/dimens.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/dimens.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/dimens.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/ids.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/ids.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/ids.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/ids.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/strings.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/strings.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/strings.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/strings.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/styles.xml b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/styles.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/res/values/styles.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/res/values/styles.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseApplication.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseApplication.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseApplication.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseApplication.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomTabActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomTabActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomTabActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomTabActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBottomWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBroadcastReceiver.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBroadcastReceiver.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBroadcastReceiver.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseBroadcastReceiver.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseFragment.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseHttpListFragment.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseListFragment.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseModel.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseModel.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseModel.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseModel.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabFragment.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabFragment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseTabFragment.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewBottomWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewBottomWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewBottomWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/BaseViewBottomWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/base/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ActivityPresenter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ActivityPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ActivityPresenter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ActivityPresenter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterCallBack.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterCallBack.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterCallBack.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterCallBack.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterViewPresenter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterViewPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterViewPresenter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/AdapterViewPresenter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/CacheCallBack.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/CacheCallBack.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/CacheCallBack.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/CacheCallBack.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/FragmentPresenter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/FragmentPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/FragmentPresenter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/FragmentPresenter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnAddListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnAddListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnAddListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnAddListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnBottomDragListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnBottomDragListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnBottomDragListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnBottomDragListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnProgressListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnProgressListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnProgressListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnProgressListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnReachViewBorderListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnReachViewBorderListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnReachViewBorderListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnReachViewBorderListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnRemoveListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnRemoveListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnRemoveListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnRemoveListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnResultListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnResultListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnResultListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnResultListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnStopLoadListener.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnStopLoadListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnStopLoadListener.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/OnStopLoadListener.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/Presenter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/Presenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/Presenter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/Presenter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ViewPresenter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ViewPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ViewPresenter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/ViewPresenter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/interfaces/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/Cache.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/Cache.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/Cache.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/Cache.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CacheManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CacheManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CacheManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CacheManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CityDB.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CityDB.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CityDB.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/CityDB.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/HttpManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/HttpManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/HttpManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/HttpManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/SystemBarTintManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/SystemBarTintManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/SystemBarTintManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/SystemBarTintManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/ThreadManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/ThreadManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/ThreadManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/ThreadManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/TimeRefresher.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/TimeRefresher.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/TimeRefresher.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/TimeRefresher.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/manager/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/City.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/City.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/City.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/City.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Entry.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Entry.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Entry.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Entry.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/GridPickerConfig.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/GridPickerConfig.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/GridPickerConfig.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/GridPickerConfig.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Menu.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Menu.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Menu.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Menu.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Parameter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Parameter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Parameter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/Parameter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/AlertDialog.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/AlertDialog.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/AlertDialog.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/AlertDialog.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/BottomMenuWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/CutPictureActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/CutPictureActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/CutPictureActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/CutPictureActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/DatePickerWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/DatePickerWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/DatePickerWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/DatePickerWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextInfoWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/EditTextManager.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/GridPickerView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ItemDialog.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ItemDialog.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ItemDialog.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ItemDialog.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/KeyValueAdapter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/KeyValueAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/KeyValueAdapter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/KeyValueAdapter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxHeightWrapLayout.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxHeightWrapLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxHeightWrapLayout.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxHeightWrapLayout.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxWidthWrapLayout.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxWidthWrapLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxWidthWrapLayout.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MaxWidthWrapLayout.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MyURLSpan.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MyURLSpan.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MyURLSpan.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/MyURLSpan.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PageScroller.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PageScroller.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PageScroller.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PageScroller.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PlacePickerWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PlacePickerWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PlacePickerWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/PlacePickerWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SelectPictureActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SelectPictureActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SelectPictureActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SelectPictureActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ServerSettingActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ServerSettingActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ServerSettingActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/ServerSettingActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareLinearLayout.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareLinearLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareLinearLayout.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareLinearLayout.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareRelativeLayout.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareRelativeLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareRelativeLayout.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/SquareRelativeLayout.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TextClearSuit.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TextClearSuit.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TextClearSuit.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TextClearSuit.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TimePickerWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TimePickerWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TimePickerWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TimePickerWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopMenuWindow.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopMenuWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopMenuWindow.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopMenuWindow.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopTabView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopTabView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopTabView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/TopTabView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/WebViewActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/WebViewActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/WebViewActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/WebViewActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListView.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListView.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListView.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewFooter.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewFooter.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewFooter.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewFooter.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewHeader.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewHeader.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewHeader.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/ui/xlistview/XListViewHeader.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/CommonUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/CommonUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/CommonUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/CommonUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ContactUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ContactUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ContactUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ContactUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DataKeeper.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DataKeeper.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DataKeeper.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DataKeeper.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DownloadUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DownloadUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DownloadUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/DownloadUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/EditTextUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/EditTextUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/EditTextUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/EditTextUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ImageLoaderUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ImageLoaderUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ImageLoaderUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ImageLoaderUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/JSON.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/JSON.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/JSON.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/JSON.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/Log.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/Log.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/Log.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/Log.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/MD5Util.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/MD5Util.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/MD5Util.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/MD5Util.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/PlaceUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/PlaceUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/PlaceUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/PlaceUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SSLUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SSLUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SSLUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SSLUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ScreenUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ScreenUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ScreenUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/ScreenUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SettingUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SettingUtil.java similarity index 98% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SettingUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SettingUtil.java index 3c28ad012..7133d42f1 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SettingUtil.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SettingUtil.java @@ -229,15 +229,15 @@ public static boolean noDisturb() { /** * TODO 改为你的正式服务器地址 */ - public static final String URL_SERVER_ADDRESS_NORMAL_HTTP = "http://139.196.140.118:8080/";//正式服务器 + public static final String URL_SERVER_ADDRESS_NORMAL_HTTP = "http://39.108.143.172:8080/";//正式服务器 /** * TODO 改为你的正式服务器地址 */ - public static final String URL_SERVER_ADDRESS_NORMAL_HTTPS = "http://192.168.43.52:8080/";//正式服务器 + public static final String URL_SERVER_ADDRESS_NORMAL_HTTPS = "http://39.108.143.172:8080/";//正式服务器 /** * TODO 改为你的测试服务器地址,如果有的话 */ - public static final String URL_SERVER_ADDRESS_TEST = "http://192.168.1.105:8080/";//测试服务器 + public static final String URL_SERVER_ADDRESS_TEST = "http://192.168.0.100:8080/";//测试服务器 /**获取当前服务器地址 * isHttps = false diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/StringUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/StringUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/StringUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/StringUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/TimeUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/TimeUtil.java similarity index 98% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/TimeUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/TimeUtil.java index d80e8a25d..5b7e47f83 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/TimeUtil.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/TimeUtil.java @@ -243,6 +243,14 @@ public static String getSmartTime(long duration) { return smartTime; } + public static String getSmartDate(String date) { + date = StringUtil.getTrimedString(date); + try { + return getSmartDate(java.sql.Date.valueOf(date)); + } catch (Exception e) { + } + return date; + } public static String getSmartDate(Date date) { return date == null ? "" : getSmartDate(date.getTime()); } @@ -261,7 +269,7 @@ public static String getSmartDate(long date) { if (nowDetails[0] == smartDetail[0]) {//this year if(nowDetails[1] == smartDetail[1]) {//this month String time = " " + StringUtil.getString(new SimpleDateFormat("HH:mm").format(date)); - + long day = nowDetails[2] - smartDetail[2];//between/(24*3600); if (day >= 3) {//fomer day smartDate = String.valueOf(smartDetail[2]) + "日" + time; diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/.classpath b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/.classpath similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/.classpath rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/.classpath diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/.project b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/.project similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/.project rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/.project diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/.travis.yml b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/.travis.yml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/.travis.yml rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/.travis.yml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/AndroidManifest.xml b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/AndroidManifest.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/ic_launcher-web.png b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/ic_launcher-web.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/ic_launcher-web.png rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/ic_launcher-web.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/libs/fastjson-1.2.24.jar b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/libs/fastjson-1.2.24.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/libs/fastjson-1.2.24.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/libs/fastjson-1.2.24.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/proguard-project.txt b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/proguard-project.txt similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/proguard-project.txt rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/proguard-project.txt diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/project.properties b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/project.properties similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/project.properties rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/project.properties diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSON.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSON.java old mode 100755 new mode 100644 similarity index 84% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSON.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSON.java index 521acb01d..7bd24b97d --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSON.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSON.java @@ -60,21 +60,24 @@ public static String getCorrectJson(String s) { public static String getCorrectJson(String s, boolean isArray) { s = StringUtil.getTrimedString(s); // if (isArray) { - // if (s.startsWith("\"")) { + // while (s.startsWith("\"")) { // s = s.substring(1); // } - // if (s.endsWith("\"")) { + // while (s.endsWith("\"")) { // s = s.substring(0, s.length() - 1); // } // } return s;//isJsonCorrect(s) ? s : null; } - /**json转JSONObject + /**obj转JSONObject * @param json * @return */ public static JSONObject parseObject(Object obj) { + if (obj instanceof JSONObject) { + return (JSONObject) obj; + } return parseObject(toJSONString(obj)); } /**json转JSONObject @@ -114,12 +117,16 @@ public static T parseObject(JSONObject object, Class clazz) { * @return */ public static T parseObject(String json, Class clazz) { - try { - int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; - features |= Feature.OrderedField.getMask(); - return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); - } catch (Exception e) { - Log.i(TAG, "parseObject catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseObject clazz == null >> return null;"); + } else { + try { + int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; + features |= Feature.OrderedField.getMask(); + return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); + } catch (Exception e) { + Log.i(TAG, "parseObject catch \n" + e.getMessage()); + } } return null; } @@ -131,6 +138,16 @@ public static T parseObject(String json, Class clazz) { public static JSONArray parseArray(List list) { return new JSONArray(list); } + /**obj转JSONArray + * @param json + * @return + */ + public static JSONArray parseArray(Object obj) { + if (obj instanceof JSONArray) { + return (JSONArray) obj; + } + return parseArray(toJSONString(obj)); + } /**json转JSONArray * @param json * @return @@ -157,10 +174,14 @@ public static List parseArray(JSONArray array, Class clazz) { * @return */ public static List parseArray(String json, Class clazz) { - try { - return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); - } catch (Exception e) { - Log.i(TAG, "parseArray catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseArray clazz == null >> return null;"); + } else { + try { + return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); + } catch (Exception e) { + Log.i(TAG, "parseArray catch \n" + e.getMessage()); + } } return null; } diff --git a/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONObject.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONObject.java new file mode 100644 index 000000000..3c9e0d1cf --- /dev/null +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONObject.java @@ -0,0 +1,374 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Map; + +/**use this class instead of com.alibaba.fastjson.JSONObject + * @author Lemon + * @see #put + * @see #puts + * @see #putsAll + */ +public class JSONObject extends com.alibaba.fastjson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONObject"; + + + /**ordered + */ + public JSONObject() { + super(true); + } + /**transfer Object to JSONObject + * @param object + * @see {@link #JSONObject(Object, boolean)} + */ + public JSONObject(Object object) { + this(toJSONString(object)); + } + /**parse JSONObject with JSON String + * @param json + * @see {@link #JSONObject(String, boolean)} + */ + public JSONObject(String json) { + this(parseObject(json)); + } + /**transfer com.alibaba.fastjson.JSONObject to JSONObject + * @param object + * @see {@link #putsAll(com.alibaba.fastjson.JSONObject)} + */ + public JSONObject(com.alibaba.fastjson.JSONObject object) { + this(); + putsAll(object); + } + + + + + //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ARRAY = "[]"; + + /**判断是否为Array的key + * @param key + * @return + */ + public static boolean isArrayKey(String key) { + return key != null && key.endsWith(KEY_ARRAY); + } + /**判断是否为对应Table的key + * @param key + * @return + */ + public static boolean isTableKey(String key) { + return StringUtil.isBigName(key); + } + //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + + /**set "id":id in Table layer + * @param id + * @return + */ + public JSONObject setId(Long id) { + return puts(KEY_ID, id); + } + /**set id{}:[] in Table layer + * @param list + * @return + */ + public JSONObject setIdIn(List list) { + return puts(KEY_ID_IN, list); + } + + + //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ROLE = "@role"; //角色,拥有对某些数据的某些操作的权限 + public static final String KEY_CONDITION = "@condition"; //条件 TODO 用 @where& @where| @where! 替代? + public static final String KEY_TRY = "@try"; //尝试,忽略异常 + public static final String KEY_DROP = "@drop"; //丢弃,不返回 + public static final String KEY_CORRECT = "@correct"; //字段校正 + + public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明 + public static final String KEY_ABOUT = "@about"; //关于,返回数据库表的信息,包括表说明和字段说明 + public static final String KEY_COLUMN = "@column"; //查询的Table字段或SQL函数 + public static final String KEY_GROUP = "@group"; //分组方式 + public static final String KEY_HAVING = "@having"; //聚合函数条件,一般和@group一起用 + public static final String KEY_ORDER = "@order"; //排序方式 + //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> + + + /**set role of request sender + * @param role + * @return this + */ + public JSONObject setRole(String role) { + return puts(KEY_ROLE, role); + } + + /**set try, ignore exceptions + * @param tri + * @return this + */ + public JSONObject setTry(boolean tri) { + return puts(KEY_TRY, tri); + } + + /**set drop, data dropped will not return + * @param drop + * @return this + */ + public JSONObject setDrop(boolean drop) { + return puts(KEY_DROP, drop); + } + + /**set correct, correct keys to target ones + * @param correct Map{originKey, [posibleKeys]}, posibleKey之间用 , 隔开 + * @return this + */ + public JSONObject setCorrect(Map correct) { + return puts(KEY_CORRECT, correct); + } + + + + /**set schema where table was puts + * @param schema + * @return this + */ + public JSONObject setSchema(String schema) { + return puts(KEY_SCHEMA, schema); + } + + /**set about + * @param about + * @return this + */ + public JSONObject setAbout(boolean about) { + return puts(KEY_ABOUT, about); + } + + /**set keys need to be returned + * @param keys key0, key1, key2 ... + * @return {@link #setColumn(String)} + */ + public JSONObject setColumn(String... keys) { + return setColumn(StringUtil.getString(keys, true)); + } + /**set keys need to be returned + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setColumn(String keys) { + return puts(KEY_COLUMN, keys); + } + + /**set keys for group by + * @param keys key0, key1, key2 ... + * @return {@link #setGroup(String)} + */ + public JSONObject setGroup(String... keys) { + return setGroup(StringUtil.getString(keys, true)); + } + /**set keys for group by + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setGroup(String keys) { + return puts(KEY_GROUP, keys); + } + + /**set keys for having + * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... + * @return {@link #setHaving(String)} + */ + public JSONObject setHaving(String... keys) { + return setHaving(StringUtil.getString(keys, true)); + } + /**set keys for having + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setHaving(String keys) { + return puts(KEY_HAVING, keys); + } + + /**set keys for order by + * @param keys key0, key1+, key2- ... + * @return {@link #setOrder(String)} + */ + public JSONObject setOrder(String... keys) { + return setOrder(StringUtil.getString(keys, true)); + } + /**set keys for order by + * @param keys "key0,key1+,key2-..." + * @return + */ + public JSONObject setOrder(String keys) { + return puts(KEY_ORDER, keys); + } + + + //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //Request <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + /** + * @param key + * @param keys path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsPath(String key, String... keys) { + return puts(key+"@", StringUtil.getString(keys, "/")); + } + + /** + * @param key + * @param isNull + * @return {@link #puts(String, Object)} + */ + public JSONObject putsNull(String key, boolean isNull) { + return puts(key+"{}", SQL.isNull(isNull)); + } + /** + * trim = false + * @param key + * @param isEmpty + * @return {@link #putsEmpty(String, boolean, boolean)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty) { + return putsEmpty(key, isEmpty, false); + } + /** + * @param key + * @param isEmpty + * @return {@link #puts(String, Object)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty, boolean trim) { + return puts(key+"{}", SQL.isEmpty(key, isEmpty, trim)); + } + /** + * @param key + * @param compare <=0, >5 ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsLength(String key, String compare) { + return puts(key+"{}", SQL.length(key) + compare); + } + + /**设置搜索 + * type = SEARCH_TYPE_CONTAIN_FULL + * @param key + * @param value + * @return {@link #putsSearch(String, String, int)} + */ + public JSONObject putsSearch(String key, String value) { + return putsSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); + } + /**设置搜索 + * @param key + * @param value + * @param type + * @return {@link #puts(String, Object)} + */ + public JSONObject putsSearch(String key, String value, int type) { + return puts(key+"$", SQL.search(value, type)); + } + + //Request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + /**puts key-value in object into this + * @param object + * @return this + */ + public JSONObject putsAll(Map map) { + putAll(map); + return this; + } + @Override + public void putAll(Map map) { + if (map != null && map.isEmpty() == false) { + super.putAll(map); + } + } + + + + /**put and return this + * @param value must be annotated by {@link MethodAccess} + * @return {@link #puts(String, boolean)} + */ + public JSONObject puts(Object value) { + return puts(null, value); + } + /**put and return this + * @param key + * @param value + * @return this + * @see {@link #put(String, Object)} + */ + public JSONObject puts(String key, Object value) { + put(key, value); + return this; + } + + /**put and return value + * @param value must be annotated by {@link MethodAccess} + * @return {@link #put(String, boolean)} + */ + public Object put(Object value) { + return put(null, value); + } + /**put and return value + * @param key StringUtil.isEmpty(key, true) ? key = value.getClass().getSimpleName(); + * @param value + * @return value + */ + @Override + public Object put(String key, Object value) { + if (value == null) { + Log.e(TAG, "put value == null >> return null;"); + return null; + } + if (StringUtil.isEmpty(key, true)) { + Class clazz = value.getClass(); + if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { + throw new IllegalArgumentException("puts StringUtil.isNotEmpty(key, true) == false" + + " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + + " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + + " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + + " \n 如果是类似 key[]:{} 结构的请求,建议用 putsAll(...) !"); + } + key = value.getClass().getSimpleName(); + } + return super.put(key, value); + } + + + +} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONRequest.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONRequest.java similarity index 52% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONRequest.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONRequest.java index 78b935560..5d33b681d 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/JSONRequest.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONRequest.java @@ -14,11 +14,14 @@ package zuo.biao.apijson; -/**encapsulator for request JSONObject, encode in default cases +import java.util.Map; + +/**wrapper for request * @author Lemon + * @see #puts * @see #toArray * @use JSONRequest request = new JSONRequest(...); - *
request.put(...);//not a must + *
request.puts(...);//not a must *
request.toArray(...);//not a must */ public class JSONRequest extends JSONObject { @@ -28,51 +31,34 @@ public JSONRequest() { super(); } /** - * encode = true - * @param object must be annotated by {@link APIJSONRequest} + * @param object must be annotated by {@link MethodAccess} * @see {@link #JSONRequest(String, Object)} */ public JSONRequest(Object object) { this(null, object); } /** - * encode = true * @param name * @param object - * @see {@link #JSONRequest(String, Object, boolean)} + * @see {@link #puts(String, Object)} */ public JSONRequest(String name, Object object) { - this(name, object, true); - } - /** - * @param object must be annotated by {@link APIJSONRequest} - * @param encode - * @see {@link #JSONRequest(String, Object, boolean)} - */ - public JSONRequest(Object object, boolean encode) { - this(null, object, encode); - } - /** - * @param name - * @param object - * @param encode - * @see {@link #put(String, Object, boolean)} - */ - public JSONRequest(String name, Object object, boolean encode) { this(); - put(name, object, encode); + puts(name, object); } - - - + public static final String KEY_TAG = "tag";//只在最外层,最外层用JSONRequest - - public JSONObject setTag(String tag) { - put(KEY_TAG, tag); - return this; + + /**set "tag":tag in outermost layer + * for write operations + * @param tag + * @return + */ + public JSONRequest setTag(String tag) { + return puts(KEY_TAG, tag); } @@ -86,104 +72,67 @@ public JSONObject setTag(String tag) { public static final String KEY_COUNT = "count"; public static final String KEY_PAGE = "page"; - /** + /**set what to query in Array layer * @param query what need to query, Table,total,ALL? * @return + * @see {@link #QUERY_TABLE} + * @see {@link #QUERY_TOTAL} + * @see {@link #QUERY_ALL} */ public JSONRequest setQuery(int query) { - put(KEY_QUERY, query); - return this; + return puts(KEY_QUERY, query); } - /** - * @param count + /**set maximum count of Tables to query in Array layer + * @param count <= 0 || >= max ? max : count * @return */ public JSONRequest setCount(int count) { - put(KEY_COUNT, count); - return this; + return puts(KEY_COUNT, count); } - /** - * @param page + /**set page of Tables to query in Array layer + * @param page <= 0 ? 0 : page * @return */ public JSONRequest setPage(int page) { - put(KEY_PAGE, page); - return this; + return puts(KEY_PAGE, page); } //array object >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - // 导致JSONObject add >> get = null - // /** - // * decode = true - // * @param key - // * return {@link #get(Object, boolean)} - // */ - // @Override - // public Object get(Object key) { - // return get(key, true); - // } - - /** - * encode = true - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - @Override - public Object put(Object value) { - return put(value, true); - } - /** - * encode = true - * @param key - * @param value - * return {@link #put(String, Object, boolean)} - */ - @Override - public Object put(String key, Object value) { - return put(key, value, true); - } - - /**create a parent JSONObject named KEY_ARRAY - * encode = true; * @param count * @param page * @return {@link #toArray(int, int, boolean)} */ public JSONRequest toArray(int count, int page) { - return toArray(count, page, true); - } - /**create a parent JSONObject named KEY_ARRAY - * encode = true; - * @param count - * @param page - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, boolean encode) { - return toArray(count, page, null, encode); - } - /**create a parent JSONObject named name+KEY_ARRAY - * encode = true; - * @param count - * @param page - * @param name - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, String name) { - return toArray(count, page, name, true); + return toArray(count, page, null); } /**create a parent JSONObject named name+KEY_ARRAY. * @param count * @param page * @param name - * @param encode * @return {name+KEY_ARRAY : this}. if needs to be put, use {@link #add(com.alibaba.fastjson.JSONObject)} instead */ - public JSONRequest toArray(int count, int page, String name, boolean encode) { - return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page), encode); + public JSONRequest toArray(int count, int page, String name) { + return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page)); + } + + + @Override + public JSONObject putsAll(Map map) { + super.putsAll(map); + return this; + } + + @Override + public JSONRequest puts(Object value) { + return puts(null, value); + } + @Override + public JSONRequest puts(String key, Object value) { + super.puts(key, value); + return this; } } diff --git a/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONResponse.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONResponse.java new file mode 100644 index 000000000..f9b6d3fc9 --- /dev/null +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/JSONResponse.java @@ -0,0 +1,400 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Set; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/**parser for response + * @author Lemon + * @see #getObject + * @see #getList + * @use JSONResponse response = new JSONResponse(json); + *
User user = response.getObject(User.class);//not a must + *
List commenntList = response.getList("Comment[]", Comment.class);//not a must + */ +public class JSONResponse extends zuo.biao.apijson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONResponse"; + + public JSONResponse() { + super(); + } + public JSONResponse(String json) { + this(parseObject(json)); + } + public JSONResponse(JSONObject object) { + super(format(object)); + } + + //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int CODE_SUCCESS = 200; //成功 + public static final int CODE_UNSUPPORTED_ENCODING = 400; //编码错误 + public static final int CODE_ILLEGAL_ACCESS = 401; //权限错误 + public static final int CODE_UNSUPPORTED_OPERATION = 403; //禁止操作 + public static final int CODE_NOT_FOUND = 404; //未找到 + public static final int CODE_ILLEGAL_ARGUMENT = 406; //参数错误 + public static final int CODE_NOT_LOGGED_IN = 407; //未登录 + public static final int CODE_TIME_OUT = 408; //超时 + public static final int CODE_CONFLICT = 409; //重复,已存在 + public static final int CODE_CONDITION_ERROR = 412; //条件错误,如密码错误 + public static final int CODE_UNSUPPORTED_TYPE = 415; //类型错误 + public static final int CODE_OUT_OF_RANGE = 416; //超出范围 + public static final int CODE_NULL_POINTER = 417; //对象为空 + public static final int CODE_SERVER_ERROR = 500; //服务器内部错误 + + + public static final String MSG_SUCCEED = "success"; //成功 + public static final String MSG_SERVER_ERROR = "Internal Server Error!"; //服务器内部错误 + + + public static final String KEY_CODE = "code"; + public static final String KEY_MSG = "msg"; + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + public static final String KEY_COUNT = "count"; + public static final String KEY_TOTAL = "total"; + + /**获取状态 + * @return + */ + public int getCode() { + try { + return getIntValue(KEY_CODE); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取信息 + * @return + */ + public String getMsg() { + return getString(KEY_MSG); + } + /**获取id + * @return + */ + public long getId() { + try { + return getLongValue(KEY_ID); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取数量 + * @return + */ + public int getCount() { + try { + return getIntValue(KEY_COUNT); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取总数 + * @return + */ + public int getTotal() { + try { + return getIntValue(KEY_TOTAL); + } catch (Exception e) { + //empty + } + return 0; + } + + + /**是否成功 + * @return + */ + public boolean isSuccess() { + return isSuccess(getCode()); + } + /**是否成功 + * @param code + * @return + */ + public static boolean isSuccess(int code) { + return code == CODE_SUCCESS; + } + /**是否成功 + * @param response + * @return + */ + public static boolean isSuccess(JSONResponse response) { + return response != null && response.isSuccess(); + } + + /**校验服务端是否存在table + * @return + */ + public boolean isExist() { + return isExist(getCount()); + } + /**校验服务端是否存在table + * @param count + * @return + */ + public static boolean isExist(int count) { + return count > 0; + } + /**校验服务端是否存在table + * @param response + * @return + */ + public static boolean isExist(JSONResponse response) { + return response != null && response.isExist(); + } + + /**获取内部的JSONResponse + * @param key + * @return + */ + public JSONResponse getJSONResponse(String key) { + return getObject(key, JSONResponse.class); + } + //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + /** + * key = clazz.getSimpleName() + * @param clazz + * @return + */ + public T getObject(Class clazz) { + return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); + } + /** + * @param key + * @param clazz + * @return + */ + public T getObject(String key, Class clazz) { + return getObject(this, key, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static T getObject(JSONObject object, String key, Class clazz) { + return toObject(object == null ? null : object.getJSONObject(key), clazz); + } + + /** + * @param clazz + * @return + */ + public T toObject(Class clazz) { + return toObject(this, clazz); + } + /** + * @param object + * @param clazz + * @return + */ + public static T toObject(JSONObject object, Class clazz) { + return JSON.parseObject(JSON.toJSONString(object), clazz); + } + + + + + /** + * key = KEY_ARRAY + * @param clazz + * @return + */ + public List getList(Class clazz) { + return getList(KEY_ARRAY, clazz); + } + /** + * arrayObject = this + * @param key + * @param clazz + * @return + */ + public List getList(String key, Class clazz) { + return getList(this, key, clazz); + } + + /** + * key = KEY_ARRAY + * @param object + * @param clazz + * @return + */ + public static List getList(JSONObject object, Class clazz) { + return getList(object, KEY_ARRAY, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static List getList(JSONObject object, String key, Class clazz) { + return object == null ? null : JSON.parseArray(object.getString(replaceArray(key)), clazz); + } + + /** + * key = KEY_ARRAY + * @return + */ + public JSONArray getArray() { + return getArray(KEY_ARRAY); + } + /** + * @param key + * @return + */ + public JSONArray getArray(String key) { + return getArray(this, key); + } + /** + * @param object + * @return + */ + public static JSONArray getArray(JSONObject object) { + return getArray(object, KEY_ARRAY); + } + /** + * key = KEY_ARRAY + * @param object + * @param key + * @return + */ + public static JSONArray getArray(JSONObject object, String key) { + return object == null ? null : object.getJSONArray(replaceArray(key)); + } + + + // /** + // * @return + // */ + // public JSONObject format() { + // return format(this); + // } + /**格式化key名称 + * @param object + * @return + */ + public static JSONObject format(final JSONObject object) { + //太长查看不方便,不如debug Log.i(TAG, "format object = \n" + JSON.toJSONString(object)); + if (object == null || object.isEmpty()) { + Log.i(TAG, "format object == null || object.isEmpty() >> return object;"); + return object; + } + JSONObject formatedObject = new JSONObject(true); + + Set set = object.keySet(); + if (set != null) { + + Object value; + for (String key : set) { + value = object.get(key); + + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedObject.put(replaceArray(key), format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedObject.put(getSimpleName(key), format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedObject.put(getSimpleName(key), value); + } + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedObject = " + JSON.toJSONString(formatedObject)); + return formatedObject; + } + + /**格式化key名称 + * @param array + * @return + */ + public static JSONArray format(final JSONArray array) { + //太长查看不方便,不如debug Log.i(TAG, "format array = \n" + JSON.toJSONString(array)); + if (array == null || array.isEmpty()) { + Log.i(TAG, "format array == null || array.isEmpty() >> return array;"); + return array; + } + JSONArray formatedArray = new JSONArray(); + + Object value; + for (int i = 0; i < array.size(); i++) { + value = array.get(i); + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedArray.add(format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedArray.add(format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedArray.add(value); + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedArray = " + JSON.toJSONString(formatedArray)); + return formatedArray; + } + + /**替换key+KEY_ARRAY为keyList + * @param key + * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} + */ + public static String replaceArray(String key) { + if (isArrayKey(key)) { + key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); + } + return getSimpleName(key); + } + /**获取列表变量名 + * @param key => StringUtil.getNoBlankString(key) + * @return empty ? "list" : key + "List" 且首字母小写 + */ + public static String getArrayKey(String key) { + return StringUtil.addSuffix(key, "list"); + } + + /**获取简单名称 + * @param fullName name 或 name:alias + * @return name => name; name:alias => alias + */ + public static String getSimpleName(String fullName) { + //key:alias -> alias; key:alias[] -> alias[] + int index = fullName == null ? -1 : fullName.indexOf(":"); + if (index >= 0) { + fullName = fullName.substring(index + 1); + } + return fullName; + } + + +} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/Log.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/Log.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/Log.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/Log.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/MethodAccess.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/MethodAccess.java similarity index 74% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/MethodAccess.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/MethodAccess.java index 1cf14dc6e..939571625 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/MethodAccess.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/MethodAccess.java @@ -36,37 +36,37 @@ public @interface MethodAccess { /**@see {@link RequestMethod#GET} - * @return 该请求方法允许的结构 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ RequestRole[] GET() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; /**@see {@link RequestMethod#HEAD} - * @return 该请求方法允许的结构 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ RequestRole[] HEAD() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; - /**@see {@link RequestMethod#POST_GET} - * @return 该请求方法允许的结构 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + /**@see {@link RequestMethod#GETS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ - RequestRole[] POST_GET() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + RequestRole[] GETS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; - /**@see {@link RequestMethod#POST_HEAD} - * @return 该请求方法允许的结构 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + /**@see {@link RequestMethod#HEADS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ - RequestRole[] POST_HEAD() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + RequestRole[] HEADS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; /**@see {@link RequestMethod#POST} - * @return 该请求方法允许的结构 default {LOGIN, ADMIN}; + * @return 该请求方法允许的角色 default {LOGIN, ADMIN}; */ RequestRole[] POST() default {LOGIN, ADMIN}; /**@see {@link RequestMethod#PUT} - * @return 该请求方法允许的结构 default {OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; */ RequestRole[] PUT() default {OWNER, ADMIN}; /**@see {@link RequestMethod#DELETE} - * @return 该请求方法允许的结构 default {OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; */ RequestRole[] DELETE() default {OWNER, ADMIN}; diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/MethodStructure.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/MethodStructure.java similarity index 91% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/MethodStructure.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/MethodStructure.java index ffd2a0c3c..27c30c96d 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/MethodStructure.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/MethodStructure.java @@ -30,15 +30,15 @@ @Target(TYPE) public @interface MethodStructure { - /**@see {@link RequestMethod#POST_HEAD} + /**@see {@link RequestMethod#HEADS} * @return 该请求方法允许的结构 */ - String POST_HEAD() default ""; + String HEADS() default ""; - /**@see {@link RequestMethod#POST_GET} + /**@see {@link RequestMethod#GETS} * @return 该请求方法允许的结构 */ - String POST_GET() default ""; + String GETS() default ""; /**@see {@link RequestMethod#POST} * @return 该请求方法允许的结构 diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/RequestMethod.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/RequestMethod.java similarity index 74% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/RequestMethod.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/RequestMethod.java index 11f928134..a450baad8 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/RequestMethod.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/RequestMethod.java @@ -14,7 +14,7 @@ package zuo.biao.apijson; -/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出POST_GET,POST_HEAD方法 +/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出GETS,HEADS方法 * @author Lemon */ public enum RequestMethod { @@ -29,15 +29,15 @@ public enum RequestMethod { */ HEAD, - /** - * 通过POST来GET数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 + /**Safe, Single, Simple + *
限制性GET,通过POST来GET数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 */ - POST_GET, + GETS, - /** - * 通过POST来HEAD数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 + /**Safe, Single, Simple + *
限制性HEAD,通过POST来HEAD数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 */ - POST_HEAD, + HEADS, /** * 新增(或者说插入)数据 @@ -57,22 +57,22 @@ public enum RequestMethod { /**是否为GET请求方法 * @param method - * @param containPrivate 包含私密(非明文)获取方法POST_GET + * @param containPrivate 包含私密(非明文)获取方法GETS * @return */ public static boolean isGetMethod(RequestMethod method, boolean containPrivate) { boolean is = method == null || method == GET; - return containPrivate == false ? is : is || method == POST_GET; + return containPrivate == false ? is : is || method == GETS; } /**是否为HEAD请求方法 * @param method - * @param containPrivate 包含私密(非明文)获取方法POST_HEAD + * @param containPrivate 包含私密(非明文)获取方法HEADS * @return */ public static boolean isHeadMethod(RequestMethod method, boolean containPrivate) { boolean is = method == HEAD; - return containPrivate == false ? is : is || method == POST_HEAD; + return containPrivate == false ? is : is || method == HEADS; } /**是否为查询的请求方法 diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/RequestRole.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/RequestRole.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/RequestRole.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/RequestRole.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/SQL.java similarity index 67% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/SQL.java index 63f532b52..a9da023e5 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/SQL.java @@ -22,8 +22,16 @@ public class SQL { public static final String OR = " OR "; public static final String AND = " AND "; public static final String NOT = " NOT "; + public static final String AS = " AS "; public static final String IS = " is "; public static final String NULL = " null "; + + //括号必须紧跟函数名! count (...) 报错! + public static final String COUNT = "count"; + public static final String SUM = "sum"; + public static final String MAX = "max"; + public static final String MIN = "min"; + public static final String AVG = "avg"; /** * isNull = true @@ -34,7 +42,7 @@ public static String isNull() { } /** * @param isNull - * @return IS + (isNull ? "" : NOT) + NULL; + * @return {@link #IS} + (isNull ? "" : {@link #NOT}) + {@link #NULL}; */ public static String isNull(boolean isNull) { return IS + (isNull ? "" : NOT) + NULL; @@ -87,7 +95,7 @@ public static String isEmpty(String s, boolean isEmpty, boolean trim) { * @param s * @param isEmpty <=0 * @param trim s = trim(s); - * @param nullable isNull(s, true) + OR + + * @param nullable isNull(s, true) + {@link #OR} + * @return {@link #lengthCompare(String, String)} */ public static String isEmpty(String s, boolean isEmpty, boolean trim, boolean nullable) { @@ -171,30 +179,30 @@ public static String subString(String s, int start, int end) { /** * @param s - * @param c - * @return "instr(" + s + "," + c + ")" + * @param c -> 'c' + * @return "instr(" + s + ", '" + c + "')" */ public static String indexOf(String s, String c) { - return "instr(" + s + "," + c + ")"; + return "instr(" + s + ", '" + c + "')"; } /** * @param s - * @param c1 - * @param c2 - * @return + * @param c1 -> 'c1' + * @param c2 -> 'c2' + * @return "replace(" + s + ", '" + c1 + "', '" + c2 + "')" */ public static String replace(String s, String c1, String c2) { - return "replace(" + s + "," + c1 + "," + c2 + ")"; + return "replace(" + s + ", '" + c1 + "', '" + c2 + "')"; } /** * @param s1 - * @param s2 - * @return "strcmp(" + s1 + "," + s2 + ")" + * @param s2 -> 's2' + * @return "strcmp(" + s1 + ", '" + s2 + "')" */ public static String equals(String s1, String s2) { - return "strcmp(" + s1 + "," + s2 + ")"; + return "strcmp(" + s1 + ", '" + s2 + "')"; } /** @@ -212,9 +220,98 @@ public static String toLowerCase(String s) { return "lower(" + s + ")"; } + + + //column and function<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**字段 + * @param column + * @return column.isEmpty() ? "*" : column; + */ + public static String column(String column) { + column = StringUtil.getTrimedString(column); + return column.isEmpty() ? "*" : column; + } + /**有别名的字段 + * @param column + * @return {@link #count(String)} + {@link #AS}; + */ + public static String columnAs(String column) { + return count(column) + AS; + } + + /**函数 + * @param column if (StringUtil.isEmpty(column, true) || column.contains(",")) -> column = null; + * @return " " + fun + "(" + {@link #column(String)} + ") "; + */ + public static String function(String fun, String column) { + if (StringUtil.isEmpty(column, true) || column.contains(",")) { + column = null; //解决 count(id,name) 这种多个字段导致的SQL异常 + } + return " " + fun + "(" + column(column) + ") "; + } + /**有别名的函数 + * @param column + * @return {@link #function(String, String)} + {@link #AS} + fun; + */ + public static String functionAs(String fun, String column) { + return function(fun, column) + AS + fun + " "; + } + + /**计数 + * column = null + * @return {@link #count(String)} + */ + public static String count() { + return count(null); + } + /**计数 + * fun = {@link #COUNT} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String count(String column) { + return functionAs(COUNT, column); + } + /**求和 + * fun = {@link #SUM} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String sum(String column) { + return functionAs(SUM, column); + } + /**最大值 + * fun = {@link #MAX} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String max(String column) { + return functionAs(MAX, column); + } + /**最小值 + * fun = {@link #MIN} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String min(String column) { + return functionAs(MIN, column); + } + /**平均值 + * fun = {@link #AVG} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String avg(String column) { + return functionAs(AVG, column); + } - + //column and function>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //search<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static final int SEARCH_TYPE_CONTAIN_FULL = 0; public static final int SEARCH_TYPE_CONTAIN_ORDER = 1; @@ -286,5 +383,7 @@ public static String search(String s, int type, boolean ignoreCase) { return "%" + s + "%"; } } + + //search>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/StringUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/StringUtil.java old mode 100755 new mode 100644 similarity index 85% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/StringUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/StringUtil.java index d5076b99c..b219b430a --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/StringUtil.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/StringUtil.java @@ -17,7 +17,6 @@ import java.io.File; import java.math.BigDecimal; import java.text.DecimalFormat; -import java.util.regex.Matcher; import java.util.regex.Pattern; /**通用字符串(String)相关类,为null时返回"" @@ -100,7 +99,7 @@ public static String getString(String s) { * @param array * @return {@link #getString(String[], boolean)} */ - public static String getString(String[] array) { + public static String getString(Object[] array) { return getString(array, false); } /**获取string,为null则返回"" @@ -109,7 +108,7 @@ public static String getString(String[] array) { * @param ignoreEmptyItem * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, boolean ignoreEmptyItem) { + public static String getString(Object[] array, boolean ignoreEmptyItem) { return getString(array, null, ignoreEmptyItem); } /**获取string,为null则返回"" @@ -118,7 +117,7 @@ public static String getString(String[] array, boolean ignoreEmptyItem) { * @param split * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, String split) { + public static String getString(Object[] array, String split) { return getString(array, split, false); } /**获取string,为null则返回"" @@ -127,7 +126,7 @@ public static String getString(String[] array, String split) { * @param ignoreEmptyItem * @return */ - public static String getString(String[] array, String split, boolean ignoreEmptyItem) { + public static String getString(Object[] array, String split, boolean ignoreEmptyItem) { String s = ""; if (array != null) { if (split == null) { @@ -304,17 +303,25 @@ public static boolean isNotEmpty(String s, boolean trim) { //判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final Pattern ALPHA_PATTERN; - public static final Pattern PASSWORD_PATTERN; - public static final Pattern NAME_PATTERN; - public static final Pattern BIG_ALPHA_PATTERN; - public static final Pattern SMALL_ALPHA_PATTERN; + public static final Pattern PATTERN_NUMBER; + public static final Pattern PATTERN_PHONE; + public static final Pattern PATTERN_EMAIL; + public static final Pattern PATTERN_ID_CARD; + public static final Pattern PATTERN_ALPHA; + public static final Pattern PATTERN_PASSWORD; //TODO + public static final Pattern PATTERN_NAME; + public static final Pattern PATTERN_ALPHA_BIG; + public static final Pattern PATTERN_ALPHA_SMALL; static { - ALPHA_PATTERN = Pattern.compile("[a-zA-Z]"); - PASSWORD_PATTERN = Pattern.compile("^[0-9a-zA-Z_]+$"); - NAME_PATTERN = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 - BIG_ALPHA_PATTERN = Pattern.compile("[A-Z]"); - SMALL_ALPHA_PATTERN = Pattern.compile("[a-z]"); + PATTERN_NUMBER = Pattern.compile("^[0-9]+$"); + PATTERN_ALPHA = Pattern.compile("^[a-zA-Z]+$"); + PATTERN_ALPHA_BIG = Pattern.compile("^[A-Z]+$"); + PATTERN_ALPHA_SMALL = Pattern.compile("^[a-z]+$"); + PATTERN_NAME = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 + PATTERN_PHONE = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); + PATTERN_EMAIL = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); + PATTERN_ID_CARD = Pattern.compile("(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)"); + PATTERN_PASSWORD = Pattern.compile("^[0-9a-zA-Z]+$"); } /**判断手机格式是否正确 @@ -326,18 +333,15 @@ public static boolean isPhone(String phone) { return false; } - Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); - currentString = phone; - - return p.matcher(phone).matches(); + return PATTERN_PHONE.matcher(phone).matches(); } /**判断手机格式是否正确 * @param s * @return */ public static boolean isPassword(String s) { - return getLength(s, false) >= 6 && PASSWORD_PATTERN.matcher(s).matches(); + return getLength(s, false) >= 6 && PATTERN_PASSWORD.matcher(s).matches(); } /**判断是否全是数字密码 * @param s @@ -355,12 +359,8 @@ public static boolean isEmail(String email) { return false; } - String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; - Pattern p = Pattern.compile(str); - currentString = email; - - return p.matcher(email).matches(); + return PATTERN_EMAIL.matcher(email).matches(); } @@ -380,39 +380,20 @@ public static boolean isNumer(String s) { return false; } - Pattern pattern = Pattern.compile("[0-9]"); - Matcher matcher; - for (int i = 0; i < s.length(); i++) { - matcher = pattern.matcher(s.substring(i, i+1)); - if(! matcher.matches()){ - return false; - } - } - currentString = s; - - return true; + return PATTERN_NUMBER.matcher(s).matches(); } /**判断是否全是字母 * @param s * @return */ public static boolean isAlpha(String s) { - if (s == null) { - Log.i(TAG, "isNumberOrAlpha inputed == null >> return false;"); + if (isEmpty(s, true)) { return false; } - Pattern pAlpha = Pattern.compile("[a-zA-Z]"); - Matcher mAlpha; - for (int i = 0; i < s.length(); i++) { - mAlpha = pAlpha.matcher(s.substring(i, i+1)); - if(! mAlpha.matches()){ - return false; - } - } currentString = s; - return true; + return PATTERN_ALPHA.matcher(s).matches(); } /**判断是否全是数字或字母 * @param s @@ -422,53 +403,53 @@ public static boolean isNumberOrAlpha(String s) { return isNumer(s) || isAlpha(s); } - /**判断是否为单词,只能包含字母,数字或下划线 + /**判断是否为代码名称,只能包含字母,数字或下划线 * @param s * @return */ - public static boolean isWord(String s) { - return s != null && NAME_PATTERN.matcher(s).matches(); + public static boolean isName(String s) { + return s != null && PATTERN_NAME.matcher(s).matches(); } - /**判断是否为首字母大写的单词 + /**判断是否为首字母大写的代码名称 * @param key * @return */ - public static boolean isBigWord(String s) { + public static boolean isBigName(String s) { s = getString(s); - if (s.isEmpty() || BIG_ALPHA_PATTERN.matcher(s.substring(0, 1)).matches() == false) { + if (s.isEmpty() || PATTERN_ALPHA_BIG.matcher(s.substring(0, 1)).matches() == false) { return false; } - return s.length() <= 1 ? true : isWord(s.substring(1)); + return s.length() <= 1 ? true : isName(s.substring(1)); } - /**判断是否为首字母小写的单词 + /**判断是否为首字母小写的代码名称 * @param key * @return */ - public static boolean isSmallWord(String s) { + public static boolean isSmallName(String s) { s = getString(s); - if (s.isEmpty() || SMALL_ALPHA_PATTERN.matcher(s.substring(0, 1)).matches() == false) { + if (s.isEmpty() || PATTERN_ALPHA_SMALL.matcher(s.substring(0, 1)).matches() == false) { return false; } - return s.length() <= 1 ? true : isWord(s.substring(1)); + return s.length() <= 1 ? true : isName(s.substring(1)); } /**判断字符类型是否是身份证号 - * @param idCard + * @param number * @return */ - public static boolean isIDCard(String idCard) { - if (isNumberOrAlpha(idCard) == false) { + public static boolean isIDCard(String number) { + if (isNumberOrAlpha(number) == false) { return false; } - idCard = getString(idCard); - if (idCard.length() == 15) { - Log.i(TAG, "isIDCard idCard.length() == 15 old IDCard"); - currentString = idCard; + number = getString(number); + if (number.length() == 15) { + Log.i(TAG, "isIDCard number.length() == 15 old IDCard"); + currentString = number; return true; } - if (idCard.length() == 18) { - currentString = idCard; + if (number.length() == 18) { + currentString = number; return true; } @@ -756,11 +737,21 @@ public static String[] split(String s) { return split(s, null); } /**将s用split分割成String[] + * trim = true; * @param s * @param split * @return */ public static String[] split(String s, String split) { + return split(s, split, true); + } + /**将s用split分割成String[] + * @param s + * @param split + * @param trim 去掉前后两端的split + * @return + */ + public static String[] split(String s, String split, boolean trim) { s = getString(s); if (s.isEmpty()) { return null; @@ -768,11 +759,13 @@ public static String[] split(String s, String split) { if (isNotEmpty(split, false) == false) { split = ","; } - while (s.startsWith(split)) { - s = s.substring(split.length()); - } - while (s.endsWith(split)) { - s = s.substring(0, s.length() - split.length()); + if (trim) { + while (s.startsWith(split)) { + s = s.substring(split.length()); + } + while (s.endsWith(split)) { + s = s.substring(0, s.length() - split.length()); + } } return s.contains(split) ? s.split(split) : new String[]{s}; } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONLibrary/src/zuo/biao/apijson/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/.classpath b/APIJSON-Android/APIJSON-ADT/APIJSONTest/.classpath similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/.classpath rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/.classpath diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/.project b/APIJSON-Android/APIJSON-ADT/APIJSONTest/.project similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/.project rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/.project diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/AndroidManifest.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/AndroidManifest.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/ic_launcher-web.png b/APIJSON-Android/APIJSON-ADT/APIJSONTest/ic_launcher-web.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/ic_launcher-web.png rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/ic_launcher-web.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/libs/okhttp-2.1.0.jar b/APIJSON-Android/APIJSON-ADT/APIJSONTest/libs/okhttp-2.1.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/libs/okhttp-2.1.0.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/libs/okhttp-2.1.0.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/libs/okio-1.0.0.jar b/APIJSON-Android/APIJSON-ADT/APIJSONTest/libs/okio-1.0.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/libs/okio-1.0.0.jar rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/libs/okio-1.0.0.jar diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/proguard-project.txt b/APIJSON-Android/APIJSON-ADT/APIJSONTest/proguard-project.txt similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/proguard-project.txt rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/proguard-project.txt diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/project.properties b/APIJSON-Android/APIJSON-ADT/APIJSONTest/project.properties similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/project.properties rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/project.properties diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-hdpi/ic_launcher.png b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-hdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-hdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-mdpi/ic_launcher.png b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-mdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-mdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-mdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-xhdpi/ic_launcher.png b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-xhdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-xhdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-xhdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-xxhdpi/ic_launcher.png b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable-xxhdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable-xxhdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable/ic_launcher.png b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/drawable/ic_launcher.png rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/drawable/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/layout/auto_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/layout/auto_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/layout/auto_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/layout/auto_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/layout/request_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/layout/request_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/layout/request_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/layout/request_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/layout/select_activity.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/layout/select_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/layout/select_activity.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/layout/select_activity.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values-en/strings.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values-en/strings.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values-en/strings.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values-en/strings.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values/dimens.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values/dimens.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values/dimens.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values/dimens.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values/strings.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values/strings.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values/strings.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values/strings.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values/styles.xml b/APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values/styles.xml similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/res/values/styles.xml rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/res/values/styles.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/HttpManager.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/HttpManager.java similarity index 79% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/HttpManager.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/HttpManager.java index 9bde4a758..e8c5d73c8 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/HttpManager.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/HttpManager.java @@ -14,12 +14,9 @@ package apijson.demo; -import static zuo.biao.apijson.StringUtil.UTF_8; - import java.io.IOException; import java.net.CookieHandler; import java.net.URI; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -87,58 +84,58 @@ public synchronized static HttpManager getInstance() { public static final String KEY_TOKEN = "token"; public static final String KEY_COOKIE = "cookie"; + // encode和decode太麻烦,直接都用HTTP POST + // /**GET请求 + // * @param paramList 请求参数列表,(可以一个键对应多个值) + // * @param url 接口url + // * @param requestCode + // * 请求码,类似onActivityResult中请求码,当同一activity中以实现接口方式发起多个网络请求时,请求结束后都会回调 + // * {@link OnHttpResponseListener#onHttpResponse(int, String, Exception)}
+ // * 在发起请求的类中可以用requestCode来区分各个请求 + // * @param listener + // */ + // public void get(final String url_, final String request, final OnHttpResponseListener listener) { + // Log.d(TAG, "get url_ = " + url_ + "; request = " + request + " >>>"); + // new AsyncTask() { + // + // String result; + // @Override + // protected Exception doInBackground(Void... params) { + // try { + // String url = StringUtil.getNoBlankString(url_) + // + URLEncoder.encode(StringUtil.getNoBlankString(request), UTF_8); + // StringBuffer sb = new StringBuffer(); + // sb.append(url); + // + // OkHttpClient client = getHttpClient(url); + // if (client == null) { + // return new Exception(TAG + ".get AsyncTask.doInBackground client == null >> return;"); + // } + // + // result = getResponseJson(client, new Request.Builder() + // .addHeader(KEY_TOKEN, getToken(url)) + // .url(sb.toString()).build()); + // } catch (Exception e) { + // Log.e(TAG, "get AsyncTask.doInBackground try { result = getResponseJson(..." + + // "} catch (Exception e) {\n" + e.getMessage()); + // return e; + // } + // + // return null; + // } + // + // @Override + // protected void onPostExecute(Exception exception) { + // super.onPostExecute(exception); + // listener.onHttpResponse(0, result, exception); + // } + // + // }.execute(); + // + // } + + public static final MediaType TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); - /**GET请求 - * @param paramList 请求参数列表,(可以一个键对应多个值) - * @param url 接口url - * @param requestCode - * 请求码,类似onActivityResult中请求码,当同一activity中以实现接口方式发起多个网络请求时,请求结束后都会回调 - * {@link OnHttpResponseListener#onHttpResponse(int, String, Exception)}
- * 在发起请求的类中可以用requestCode来区分各个请求 - * @param listener - */ - public void get(final String url_, final String request, final OnHttpResponseListener listener) { - Log.d(TAG, "get url_ = " + url_ + "; request = " + request + " >>>"); - new AsyncTask() { - - String result; - @Override - protected Exception doInBackground(Void... params) { - try { - String url = StringUtil.getNoBlankString(url_) - + URLEncoder.encode(StringUtil.getNoBlankString(request), UTF_8); - StringBuffer sb = new StringBuffer(); - sb.append(url); - - OkHttpClient client = getHttpClient(url); - if (client == null) { - return new Exception(TAG + ".get AsyncTask.doInBackground client == null >> return;"); - } - - result = getResponseJson(client, new Request.Builder() - .addHeader(KEY_TOKEN, getToken(url)) - .url(sb.toString()).build()); - } catch (Exception e) { - Log.e(TAG, "get AsyncTask.doInBackground try { result = getResponseJson(..." + - "} catch (Exception e) {\n" + e.getMessage()); - return e; - } - - return null; - } - - @Override - protected void onPostExecute(Exception exception) { - super.onPostExecute(exception); - listener.onHttpResponse(0, result, exception); - } - - }.execute(); - - } - - public static final MediaType TYPE_JSON =MediaType.parse("application/json; charset=utf-8"); - /**POST请求 * @param paramList 请求参数列表,(可以一个键对应多个值) * @param url 接口url @@ -163,9 +160,9 @@ protected Exception doInBackground(Void... params) { if (client == null) { return new Exception(TAG + ".post AsyncTask.doInBackground client == null >> return;"); } - + RequestBody requestBody = RequestBody.create(TYPE_JSON, request); - + result = getResponseJson(client, new Request.Builder() .addHeader(KEY_TOKEN, getToken(url)).url(StringUtil.getNoBlankString(url)) .post(requestBody).build()); diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/RequestUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/RequestUtil.java similarity index 55% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/RequestUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/RequestUtil.java index a8e560f0b..b4cc06954 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/RequestUtil.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/RequestUtil.java @@ -23,11 +23,10 @@ import apijson.demo.application.DemoApplication; import apijson.demo.model.Comment; import apijson.demo.model.Moment; +import apijson.demo.model.Privacy; import apijson.demo.model.User; -import apijson.demo.model.Wallet; /**请求工具类 - * 设置encode参数只为方便展示,实际使用时并不需要 * @author Lemon */ public class RequestUtil { @@ -42,7 +41,7 @@ public class RequestUtil { - public static JSONObject newPostRequest(boolean encode) { + public static JSONObject newPostRequest() { Moment data = new Moment(); data.setUserId(DEFAULT_USER_ID); data.setContent(context.getString(R.string.apijson_slogan)); @@ -50,80 +49,76 @@ public static JSONObject newPostRequest(boolean encode) { list.add("http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000"); list.add("http://common.cnblogs.com/images/icon_weibo_24.png"); data.setPictureList(list); - return new JSONRequest(data, encode).setTag(Moment.class.getSimpleName()); + return new JSONRequest(data).setTag(Moment.class.getSimpleName()); } - public static JSONObject newPutRequest(long id, boolean encode) { + public static JSONObject newPutRequest(long id) { Moment data = new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id); // data.setContent(context.getString(R.string.apijson_info));//一般可用这种方式,encode是为了展示方便 List list = new ArrayList(); list.add((long) 82001); list.add((long) 82002); - JSONObject momentObject = new JSONObject(data, encode); - momentObject.put("praiseUserIdList+", list, encode); - momentObject.put("content", context.getString(R.string.apijson_info), encode); - return new JSONRequest(Moment.class.getSimpleName(), momentObject, encode).setTag(Moment.class.getSimpleName()); + JSONObject momentObject = new JSONObject(data); + momentObject.put("praiseUserIdList+", list); + momentObject.put("content", context.getString(R.string.apijson_info)); + return new JSONRequest(Moment.class.getSimpleName(), momentObject).setTag(Moment.class.getSimpleName()); } - public static JSONObject newDeleteRequest(long id, boolean encode) { - return new JSONRequest(new Moment(id <= 0 ? 10000 : id), encode).setTag(Moment.class.getSimpleName()); + public static JSONObject newDeleteRequest(long id) { + return new JSONRequest(new Moment(id <= 0 ? 10000 : id)).setTag(Moment.class.getSimpleName()); } - public static JSONObject newSingleRequest(long id, boolean encode) { - return new JSONRequest(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id), encode); + public static JSONObject newSingleRequest(long id) { + return new JSONRequest(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id)); } - public static JSONObject newColumnsRequest(long id, boolean encode) { - JSONObject object = new JSONObject(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id), encode); + public static JSONObject newColumnsRequest(long id) { + JSONObject object = new JSONObject(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id)); object.setColumn("id,userId,content"); - return new JSONRequest(Moment.class.getSimpleName(), object, encode); + return new JSONRequest(Moment.class.getSimpleName(), object); } - public static JSONObject newRelyRequest(long id, boolean encode) { + public static JSONObject newRelyRequest(long id) { JSONRequest request = new JSONRequest(); - request.put(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id), encode); - request.put(User.class.getSimpleName(), new JSONRequest("id@", "Moment/userId", encode)); + request.put(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id)); + request.put(User.class.getSimpleName(), new JSONRequest("id@", "Moment/userId")); return request; } - public static JSONObject newArrayRequest(boolean encode) { + public static JSONObject newArrayRequest() { JSONRequest dataObject = new JSONRequest(); - dataObject.put("name$", "%o%", encode); - JSONRequest request = new JSONRequest(User.class.getSimpleName(), dataObject, encode); - return request.toArray(5, 1, User.class.getSimpleName(), encode); + dataObject.put("name$", "%o%"); + JSONRequest request = new JSONRequest(User.class.getSimpleName(), dataObject); + return request.toArray(5, 1, User.class.getSimpleName()); } - public static JSONObject newComplexRequest(boolean encode) { + public static JSONObject newComplexRequest() { JSONRequest request = new JSONRequest(); List idList = new ArrayList(); idList.add(DEFAULT_USER_ID); idList.add((long) 93793); - request.put(Moment.class.getSimpleName(), new JSONRequest("userId{}", idList, encode), encode); + request.put(Moment.class.getSimpleName(), new JSONRequest("userId{}", idList)); - request.put(User.class.getSimpleName(), new JSONRequest("id@", "/Moment/userId", encode), encode); + request.put(User.class.getSimpleName(), new JSONRequest("id@", "/Moment/userId")); - request.add(new JSONRequest(Comment.class.getSimpleName() - , new JSONRequest("momentId@", "[]/Moment/id", encode), encode). - toArray(3, 0, Comment.class.getSimpleName()), encode); + request.putAll(new JSONRequest(Comment.class.getSimpleName() + , new JSONRequest("momentId@", "[]/Moment/id")). + toArray(3, 0, Comment.class.getSimpleName())); - return request.toArray(3, 0, encode); + return request.toArray(3, 0); } - public static JSONObject newAccessErrorRequest(boolean encode) { - return new JSONRequest(new Wallet().setUserId(DEFAULT_USER_ID), encode) - .setTag(Wallet.class.getSimpleName()); + public static JSONObject newAccessErrorRequest() { + return new JSONRequest(new Privacy(DEFAULT_USER_ID)); } - public static JSONObject newAccessPermittedRequest(boolean encode) { - JSONRequest request = new JSONRequest(); - request.put(new Wallet().setUserId(DEFAULT_USER_ID), encode); - request.put("currentUserId", DEFAULT_USER_ID, encode); - request.put("loginPassword", "apijson", encode); - return request.setTag(Wallet.class.getSimpleName()); + public static JSONObject newAccessPermittedRequest() { + JSONRequest request = new JSONRequest(new Privacy(DEFAULT_USER_ID)); + return request.setTag(Privacy.class.getSimpleName()); } } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/StringUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/StringUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/StringUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/StringUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/application/DemoApplication.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/application/DemoApplication.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/application/DemoApplication.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/application/DemoApplication.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/application/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/application/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/application/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/application/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/BaseModel.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/BaseModel.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/BaseModel.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/BaseModel.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/Comment.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/Comment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/Comment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/Comment.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/Moment.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/Moment.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/Moment.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/Moment.java diff --git a/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/Privacy.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/Privacy.java new file mode 100644 index 000000000..1d87e61af --- /dev/null +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/Privacy.java @@ -0,0 +1,98 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.OWNER; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import zuo.biao.apijson.MethodAccess; + +/**用户隐私信息 + * @author Lemon + */ +@MethodAccess( + GET = {}, + GETS = {OWNER, ADMIN}, + POST = {UNKNOWN, ADMIN}, + DELETE = {ADMIN} + ) +public class Privacy extends BaseModel { + private static final long serialVersionUID = 1L; + + public static final int PASSWORD_TYPE_LOGIN = 0; + public static final int PASSWORD_TYPE_PAY = 1; + + private String phone; //手机 + private String password; //登录密码,隐藏字段 + private String payPassword; //支付密码,隐藏字段 + private Double balance; //余额 + + public Privacy() { + super(); + } + + public Privacy(long id) { + this(); + setId(id); + } + + public Privacy(String phone, String password) { + this(); + setPhone(phone); + setPassword(password); + } + + + + public String getPhone() { + return phone; + } + public Privacy setPhone(String phone) { + this.phone = phone; + return this; + } + + /**get_password会转为password + * @return + */ + public String get__password() { + return password; + } + public Privacy setPassword(String password) { + this.password = password; + return this; + } + + /**get_PayPassword会转为PayPassword + * @return + */ + public String get__payPassword() { + return payPassword; + } + public Privacy setPayPassword(String payPassword) { + this.payPassword = payPassword; + return this; + } + + public Double getBalance() { + return balance; + } + public Privacy setBalance(Double balance) { + this.balance = balance; + return this; + } + +} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/User.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/User.java similarity index 95% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/User.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/User.java index c16127d20..b71195059 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/User.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/User.java @@ -12,7 +12,7 @@ See the License for the specific language governing permissions and limitations under the License.*/ -package apijson.demo.server.model; +package apijson.demo.model; import static zuo.biao.apijson.RequestRole.ADMIN; import static zuo.biao.apijson.RequestRole.UNKNOWN; @@ -55,7 +55,7 @@ POST = {UNKNOWN, ADMIN}, DELETE = {ADMIN} ) -public class User extends BaseModel{ +public class User extends BaseModel { private static final long serialVersionUID = 1L; public static final int SEX_MAIL = 0; @@ -68,7 +68,7 @@ public class User extends BaseModel{ private String name; //姓名 private String tag; //标签 private List pictureList; //照片列表 - private List contactIdList; //朋友列表 + private List contactIdList; //联系人列表 /**默认构造方法,JSON等解析时必须要有 */ diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/package-info.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/AutoActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/AutoActivity.java similarity index 98% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/AutoActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/AutoActivity.java index 137cd4823..c067267c7 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/AutoActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/AutoActivity.java @@ -131,7 +131,7 @@ public void request(TextView tv) { } public void request(String method) { startActivityForResult(RequestActivity.createIntent(context, id, url, method - , JSON.parseObject(StringUtil.getString(tvAutoRequest)), false), REQUEST_TO_REQUEST); + , JSON.parseObject(StringUtil.getString(tvAutoRequest))), REQUEST_TO_REQUEST); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/CodeUtil.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/CodeUtil.java similarity index 88% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/CodeUtil.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/CodeUtil.java index 007d6eac2..fc1b6d5d2 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/CodeUtil.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/CodeUtil.java @@ -43,14 +43,12 @@ public static String parse(final String name, final JSONObject request) { if (set != null) { Object value; - String pairKey; for (String key : set) { value = request.get(key); if (value == null) { continue; } - pairKey = new String(key instanceof String ? "\"" + key + "\"" : key); if (value instanceof JSONObject) {//APIJSON Array转为常规JSONArray if (isArrayKey(key)) {//APIJSON Array转为常规JSONArray response += NEWLINE + NEWLINE + "//" + key + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; @@ -65,22 +63,25 @@ public static String parse(final String name, final JSONObject request) { String prefix = key.substring(0, key.length() - 2); response += NEWLINE + NEWLINE - + parentKey + ".add(" + getItemKey(key) + ".toArray(" + + parentKey + ".putAll(" + getItemKey(key) + ".toArray(" + count + ", " + page + (prefix.isEmpty() ? "" : ", \"" + prefix + "\"") + "));"; response += NEWLINE + "//" + key + ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + NEWLINE; - } else {//常规JSONObject,往下一级提取 + } + else {//常规JSONObject,往下一级提取 response += NEWLINE + NEWLINE + "//" + key + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; response += parse(key, (JSONObject) value); - response += NEWLINE + NEWLINE + parentKey + ".put(" + pairKey + ", " + getTableKey(key) + ");"; + response += NEWLINE + NEWLINE + parentKey + ".put(\"" + key + "\", " + getTableKey(key) + ");"; response += NEWLINE + "//" + key + ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + NEWLINE; } - } else {//其它Object,直接填充 + } + else {//其它Object,直接填充 if (value instanceof String) { value = "\"" + value + "\""; - } else if (value instanceof JSONArray) { + } + else if (value instanceof JSONArray) { String s = StringUtil.getString(value); if (s.startsWith("[")) { s = s.substring(1); @@ -93,7 +94,7 @@ public static String parse(final String name, final JSONObject request) { value = "new Object[]{" + s + "}";//反射获取泛型太麻烦,反正开发中还要改的 } - response += NEWLINE + parentKey + ".put(" + pairKey + ", " + value + ");"; + response += NEWLINE + parentKey + ".put(\"" + key + "\", " + value + ");"; } } } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/RequestActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/RequestActivity.java similarity index 83% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/RequestActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/RequestActivity.java index 3055746aa..91eba0e55 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/RequestActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/RequestActivity.java @@ -39,8 +39,9 @@ import apijson.demo.HttpManager.OnHttpResponseListener; import apijson.demo.R; import apijson.demo.StringUtil; +import apijson.demo.model.BaseModel; import apijson.demo.model.Moment; -import apijson.demo.model.Wallet; +import apijson.demo.model.Privacy; import com.alibaba.fastjson.JSONObject; @@ -56,7 +57,6 @@ public class RequestActivity extends Activity implements OnHttpResponseListener public static final String INTENT_URL = "INTENT_URL"; public static final String INTENT_METHOD = "INTENT_METHOD"; public static final String INTENT_REQUEST = "INTENT_REQUEST"; - public static final String INTENT_ENCODED = "INTENT_ENCODED"; public static final String RESULT_ID = "RESULT_ID"; public static final String RESULT_URL = "RESULT_URL"; @@ -68,17 +68,14 @@ public class RequestActivity extends Activity implements OnHttpResponseListener * @param url * @param method * @param request - * @param encoded * @return */ - public static Intent createIntent(Context context, long id, String url, String method, - JSONObject request, boolean encoded) { + public static Intent createIntent(Context context, long id, String url, String method, JSONObject request) { return new Intent(context, RequestActivity.class) .putExtra(RequestActivity.INTENT_ID, id) .putExtra(RequestActivity.INTENT_URL, url) .putExtra(RequestActivity.INTENT_METHOD, method) - .putExtra(RequestActivity.INTENT_REQUEST, JSON.toJSONString(request)) - .putExtra(RequestActivity.INTENT_ENCODED, encoded); + .putExtra(RequestActivity.INTENT_REQUEST, JSON.toJSONString(request)); } @@ -92,7 +89,6 @@ public static Intent createIntent(Context context, long id, String url, String m private String url; private String method; private String request; - private boolean encoded; private TextView tvRequestResult; private ProgressBar pbRequest; @@ -113,20 +109,9 @@ protected void onCreate(Bundle savedInstanceState) { url = getIntent().getStringExtra(INTENT_URL); method = getIntent().getStringExtra(INTENT_METHOD); request = getIntent().getStringExtra(INTENT_REQUEST); - encoded = getIntent().getBooleanExtra(INTENT_ENCODED, false); method = StringUtil.getTrimedString(method); url = StringUtil.getCorrectUrl(url); - if (encoded == false && request != null && request.contains("/")) { - // try {//导致JSON.format(request)返回null,然后tvRequestResult就显示为null了 - // String s = URLEncoder.encode(new String(request), StringUtil.UTF_8); - // request = s; - // } catch (UnsupportedEncodingException e) { - // e.printStackTrace(); - // } - request = request.replaceAll("/", "%2F"); - } - tvRequestResult = (TextView) findViewById(R.id.tvRequestResult); pbRequest = (ProgressBar) findViewById(R.id.pbRequest); @@ -136,7 +121,7 @@ protected void onCreate(Bundle savedInstanceState) { etRequestUrl.setText(StringUtil.getString(StringUtil.isNotEmpty(url, true) - ? url : "http://139.196.140.118:8080/"));//TODO 把这个ip地址改成你自己服务器的 + ? url : "http://39.108.143.172:8080/"));//TODO 把这个ip地址改成你自己服务器的 btnRequestRequest.setText(method); error = String.format(getResources().getString(R.string.request_error), StringUtil.getTrimedString(btnRequestRequest)); @@ -174,11 +159,7 @@ private void request() { tvRequestResult.setText("requesting...\n\n url = " + fullUrl + "\n\n request = \n" + JSON.format(request) + "\n\n\n" + error); pbRequest.setVisibility(View.VISIBLE); - if ("get".equals(method) || "head".equals(method)) { - HttpManager.getInstance().get(fullUrl, request, this); - } else { - HttpManager.getInstance().post(fullUrl, request, this); - } + HttpManager.getInstance().post(fullUrl, request, this); } /**用浏览器请求,只有GET请求才能正常访问 @@ -233,7 +214,7 @@ public void onHttpResponse(int requestCode, final String resultJson, final Excep if ("post".equals(method)) { Moment moment = response.getObject(Moment.class); - id = moment == null ? 0 : moment.getId(); + id = moment == null ? 0 : BaseModel.value(moment.getId()); Log.d(TAG, "onHttpResponse post.equals(method) >> id = " + id); } else if ("put".equals(method)) { @@ -242,15 +223,15 @@ public void onHttpResponse(int requestCode, final String resultJson, final Excep } else if ("delete".equals(method)) { response = response.getJSONResponse(Moment.class.getSimpleName()); - // if (JSONResponse.isSucceed(response)) {//delete succeed + // if (JSONResponse.isSuccess(response)) {//delete succeed id = 0;//reuse default value // } Log.d(TAG, "onHttpResponse delete.equals(method) >> id = " + id - + "; isSucceed = " + JSONResponse.isSucceed(response)); + + "; isSucceed = " + JSONResponse.isSuccess(response)); - } else if ("post_get".equals(method)) { - Wallet wallet = response.getObject(Wallet.class); - Log.d(TAG, "onHttpResponse post_get.equals(method) >> wallet = " + JSON.toJSONString(wallet)); + } else if ("gets".equals(method)) { + Privacy privacy = response.getObject(Privacy.class); + Log.d(TAG, "onHttpResponse gets.equals(method) >> privacy = \n" + JSON.toJSONString(privacy)); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/SelectActivity.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/SelectActivity.java similarity index 84% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/SelectActivity.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/SelectActivity.java index 0d716f4a8..710f30d38 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/SelectActivity.java +++ b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/SelectActivity.java @@ -109,7 +109,7 @@ public void toUpdateLog(View v) { */ public void setRequest() { for (int i = 0; i < buttons.length; i++) { - buttons[i].setText(JSON.format(getRequest(buttons[i], false))); + buttons[i].setText(JSON.format(getRequest(buttons[i]))); } } @@ -119,30 +119,30 @@ public void setRequest() { * @param v * @return */ - public JSONObject getRequest(View v, boolean encode) { + public JSONObject getRequest(View v) { switch (v.getId()) { case R.id.btnSelectPost: - return RequestUtil.newPostRequest(encode); + return RequestUtil.newPostRequest(); case R.id.btnSelectPut: - return RequestUtil.newPutRequest(id, encode); + return RequestUtil.newPutRequest(id); case R.id.btnSelectDelete: - return RequestUtil.newDeleteRequest(id, encode); + return RequestUtil.newDeleteRequest(id); case R.id.btnSelectSingle: - return RequestUtil.newSingleRequest(id, encode); + return RequestUtil.newSingleRequest(id); case R.id.btnSelectColumns: - return RequestUtil.newColumnsRequest(id, encode); + return RequestUtil.newColumnsRequest(id); case R.id.btnSelectRely: - return RequestUtil.newRelyRequest(id, encode); + return RequestUtil.newRelyRequest(id); case R.id.btnSelectArray: - return RequestUtil.newArrayRequest(encode); + return RequestUtil.newArrayRequest(); case R.id.btnSelectAccessError: - return RequestUtil.newAccessErrorRequest(encode); + return RequestUtil.newAccessErrorRequest(); case R.id.btnSelectAccessPermitted: - return RequestUtil.newAccessPermittedRequest(encode); + return RequestUtil.newAccessPermittedRequest(); default: - return RequestUtil.newComplexRequest(encode); + return RequestUtil.newComplexRequest(); } } @@ -153,31 +153,31 @@ public JSONObject getRequest(View v, boolean encode) { public void onClick(View v) { switch (v.getId()) { case R.id.btnSelectPost: - select(getRequest(v, true), "post"); + select(getRequest(v), "post"); break; case R.id.btnSelectPut: - select(getRequest(v, true), "put"); + select(getRequest(v), "put"); break; case R.id.btnSelectDelete: - select(getRequest(v, true), "delete"); + select(getRequest(v), "delete"); break; case R.id.btnSelectAccessError: - select(getRequest(v, true), "post_get"); + select(getRequest(v), "gets"); break; case R.id.btnSelectAccessPermitted: - select(getRequest(v, true), "post_get"); + select(getRequest(v), "gets"); break; default: - select(getRequest(v, true), "get"); + select(getRequest(v), "get"); break; } } private void select(JSONObject request, String method) { - startActivityForResult(RequestActivity.createIntent(context, id, url, method, request, true), REQUEST_TO_REQUEST); + startActivityForResult(RequestActivity.createIntent(context, id, url, method, request), REQUEST_TO_REQUEST); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/package-info.java b/APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/package-info.java rename to APIJSON-Android/APIJSON-ADT/APIJSONTest/src/apijson/demo/ui/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/libs/fastjson-1.2.24.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/libs/fastjson-1.2.24.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/libs/fastjson-1.2.24.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/libs/fastjson-1.2.24.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/proguard-rules.pro b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/proguard-rules.pro similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/proguard-rules.pro rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/proguard-rules.pro diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/AndroidManifest.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/AndroidManifest.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/AndroidManifest.xml diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSON.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java old mode 100755 new mode 100644 similarity index 84% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSON.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java index 521acb01d..7bd24b97d --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSON.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java @@ -60,21 +60,24 @@ public static String getCorrectJson(String s) { public static String getCorrectJson(String s, boolean isArray) { s = StringUtil.getTrimedString(s); // if (isArray) { - // if (s.startsWith("\"")) { + // while (s.startsWith("\"")) { // s = s.substring(1); // } - // if (s.endsWith("\"")) { + // while (s.endsWith("\"")) { // s = s.substring(0, s.length() - 1); // } // } return s;//isJsonCorrect(s) ? s : null; } - /**json转JSONObject + /**obj转JSONObject * @param json * @return */ public static JSONObject parseObject(Object obj) { + if (obj instanceof JSONObject) { + return (JSONObject) obj; + } return parseObject(toJSONString(obj)); } /**json转JSONObject @@ -114,12 +117,16 @@ public static T parseObject(JSONObject object, Class clazz) { * @return */ public static T parseObject(String json, Class clazz) { - try { - int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; - features |= Feature.OrderedField.getMask(); - return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); - } catch (Exception e) { - Log.i(TAG, "parseObject catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseObject clazz == null >> return null;"); + } else { + try { + int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; + features |= Feature.OrderedField.getMask(); + return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); + } catch (Exception e) { + Log.i(TAG, "parseObject catch \n" + e.getMessage()); + } } return null; } @@ -131,6 +138,16 @@ public static T parseObject(String json, Class clazz) { public static JSONArray parseArray(List list) { return new JSONArray(list); } + /**obj转JSONArray + * @param json + * @return + */ + public static JSONArray parseArray(Object obj) { + if (obj instanceof JSONArray) { + return (JSONArray) obj; + } + return parseArray(toJSONString(obj)); + } /**json转JSONArray * @param json * @return @@ -157,10 +174,14 @@ public static List parseArray(JSONArray array, Class clazz) { * @return */ public static List parseArray(String json, Class clazz) { - try { - return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); - } catch (Exception e) { - Log.i(TAG, "parseArray catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseArray clazz == null >> return null;"); + } else { + try { + return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); + } catch (Exception e) { + Log.i(TAG, "parseArray catch \n" + e.getMessage()); + } } return null; } diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java new file mode 100644 index 000000000..3c9e0d1cf --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java @@ -0,0 +1,374 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Map; + +/**use this class instead of com.alibaba.fastjson.JSONObject + * @author Lemon + * @see #put + * @see #puts + * @see #putsAll + */ +public class JSONObject extends com.alibaba.fastjson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONObject"; + + + /**ordered + */ + public JSONObject() { + super(true); + } + /**transfer Object to JSONObject + * @param object + * @see {@link #JSONObject(Object, boolean)} + */ + public JSONObject(Object object) { + this(toJSONString(object)); + } + /**parse JSONObject with JSON String + * @param json + * @see {@link #JSONObject(String, boolean)} + */ + public JSONObject(String json) { + this(parseObject(json)); + } + /**transfer com.alibaba.fastjson.JSONObject to JSONObject + * @param object + * @see {@link #putsAll(com.alibaba.fastjson.JSONObject)} + */ + public JSONObject(com.alibaba.fastjson.JSONObject object) { + this(); + putsAll(object); + } + + + + + //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ARRAY = "[]"; + + /**判断是否为Array的key + * @param key + * @return + */ + public static boolean isArrayKey(String key) { + return key != null && key.endsWith(KEY_ARRAY); + } + /**判断是否为对应Table的key + * @param key + * @return + */ + public static boolean isTableKey(String key) { + return StringUtil.isBigName(key); + } + //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + + /**set "id":id in Table layer + * @param id + * @return + */ + public JSONObject setId(Long id) { + return puts(KEY_ID, id); + } + /**set id{}:[] in Table layer + * @param list + * @return + */ + public JSONObject setIdIn(List list) { + return puts(KEY_ID_IN, list); + } + + + //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ROLE = "@role"; //角色,拥有对某些数据的某些操作的权限 + public static final String KEY_CONDITION = "@condition"; //条件 TODO 用 @where& @where| @where! 替代? + public static final String KEY_TRY = "@try"; //尝试,忽略异常 + public static final String KEY_DROP = "@drop"; //丢弃,不返回 + public static final String KEY_CORRECT = "@correct"; //字段校正 + + public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明 + public static final String KEY_ABOUT = "@about"; //关于,返回数据库表的信息,包括表说明和字段说明 + public static final String KEY_COLUMN = "@column"; //查询的Table字段或SQL函数 + public static final String KEY_GROUP = "@group"; //分组方式 + public static final String KEY_HAVING = "@having"; //聚合函数条件,一般和@group一起用 + public static final String KEY_ORDER = "@order"; //排序方式 + //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> + + + /**set role of request sender + * @param role + * @return this + */ + public JSONObject setRole(String role) { + return puts(KEY_ROLE, role); + } + + /**set try, ignore exceptions + * @param tri + * @return this + */ + public JSONObject setTry(boolean tri) { + return puts(KEY_TRY, tri); + } + + /**set drop, data dropped will not return + * @param drop + * @return this + */ + public JSONObject setDrop(boolean drop) { + return puts(KEY_DROP, drop); + } + + /**set correct, correct keys to target ones + * @param correct Map{originKey, [posibleKeys]}, posibleKey之间用 , 隔开 + * @return this + */ + public JSONObject setCorrect(Map correct) { + return puts(KEY_CORRECT, correct); + } + + + + /**set schema where table was puts + * @param schema + * @return this + */ + public JSONObject setSchema(String schema) { + return puts(KEY_SCHEMA, schema); + } + + /**set about + * @param about + * @return this + */ + public JSONObject setAbout(boolean about) { + return puts(KEY_ABOUT, about); + } + + /**set keys need to be returned + * @param keys key0, key1, key2 ... + * @return {@link #setColumn(String)} + */ + public JSONObject setColumn(String... keys) { + return setColumn(StringUtil.getString(keys, true)); + } + /**set keys need to be returned + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setColumn(String keys) { + return puts(KEY_COLUMN, keys); + } + + /**set keys for group by + * @param keys key0, key1, key2 ... + * @return {@link #setGroup(String)} + */ + public JSONObject setGroup(String... keys) { + return setGroup(StringUtil.getString(keys, true)); + } + /**set keys for group by + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setGroup(String keys) { + return puts(KEY_GROUP, keys); + } + + /**set keys for having + * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... + * @return {@link #setHaving(String)} + */ + public JSONObject setHaving(String... keys) { + return setHaving(StringUtil.getString(keys, true)); + } + /**set keys for having + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setHaving(String keys) { + return puts(KEY_HAVING, keys); + } + + /**set keys for order by + * @param keys key0, key1+, key2- ... + * @return {@link #setOrder(String)} + */ + public JSONObject setOrder(String... keys) { + return setOrder(StringUtil.getString(keys, true)); + } + /**set keys for order by + * @param keys "key0,key1+,key2-..." + * @return + */ + public JSONObject setOrder(String keys) { + return puts(KEY_ORDER, keys); + } + + + //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //Request <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + /** + * @param key + * @param keys path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsPath(String key, String... keys) { + return puts(key+"@", StringUtil.getString(keys, "/")); + } + + /** + * @param key + * @param isNull + * @return {@link #puts(String, Object)} + */ + public JSONObject putsNull(String key, boolean isNull) { + return puts(key+"{}", SQL.isNull(isNull)); + } + /** + * trim = false + * @param key + * @param isEmpty + * @return {@link #putsEmpty(String, boolean, boolean)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty) { + return putsEmpty(key, isEmpty, false); + } + /** + * @param key + * @param isEmpty + * @return {@link #puts(String, Object)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty, boolean trim) { + return puts(key+"{}", SQL.isEmpty(key, isEmpty, trim)); + } + /** + * @param key + * @param compare <=0, >5 ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsLength(String key, String compare) { + return puts(key+"{}", SQL.length(key) + compare); + } + + /**设置搜索 + * type = SEARCH_TYPE_CONTAIN_FULL + * @param key + * @param value + * @return {@link #putsSearch(String, String, int)} + */ + public JSONObject putsSearch(String key, String value) { + return putsSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); + } + /**设置搜索 + * @param key + * @param value + * @param type + * @return {@link #puts(String, Object)} + */ + public JSONObject putsSearch(String key, String value, int type) { + return puts(key+"$", SQL.search(value, type)); + } + + //Request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + /**puts key-value in object into this + * @param object + * @return this + */ + public JSONObject putsAll(Map map) { + putAll(map); + return this; + } + @Override + public void putAll(Map map) { + if (map != null && map.isEmpty() == false) { + super.putAll(map); + } + } + + + + /**put and return this + * @param value must be annotated by {@link MethodAccess} + * @return {@link #puts(String, boolean)} + */ + public JSONObject puts(Object value) { + return puts(null, value); + } + /**put and return this + * @param key + * @param value + * @return this + * @see {@link #put(String, Object)} + */ + public JSONObject puts(String key, Object value) { + put(key, value); + return this; + } + + /**put and return value + * @param value must be annotated by {@link MethodAccess} + * @return {@link #put(String, boolean)} + */ + public Object put(Object value) { + return put(null, value); + } + /**put and return value + * @param key StringUtil.isEmpty(key, true) ? key = value.getClass().getSimpleName(); + * @param value + * @return value + */ + @Override + public Object put(String key, Object value) { + if (value == null) { + Log.e(TAG, "put value == null >> return null;"); + return null; + } + if (StringUtil.isEmpty(key, true)) { + Class clazz = value.getClass(); + if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { + throw new IllegalArgumentException("puts StringUtil.isNotEmpty(key, true) == false" + + " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + + " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + + " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + + " \n 如果是类似 key[]:{} 结构的请求,建议用 putsAll(...) !"); + } + key = value.getClass().getSimpleName(); + } + return super.put(key, value); + } + + + +} diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java new file mode 100644 index 000000000..5d33b681d --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java @@ -0,0 +1,138 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.Map; + +/**wrapper for request + * @author Lemon + * @see #puts + * @see #toArray + * @use JSONRequest request = new JSONRequest(...); + *
request.puts(...);//not a must + *
request.toArray(...);//not a must + */ +public class JSONRequest extends JSONObject { + private static final long serialVersionUID = 1L; + + public JSONRequest() { + super(); + } + /** + * @param object must be annotated by {@link MethodAccess} + * @see {@link #JSONRequest(String, Object)} + */ + public JSONRequest(Object object) { + this(null, object); + } + /** + * @param name + * @param object + * @see {@link #puts(String, Object)} + */ + public JSONRequest(String name, Object object) { + this(); + puts(name, object); + } + + + + + public static final String KEY_TAG = "tag";//只在最外层,最外层用JSONRequest + + /**set "tag":tag in outermost layer + * for write operations + * @param tag + * @return + */ + public JSONRequest setTag(String tag) { + return puts(KEY_TAG, tag); + } + + + //array object <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int QUERY_TABLE = 0; + public static final int QUERY_TOTAL = 1; + public static final int QUERY_ALL = 2; + + public static final String KEY_QUERY = "query"; + public static final String KEY_COUNT = "count"; + public static final String KEY_PAGE = "page"; + + /**set what to query in Array layer + * @param query what need to query, Table,total,ALL? + * @return + * @see {@link #QUERY_TABLE} + * @see {@link #QUERY_TOTAL} + * @see {@link #QUERY_ALL} + */ + public JSONRequest setQuery(int query) { + return puts(KEY_QUERY, query); + } + /**set maximum count of Tables to query in Array layer + * @param count <= 0 || >= max ? max : count + * @return + */ + public JSONRequest setCount(int count) { + return puts(KEY_COUNT, count); + } + /**set page of Tables to query in Array layer + * @param page <= 0 ? 0 : page + * @return + */ + public JSONRequest setPage(int page) { + return puts(KEY_PAGE, page); + } + //array object >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + /**create a parent JSONObject named KEY_ARRAY + * @param count + * @param page + * @return {@link #toArray(int, int, boolean)} + */ + public JSONRequest toArray(int count, int page) { + return toArray(count, page, null); + } + /**create a parent JSONObject named name+KEY_ARRAY. + * @param count + * @param page + * @param name + * @return {name+KEY_ARRAY : this}. if needs to be put, use {@link #add(com.alibaba.fastjson.JSONObject)} instead + */ + public JSONRequest toArray(int count, int page, String name) { + return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page)); + } + + + @Override + public JSONObject putsAll(Map map) { + super.putsAll(map); + return this; + } + + @Override + public JSONRequest puts(Object value) { + return puts(null, value); + } + @Override + public JSONRequest puts(String key, Object value) { + super.puts(key, value); + return this; + } + +} diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java new file mode 100644 index 000000000..f9b6d3fc9 --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java @@ -0,0 +1,400 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Set; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/**parser for response + * @author Lemon + * @see #getObject + * @see #getList + * @use JSONResponse response = new JSONResponse(json); + *
User user = response.getObject(User.class);//not a must + *
List commenntList = response.getList("Comment[]", Comment.class);//not a must + */ +public class JSONResponse extends zuo.biao.apijson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONResponse"; + + public JSONResponse() { + super(); + } + public JSONResponse(String json) { + this(parseObject(json)); + } + public JSONResponse(JSONObject object) { + super(format(object)); + } + + //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int CODE_SUCCESS = 200; //成功 + public static final int CODE_UNSUPPORTED_ENCODING = 400; //编码错误 + public static final int CODE_ILLEGAL_ACCESS = 401; //权限错误 + public static final int CODE_UNSUPPORTED_OPERATION = 403; //禁止操作 + public static final int CODE_NOT_FOUND = 404; //未找到 + public static final int CODE_ILLEGAL_ARGUMENT = 406; //参数错误 + public static final int CODE_NOT_LOGGED_IN = 407; //未登录 + public static final int CODE_TIME_OUT = 408; //超时 + public static final int CODE_CONFLICT = 409; //重复,已存在 + public static final int CODE_CONDITION_ERROR = 412; //条件错误,如密码错误 + public static final int CODE_UNSUPPORTED_TYPE = 415; //类型错误 + public static final int CODE_OUT_OF_RANGE = 416; //超出范围 + public static final int CODE_NULL_POINTER = 417; //对象为空 + public static final int CODE_SERVER_ERROR = 500; //服务器内部错误 + + + public static final String MSG_SUCCEED = "success"; //成功 + public static final String MSG_SERVER_ERROR = "Internal Server Error!"; //服务器内部错误 + + + public static final String KEY_CODE = "code"; + public static final String KEY_MSG = "msg"; + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + public static final String KEY_COUNT = "count"; + public static final String KEY_TOTAL = "total"; + + /**获取状态 + * @return + */ + public int getCode() { + try { + return getIntValue(KEY_CODE); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取信息 + * @return + */ + public String getMsg() { + return getString(KEY_MSG); + } + /**获取id + * @return + */ + public long getId() { + try { + return getLongValue(KEY_ID); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取数量 + * @return + */ + public int getCount() { + try { + return getIntValue(KEY_COUNT); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取总数 + * @return + */ + public int getTotal() { + try { + return getIntValue(KEY_TOTAL); + } catch (Exception e) { + //empty + } + return 0; + } + + + /**是否成功 + * @return + */ + public boolean isSuccess() { + return isSuccess(getCode()); + } + /**是否成功 + * @param code + * @return + */ + public static boolean isSuccess(int code) { + return code == CODE_SUCCESS; + } + /**是否成功 + * @param response + * @return + */ + public static boolean isSuccess(JSONResponse response) { + return response != null && response.isSuccess(); + } + + /**校验服务端是否存在table + * @return + */ + public boolean isExist() { + return isExist(getCount()); + } + /**校验服务端是否存在table + * @param count + * @return + */ + public static boolean isExist(int count) { + return count > 0; + } + /**校验服务端是否存在table + * @param response + * @return + */ + public static boolean isExist(JSONResponse response) { + return response != null && response.isExist(); + } + + /**获取内部的JSONResponse + * @param key + * @return + */ + public JSONResponse getJSONResponse(String key) { + return getObject(key, JSONResponse.class); + } + //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + /** + * key = clazz.getSimpleName() + * @param clazz + * @return + */ + public T getObject(Class clazz) { + return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); + } + /** + * @param key + * @param clazz + * @return + */ + public T getObject(String key, Class clazz) { + return getObject(this, key, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static T getObject(JSONObject object, String key, Class clazz) { + return toObject(object == null ? null : object.getJSONObject(key), clazz); + } + + /** + * @param clazz + * @return + */ + public T toObject(Class clazz) { + return toObject(this, clazz); + } + /** + * @param object + * @param clazz + * @return + */ + public static T toObject(JSONObject object, Class clazz) { + return JSON.parseObject(JSON.toJSONString(object), clazz); + } + + + + + /** + * key = KEY_ARRAY + * @param clazz + * @return + */ + public List getList(Class clazz) { + return getList(KEY_ARRAY, clazz); + } + /** + * arrayObject = this + * @param key + * @param clazz + * @return + */ + public List getList(String key, Class clazz) { + return getList(this, key, clazz); + } + + /** + * key = KEY_ARRAY + * @param object + * @param clazz + * @return + */ + public static List getList(JSONObject object, Class clazz) { + return getList(object, KEY_ARRAY, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static List getList(JSONObject object, String key, Class clazz) { + return object == null ? null : JSON.parseArray(object.getString(replaceArray(key)), clazz); + } + + /** + * key = KEY_ARRAY + * @return + */ + public JSONArray getArray() { + return getArray(KEY_ARRAY); + } + /** + * @param key + * @return + */ + public JSONArray getArray(String key) { + return getArray(this, key); + } + /** + * @param object + * @return + */ + public static JSONArray getArray(JSONObject object) { + return getArray(object, KEY_ARRAY); + } + /** + * key = KEY_ARRAY + * @param object + * @param key + * @return + */ + public static JSONArray getArray(JSONObject object, String key) { + return object == null ? null : object.getJSONArray(replaceArray(key)); + } + + + // /** + // * @return + // */ + // public JSONObject format() { + // return format(this); + // } + /**格式化key名称 + * @param object + * @return + */ + public static JSONObject format(final JSONObject object) { + //太长查看不方便,不如debug Log.i(TAG, "format object = \n" + JSON.toJSONString(object)); + if (object == null || object.isEmpty()) { + Log.i(TAG, "format object == null || object.isEmpty() >> return object;"); + return object; + } + JSONObject formatedObject = new JSONObject(true); + + Set set = object.keySet(); + if (set != null) { + + Object value; + for (String key : set) { + value = object.get(key); + + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedObject.put(replaceArray(key), format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedObject.put(getSimpleName(key), format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedObject.put(getSimpleName(key), value); + } + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedObject = " + JSON.toJSONString(formatedObject)); + return formatedObject; + } + + /**格式化key名称 + * @param array + * @return + */ + public static JSONArray format(final JSONArray array) { + //太长查看不方便,不如debug Log.i(TAG, "format array = \n" + JSON.toJSONString(array)); + if (array == null || array.isEmpty()) { + Log.i(TAG, "format array == null || array.isEmpty() >> return array;"); + return array; + } + JSONArray formatedArray = new JSONArray(); + + Object value; + for (int i = 0; i < array.size(); i++) { + value = array.get(i); + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedArray.add(format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedArray.add(format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedArray.add(value); + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedArray = " + JSON.toJSONString(formatedArray)); + return formatedArray; + } + + /**替换key+KEY_ARRAY为keyList + * @param key + * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} + */ + public static String replaceArray(String key) { + if (isArrayKey(key)) { + key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); + } + return getSimpleName(key); + } + /**获取列表变量名 + * @param key => StringUtil.getNoBlankString(key) + * @return empty ? "list" : key + "List" 且首字母小写 + */ + public static String getArrayKey(String key) { + return StringUtil.addSuffix(key, "list"); + } + + /**获取简单名称 + * @param fullName name 或 name:alias + * @return name => name; name:alias => alias + */ + public static String getSimpleName(String fullName) { + //key:alias -> alias; key:alias[] -> alias[] + int index = fullName == null ? -1 : fullName.indexOf(":"); + if (index >= 0) { + fullName = fullName.substring(index + 1); + } + return fullName; + } + + +} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/MethodAccess.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodAccess.java similarity index 74% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/MethodAccess.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodAccess.java index 1cf14dc6e..939571625 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/MethodAccess.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodAccess.java @@ -36,37 +36,37 @@ public @interface MethodAccess { /**@see {@link RequestMethod#GET} - * @return 该请求方法允许的结构 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ RequestRole[] GET() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; /**@see {@link RequestMethod#HEAD} - * @return 该请求方法允许的结构 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ RequestRole[] HEAD() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; - /**@see {@link RequestMethod#POST_GET} - * @return 该请求方法允许的结构 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + /**@see {@link RequestMethod#GETS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ - RequestRole[] POST_GET() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + RequestRole[] GETS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; - /**@see {@link RequestMethod#POST_HEAD} - * @return 该请求方法允许的结构 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + /**@see {@link RequestMethod#HEADS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ - RequestRole[] POST_HEAD() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + RequestRole[] HEADS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; /**@see {@link RequestMethod#POST} - * @return 该请求方法允许的结构 default {LOGIN, ADMIN}; + * @return 该请求方法允许的角色 default {LOGIN, ADMIN}; */ RequestRole[] POST() default {LOGIN, ADMIN}; /**@see {@link RequestMethod#PUT} - * @return 该请求方法允许的结构 default {OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; */ RequestRole[] PUT() default {OWNER, ADMIN}; /**@see {@link RequestMethod#DELETE} - * @return 该请求方法允许的结构 default {OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; */ RequestRole[] DELETE() default {OWNER, ADMIN}; diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/MethodStructure.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodStructure.java similarity index 91% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/MethodStructure.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodStructure.java index ffd2a0c3c..27c30c96d 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/MethodStructure.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodStructure.java @@ -30,15 +30,15 @@ @Target(TYPE) public @interface MethodStructure { - /**@see {@link RequestMethod#POST_HEAD} + /**@see {@link RequestMethod#HEADS} * @return 该请求方法允许的结构 */ - String POST_HEAD() default ""; + String HEADS() default ""; - /**@see {@link RequestMethod#POST_GET} + /**@see {@link RequestMethod#GETS} * @return 该请求方法允许的结构 */ - String POST_GET() default ""; + String GETS() default ""; /**@see {@link RequestMethod#POST} * @return 该请求方法允许的结构 diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/RequestMethod.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java similarity index 74% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/RequestMethod.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java index 11f928134..a450baad8 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/RequestMethod.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java @@ -14,7 +14,7 @@ package zuo.biao.apijson; -/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出POST_GET,POST_HEAD方法 +/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出GETS,HEADS方法 * @author Lemon */ public enum RequestMethod { @@ -29,15 +29,15 @@ public enum RequestMethod { */ HEAD, - /** - * 通过POST来GET数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 + /**Safe, Single, Simple + *
限制性GET,通过POST来GET数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 */ - POST_GET, + GETS, - /** - * 通过POST来HEAD数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 + /**Safe, Single, Simple + *
限制性HEAD,通过POST来HEAD数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 */ - POST_HEAD, + HEADS, /** * 新增(或者说插入)数据 @@ -57,22 +57,22 @@ public enum RequestMethod { /**是否为GET请求方法 * @param method - * @param containPrivate 包含私密(非明文)获取方法POST_GET + * @param containPrivate 包含私密(非明文)获取方法GETS * @return */ public static boolean isGetMethod(RequestMethod method, boolean containPrivate) { boolean is = method == null || method == GET; - return containPrivate == false ? is : is || method == POST_GET; + return containPrivate == false ? is : is || method == GETS; } /**是否为HEAD请求方法 * @param method - * @param containPrivate 包含私密(非明文)获取方法POST_HEAD + * @param containPrivate 包含私密(非明文)获取方法HEADS * @return */ public static boolean isHeadMethod(RequestMethod method, boolean containPrivate) { boolean is = method == HEAD; - return containPrivate == false ? is : is || method == POST_HEAD; + return containPrivate == false ? is : is || method == HEADS; } /**是否为查询的请求方法 diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/RequestRole.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestRole.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/RequestRole.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestRole.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/SQL.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java similarity index 67% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/SQL.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java index 63f532b52..a9da023e5 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/SQL.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java @@ -22,8 +22,16 @@ public class SQL { public static final String OR = " OR "; public static final String AND = " AND "; public static final String NOT = " NOT "; + public static final String AS = " AS "; public static final String IS = " is "; public static final String NULL = " null "; + + //括号必须紧跟函数名! count (...) 报错! + public static final String COUNT = "count"; + public static final String SUM = "sum"; + public static final String MAX = "max"; + public static final String MIN = "min"; + public static final String AVG = "avg"; /** * isNull = true @@ -34,7 +42,7 @@ public static String isNull() { } /** * @param isNull - * @return IS + (isNull ? "" : NOT) + NULL; + * @return {@link #IS} + (isNull ? "" : {@link #NOT}) + {@link #NULL}; */ public static String isNull(boolean isNull) { return IS + (isNull ? "" : NOT) + NULL; @@ -87,7 +95,7 @@ public static String isEmpty(String s, boolean isEmpty, boolean trim) { * @param s * @param isEmpty <=0 * @param trim s = trim(s); - * @param nullable isNull(s, true) + OR + + * @param nullable isNull(s, true) + {@link #OR} + * @return {@link #lengthCompare(String, String)} */ public static String isEmpty(String s, boolean isEmpty, boolean trim, boolean nullable) { @@ -171,30 +179,30 @@ public static String subString(String s, int start, int end) { /** * @param s - * @param c - * @return "instr(" + s + "," + c + ")" + * @param c -> 'c' + * @return "instr(" + s + ", '" + c + "')" */ public static String indexOf(String s, String c) { - return "instr(" + s + "," + c + ")"; + return "instr(" + s + ", '" + c + "')"; } /** * @param s - * @param c1 - * @param c2 - * @return + * @param c1 -> 'c1' + * @param c2 -> 'c2' + * @return "replace(" + s + ", '" + c1 + "', '" + c2 + "')" */ public static String replace(String s, String c1, String c2) { - return "replace(" + s + "," + c1 + "," + c2 + ")"; + return "replace(" + s + ", '" + c1 + "', '" + c2 + "')"; } /** * @param s1 - * @param s2 - * @return "strcmp(" + s1 + "," + s2 + ")" + * @param s2 -> 's2' + * @return "strcmp(" + s1 + ", '" + s2 + "')" */ public static String equals(String s1, String s2) { - return "strcmp(" + s1 + "," + s2 + ")"; + return "strcmp(" + s1 + ", '" + s2 + "')"; } /** @@ -212,9 +220,98 @@ public static String toLowerCase(String s) { return "lower(" + s + ")"; } + + + //column and function<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**字段 + * @param column + * @return column.isEmpty() ? "*" : column; + */ + public static String column(String column) { + column = StringUtil.getTrimedString(column); + return column.isEmpty() ? "*" : column; + } + /**有别名的字段 + * @param column + * @return {@link #count(String)} + {@link #AS}; + */ + public static String columnAs(String column) { + return count(column) + AS; + } + + /**函数 + * @param column if (StringUtil.isEmpty(column, true) || column.contains(",")) -> column = null; + * @return " " + fun + "(" + {@link #column(String)} + ") "; + */ + public static String function(String fun, String column) { + if (StringUtil.isEmpty(column, true) || column.contains(",")) { + column = null; //解决 count(id,name) 这种多个字段导致的SQL异常 + } + return " " + fun + "(" + column(column) + ") "; + } + /**有别名的函数 + * @param column + * @return {@link #function(String, String)} + {@link #AS} + fun; + */ + public static String functionAs(String fun, String column) { + return function(fun, column) + AS + fun + " "; + } + + /**计数 + * column = null + * @return {@link #count(String)} + */ + public static String count() { + return count(null); + } + /**计数 + * fun = {@link #COUNT} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String count(String column) { + return functionAs(COUNT, column); + } + /**求和 + * fun = {@link #SUM} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String sum(String column) { + return functionAs(SUM, column); + } + /**最大值 + * fun = {@link #MAX} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String max(String column) { + return functionAs(MAX, column); + } + /**最小值 + * fun = {@link #MIN} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String min(String column) { + return functionAs(MIN, column); + } + /**平均值 + * fun = {@link #AVG} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String avg(String column) { + return functionAs(AVG, column); + } - + //column and function>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //search<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static final int SEARCH_TYPE_CONTAIN_FULL = 0; public static final int SEARCH_TYPE_CONTAIN_ORDER = 1; @@ -286,5 +383,7 @@ public static String search(String s, int type, boolean ignoreCase) { return "%" + s + "%"; } } + + //search>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/StringUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java old mode 100755 new mode 100644 similarity index 85% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/StringUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java index d5076b99c..b219b430a --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/StringUtil.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java @@ -17,7 +17,6 @@ import java.io.File; import java.math.BigDecimal; import java.text.DecimalFormat; -import java.util.regex.Matcher; import java.util.regex.Pattern; /**通用字符串(String)相关类,为null时返回"" @@ -100,7 +99,7 @@ public static String getString(String s) { * @param array * @return {@link #getString(String[], boolean)} */ - public static String getString(String[] array) { + public static String getString(Object[] array) { return getString(array, false); } /**获取string,为null则返回"" @@ -109,7 +108,7 @@ public static String getString(String[] array) { * @param ignoreEmptyItem * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, boolean ignoreEmptyItem) { + public static String getString(Object[] array, boolean ignoreEmptyItem) { return getString(array, null, ignoreEmptyItem); } /**获取string,为null则返回"" @@ -118,7 +117,7 @@ public static String getString(String[] array, boolean ignoreEmptyItem) { * @param split * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, String split) { + public static String getString(Object[] array, String split) { return getString(array, split, false); } /**获取string,为null则返回"" @@ -127,7 +126,7 @@ public static String getString(String[] array, String split) { * @param ignoreEmptyItem * @return */ - public static String getString(String[] array, String split, boolean ignoreEmptyItem) { + public static String getString(Object[] array, String split, boolean ignoreEmptyItem) { String s = ""; if (array != null) { if (split == null) { @@ -304,17 +303,25 @@ public static boolean isNotEmpty(String s, boolean trim) { //判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final Pattern ALPHA_PATTERN; - public static final Pattern PASSWORD_PATTERN; - public static final Pattern NAME_PATTERN; - public static final Pattern BIG_ALPHA_PATTERN; - public static final Pattern SMALL_ALPHA_PATTERN; + public static final Pattern PATTERN_NUMBER; + public static final Pattern PATTERN_PHONE; + public static final Pattern PATTERN_EMAIL; + public static final Pattern PATTERN_ID_CARD; + public static final Pattern PATTERN_ALPHA; + public static final Pattern PATTERN_PASSWORD; //TODO + public static final Pattern PATTERN_NAME; + public static final Pattern PATTERN_ALPHA_BIG; + public static final Pattern PATTERN_ALPHA_SMALL; static { - ALPHA_PATTERN = Pattern.compile("[a-zA-Z]"); - PASSWORD_PATTERN = Pattern.compile("^[0-9a-zA-Z_]+$"); - NAME_PATTERN = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 - BIG_ALPHA_PATTERN = Pattern.compile("[A-Z]"); - SMALL_ALPHA_PATTERN = Pattern.compile("[a-z]"); + PATTERN_NUMBER = Pattern.compile("^[0-9]+$"); + PATTERN_ALPHA = Pattern.compile("^[a-zA-Z]+$"); + PATTERN_ALPHA_BIG = Pattern.compile("^[A-Z]+$"); + PATTERN_ALPHA_SMALL = Pattern.compile("^[a-z]+$"); + PATTERN_NAME = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 + PATTERN_PHONE = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); + PATTERN_EMAIL = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); + PATTERN_ID_CARD = Pattern.compile("(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)"); + PATTERN_PASSWORD = Pattern.compile("^[0-9a-zA-Z]+$"); } /**判断手机格式是否正确 @@ -326,18 +333,15 @@ public static boolean isPhone(String phone) { return false; } - Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); - currentString = phone; - - return p.matcher(phone).matches(); + return PATTERN_PHONE.matcher(phone).matches(); } /**判断手机格式是否正确 * @param s * @return */ public static boolean isPassword(String s) { - return getLength(s, false) >= 6 && PASSWORD_PATTERN.matcher(s).matches(); + return getLength(s, false) >= 6 && PATTERN_PASSWORD.matcher(s).matches(); } /**判断是否全是数字密码 * @param s @@ -355,12 +359,8 @@ public static boolean isEmail(String email) { return false; } - String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; - Pattern p = Pattern.compile(str); - currentString = email; - - return p.matcher(email).matches(); + return PATTERN_EMAIL.matcher(email).matches(); } @@ -380,39 +380,20 @@ public static boolean isNumer(String s) { return false; } - Pattern pattern = Pattern.compile("[0-9]"); - Matcher matcher; - for (int i = 0; i < s.length(); i++) { - matcher = pattern.matcher(s.substring(i, i+1)); - if(! matcher.matches()){ - return false; - } - } - currentString = s; - - return true; + return PATTERN_NUMBER.matcher(s).matches(); } /**判断是否全是字母 * @param s * @return */ public static boolean isAlpha(String s) { - if (s == null) { - Log.i(TAG, "isNumberOrAlpha inputed == null >> return false;"); + if (isEmpty(s, true)) { return false; } - Pattern pAlpha = Pattern.compile("[a-zA-Z]"); - Matcher mAlpha; - for (int i = 0; i < s.length(); i++) { - mAlpha = pAlpha.matcher(s.substring(i, i+1)); - if(! mAlpha.matches()){ - return false; - } - } currentString = s; - return true; + return PATTERN_ALPHA.matcher(s).matches(); } /**判断是否全是数字或字母 * @param s @@ -422,53 +403,53 @@ public static boolean isNumberOrAlpha(String s) { return isNumer(s) || isAlpha(s); } - /**判断是否为单词,只能包含字母,数字或下划线 + /**判断是否为代码名称,只能包含字母,数字或下划线 * @param s * @return */ - public static boolean isWord(String s) { - return s != null && NAME_PATTERN.matcher(s).matches(); + public static boolean isName(String s) { + return s != null && PATTERN_NAME.matcher(s).matches(); } - /**判断是否为首字母大写的单词 + /**判断是否为首字母大写的代码名称 * @param key * @return */ - public static boolean isBigWord(String s) { + public static boolean isBigName(String s) { s = getString(s); - if (s.isEmpty() || BIG_ALPHA_PATTERN.matcher(s.substring(0, 1)).matches() == false) { + if (s.isEmpty() || PATTERN_ALPHA_BIG.matcher(s.substring(0, 1)).matches() == false) { return false; } - return s.length() <= 1 ? true : isWord(s.substring(1)); + return s.length() <= 1 ? true : isName(s.substring(1)); } - /**判断是否为首字母小写的单词 + /**判断是否为首字母小写的代码名称 * @param key * @return */ - public static boolean isSmallWord(String s) { + public static boolean isSmallName(String s) { s = getString(s); - if (s.isEmpty() || SMALL_ALPHA_PATTERN.matcher(s.substring(0, 1)).matches() == false) { + if (s.isEmpty() || PATTERN_ALPHA_SMALL.matcher(s.substring(0, 1)).matches() == false) { return false; } - return s.length() <= 1 ? true : isWord(s.substring(1)); + return s.length() <= 1 ? true : isName(s.substring(1)); } /**判断字符类型是否是身份证号 - * @param idCard + * @param number * @return */ - public static boolean isIDCard(String idCard) { - if (isNumberOrAlpha(idCard) == false) { + public static boolean isIDCard(String number) { + if (isNumberOrAlpha(number) == false) { return false; } - idCard = getString(idCard); - if (idCard.length() == 15) { - Log.i(TAG, "isIDCard idCard.length() == 15 old IDCard"); - currentString = idCard; + number = getString(number); + if (number.length() == 15) { + Log.i(TAG, "isIDCard number.length() == 15 old IDCard"); + currentString = number; return true; } - if (idCard.length() == 18) { - currentString = idCard; + if (number.length() == 18) { + currentString = number; return true; } @@ -756,11 +737,21 @@ public static String[] split(String s) { return split(s, null); } /**将s用split分割成String[] + * trim = true; * @param s * @param split * @return */ public static String[] split(String s, String split) { + return split(s, split, true); + } + /**将s用split分割成String[] + * @param s + * @param split + * @param trim 去掉前后两端的split + * @return + */ + public static String[] split(String s, String split, boolean trim) { s = getString(s); if (s.isEmpty()) { return null; @@ -768,11 +759,13 @@ public static String[] split(String s, String split) { if (isNotEmpty(split, false) == false) { split = ","; } - while (s.startsWith(split)) { - s = s.substring(split.length()); - } - while (s.endsWith(split)) { - s = s.substring(0, s.length() - split.length()); + if (trim) { + while (s.startsWith(split)) { + s = s.substring(split.length()); + } + while (s.endsWith(split)) { + s = s.substring(0, s.length() - split.length()); + } } return s.contains(split) ? s.split(split) : new String[]{s}; } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/libs/zxing.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/libs/zxing.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/libs/zxing.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/libs/zxing.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/proguard-rules.pro b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/proguard-rules.pro similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/proguard-rules.pro rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/proguard-rules.pro diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/androidTest/java/com/ericssonlabs/ApplicationTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/androidTest/java/com/ericssonlabs/ApplicationTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/androidTest/java/com/ericssonlabs/ApplicationTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/androidTest/java/com/ericssonlabs/ApplicationTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/AndroidManifest.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/AndroidManifest.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/activity/CaptureActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/activity/CaptureActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/activity/CaptureActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/activity/CaptureActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/AutoFocusCallback.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/AutoFocusCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/AutoFocusCallback.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/AutoFocusCallback.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraConfigurationManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraConfigurationManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraConfigurationManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraConfigurationManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/CameraManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/FlashlightManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/FlashlightManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/FlashlightManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/FlashlightManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PlanarYUVLuminanceSource.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PlanarYUVLuminanceSource.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PlanarYUVLuminanceSource.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PlanarYUVLuminanceSource.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PreviewCallback.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PreviewCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PreviewCallback.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/camera/PreviewCallback.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/CaptureActivityHandler.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/CaptureActivityHandler.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/CaptureActivityHandler.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/CaptureActivityHandler.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeFormatManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeFormatManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeFormatManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeFormatManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeHandler.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeHandler.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeHandler.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeHandler.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeThread.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeThread.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeThread.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/DecodeThread.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/FinishListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/FinishListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/FinishListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/FinishListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/InactivityTimer.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/InactivityTimer.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/InactivityTimer.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/InactivityTimer.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/Intents.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/Intents.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/Intents.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/decoding/Intents.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/encoding/EncodingHandler.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/encoding/EncodingHandler.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/encoding/EncodingHandler.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/encoding/EncodingHandler.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderResultPointCallback.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderResultPointCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderResultPointCallback.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderResultPointCallback.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/java/com/zxing/view/ViewfinderView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/layout/camera.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/layout/camera.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/layout/camera.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/layout/camera.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/layout/main.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/layout/main.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/layout/main.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/layout/main.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/raw/beep.ogg b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/raw/beep.ogg similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/raw/beep.ogg rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/raw/beep.ogg diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/raw/realm_properties b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/raw/realm_properties similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/raw/realm_properties rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/raw/realm_properties diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/values/colors.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/values/colors.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/values/colors.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/values/colors.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/values/ids.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/values/ids.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/main/res/values/ids.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/main/res/values/ids.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/test/java/com/ericssonlabs/ExampleUnitTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/test/java/com/ericssonlabs/ExampleUnitTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/QRCodeLibrary/src/test/java/com/ericssonlabs/ExampleUnitTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/QRCodeLibrary/src/test/java/com/ericssonlabs/ExampleUnitTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/android-support-v4.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/android-support-v4.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/android-support-v4.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/android-support-v4.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/okhttp-2.1.0.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/okio-1.0.0.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/libs/universal-image-loader-1.9.4.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/proguard-rules.pro b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/proguard-rules.pro similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/proguard-rules.pro rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/proguard-rules.pro diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/androidTest/java/zuo/biao/library/ApplicationTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/androidTest/java/zuo/biao/library/ApplicationTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/androidTest/java/zuo/biao/library/ApplicationTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/androidTest/java/zuo/biao/library/ApplicationTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/AndroidManifest.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/AndroidManifest.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseApplication.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseApplication.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseApplication.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseApplication.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomTabActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomTabActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomTabActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomTabActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBottomWindow.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBroadcastReceiver.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBroadcastReceiver.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBroadcastReceiver.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseBroadcastReceiver.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseFragment.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseHttpListFragment.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseListFragment.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseModel.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseModel.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseModel.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseModel.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabFragment.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseTabFragment.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewBottomWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewBottomWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewBottomWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/BaseViewBottomWindow.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/base/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ActivityPresenter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ActivityPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ActivityPresenter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ActivityPresenter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterCallBack.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterCallBack.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterCallBack.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterCallBack.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterViewPresenter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterViewPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterViewPresenter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/AdapterViewPresenter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/CacheCallBack.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/CacheCallBack.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/CacheCallBack.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/CacheCallBack.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/FragmentPresenter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/FragmentPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/FragmentPresenter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/FragmentPresenter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnAddListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnAddListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnAddListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnAddListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnBottomDragListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnBottomDragListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnBottomDragListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnBottomDragListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnProgressListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnProgressListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnProgressListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnProgressListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnReachViewBorderListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnReachViewBorderListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnReachViewBorderListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnReachViewBorderListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnRemoveListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnRemoveListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnRemoveListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnRemoveListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnResultListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnResultListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnResultListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnResultListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnStopLoadListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnStopLoadListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnStopLoadListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/OnStopLoadListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/Presenter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/Presenter.java similarity index 87% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/Presenter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/Presenter.java index 5b1f41faa..d10142880 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/Presenter.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/Presenter.java @@ -28,6 +28,13 @@ public interface Presenter { static final String INTENT_VERIFY = "INTENT_VERIFY"; static final String INTENT_USER_ID = "INTENT_USER_ID"; static final String RESULT_DATA = "RESULT_DATA"; + static final String RESULT_ID = "RESULT_ID"; + static final String RESULT_TYPE = "RESULT_TYPE"; + static final String RESULT_PHONE = "RESULT_PHONE"; + static final String RESULT_PASSWORD = "RESULT_PASSWORD"; + static final String RESULT_VERIFY = "RESULT_VERIFY"; + static final String RESULT_USER_ID = "RESULT_USER_ID"; + static final String ACTION_EXIT_APP = "ACTION_EXIT_APP"; /** diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ViewPresenter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ViewPresenter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ViewPresenter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/ViewPresenter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/interfaces/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/Cache.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/Cache.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/Cache.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/Cache.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CacheManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CacheManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CacheManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CacheManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CityDB.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CityDB.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CityDB.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/CityDB.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/HttpManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/HttpManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/HttpManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/HttpManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/SystemBarTintManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/SystemBarTintManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/SystemBarTintManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/SystemBarTintManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/ThreadManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/ThreadManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/ThreadManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/ThreadManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/TimeRefresher.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/TimeRefresher.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/TimeRefresher.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/TimeRefresher.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/manager/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/City.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/City.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/City.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/City.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Entry.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Entry.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Entry.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Entry.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/GridPickerConfig.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/GridPickerConfig.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/GridPickerConfig.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/GridPickerConfig.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Menu.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Menu.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Menu.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Menu.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Parameter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Parameter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Parameter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/Parameter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/AlertDialog.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/AlertDialog.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/AlertDialog.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/AlertDialog.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/BottomMenuWindow.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/CutPictureActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/CutPictureActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/CutPictureActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/CutPictureActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/DatePickerWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/DatePickerWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/DatePickerWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/DatePickerWindow.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoWindow.java similarity index 89% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoWindow.java index b83f985e3..adcca7ea1 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoWindow.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextInfoWindow.java @@ -144,22 +144,25 @@ public void initView() {//必须调用 public static final String INTENT_PACKAGE_NAME = "INTENT_PACKAGE_NAME"; - public static final int TYPE_NICK = 200 + ContactUtil.TYPE_NICK; - public static final int TYPE_NAME = 200 + ContactUtil.TYPE_NAME; - - public static final int TYPE_PHONE = 200 + ContactUtil.TYPE_PHONE; - public static final int TYPE_WEBSITE = 200 + ContactUtil.TYPE_WEBSITE; - public static final int TYPE_EMAIL = 200 + ContactUtil.TYPE_EMAIL; - public static final int TYPE_FAX = 200 + ContactUtil.TYPE_FAX; - - public static final int TYPE_USUALADDRESS = 200 + ContactUtil.TYPE_USUALADDRESS; - public static final int TYPE_MAILADDRESS = 200 + ContactUtil.TYPE_MAILADDRESS; - public static final int TYPE_SCHOOL = 200 + ContactUtil.TYPE_SCHOOL; - public static final int TYPE_COMPANY = 200 + ContactUtil.TYPE_COMPANY; - - public static final int TYPE_PROFESSION = 200 + ContactUtil.TYPE_PROFESSION; - public static final int TYPE_NOTE = 200 + ContactUtil.TYPE_NOTE; - // public static final int TYPE_OTHER = 200 + ContactUtil.TYPE_OTHER; + public static final int TYPE_NICK = ContactUtil.TYPE_NICK; + public static final int TYPE_NAME = ContactUtil.TYPE_NAME; + + public static final int TYPE_PHONE = ContactUtil.TYPE_PHONE; + public static final int TYPE_WEBSITE = ContactUtil.TYPE_WEBSITE; + public static final int TYPE_EMAIL = ContactUtil.TYPE_EMAIL; + public static final int TYPE_FAX = ContactUtil.TYPE_FAX; + + public static final int TYPE_USUALADDRESS = ContactUtil.TYPE_USUALADDRESS; + public static final int TYPE_MAILADDRESS = ContactUtil.TYPE_MAILADDRESS; + public static final int TYPE_SCHOOL = ContactUtil.TYPE_SCHOOL; + public static final int TYPE_COMPANY = ContactUtil.TYPE_COMPANY; + + public static final int TYPE_PROFESSION = ContactUtil.TYPE_PROFESSION; + public static final int TYPE_NOTE = ContactUtil.TYPE_NOTE; + // public static final int TYPE_OTHER = ContactUtil.TYPE_OTHER; + + public static final int TYPE_NUMBER = 21; + public static final int TYPE_DECIMAL = 22; public static final String INTENT_TYPE = "INTENT_TYPE"; public static final String INTENT_KEY = "INTENT_KEY"; @@ -186,16 +189,16 @@ public void initData() {//必须调用 maxEms = 20; break; case TYPE_PHONE: - etEditTextInfo.setInputType(InputType.TYPE_CLASS_PHONE); maxEms = 11; + etEditTextInfo.setInputType(InputType.TYPE_CLASS_PHONE); break; case TYPE_EMAIL: - etEditTextInfo.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); maxEms = 60; + etEditTextInfo.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); break; case TYPE_WEBSITE: - etEditTextInfo.setInputType(InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT); maxEms = 200; + etEditTextInfo.setInputType(InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT); break; case TYPE_MAILADDRESS: maxEms = 60; @@ -206,6 +209,14 @@ public void initData() {//必须调用 case TYPE_NOTE: maxEms = 100; break; + case TYPE_NUMBER: + maxEms = 10; + etEditTextInfo.setInputType(InputType.TYPE_NUMBER_VARIATION_NORMAL); + break; + case TYPE_DECIMAL: + maxEms = 20; + etEditTextInfo.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); + break; default: break; } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextManager.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/EditTextManager.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/GridPickerView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ItemDialog.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ItemDialog.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ItemDialog.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ItemDialog.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/KeyValueAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/KeyValueAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/KeyValueAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/KeyValueAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxHeightWrapLayout.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxHeightWrapLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxHeightWrapLayout.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxHeightWrapLayout.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxWidthWrapLayout.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxWidthWrapLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxWidthWrapLayout.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MaxWidthWrapLayout.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MyURLSpan.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MyURLSpan.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MyURLSpan.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/MyURLSpan.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PageScroller.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PageScroller.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PageScroller.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PageScroller.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PlacePickerWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PlacePickerWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PlacePickerWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/PlacePickerWindow.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SelectPictureActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SelectPictureActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SelectPictureActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SelectPictureActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ServerSettingActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ServerSettingActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ServerSettingActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/ServerSettingActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareLinearLayout.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareLinearLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareLinearLayout.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareLinearLayout.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareRelativeLayout.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareRelativeLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareRelativeLayout.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/SquareRelativeLayout.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TextClearSuit.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TextClearSuit.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TextClearSuit.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TextClearSuit.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TimePickerWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TimePickerWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TimePickerWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TimePickerWindow.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopMenuWindow.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopMenuWindow.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopMenuWindow.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopMenuWindow.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopTabView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopTabView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopTabView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/TopTabView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/WebViewActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/WebViewActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/WebViewActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/WebViewActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewFooter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewFooter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewFooter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewFooter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewHeader.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewHeader.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewHeader.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/ui/xlistview/XListViewHeader.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/CommonUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/CommonUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/CommonUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/CommonUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ContactUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ContactUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ContactUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ContactUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DataKeeper.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DataKeeper.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DataKeeper.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DataKeeper.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DownloadUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DownloadUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DownloadUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/DownloadUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/EditTextUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/EditTextUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/EditTextUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/EditTextUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ImageLoaderUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ImageLoaderUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ImageLoaderUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ImageLoaderUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/JSON.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/JSON.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/JSON.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/JSON.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/Log.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/Log.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/Log.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/Log.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/MD5Util.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/MD5Util.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/MD5Util.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/MD5Util.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/PlaceUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/PlaceUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/PlaceUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/PlaceUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SSLUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SSLUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SSLUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SSLUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ScreenUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ScreenUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ScreenUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/ScreenUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SettingUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SettingUtil.java similarity index 98% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SettingUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SettingUtil.java index 3aa82bbd0..7133d42f1 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/SettingUtil.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/SettingUtil.java @@ -229,15 +229,15 @@ public static boolean noDisturb() { /** * TODO 改为你的正式服务器地址 */ - public static final String URL_SERVER_ADDRESS_NORMAL_HTTP = "http://139.196.140.118:8080/";//正式服务器 + public static final String URL_SERVER_ADDRESS_NORMAL_HTTP = "http://39.108.143.172:8080/";//正式服务器 /** * TODO 改为你的正式服务器地址 */ - public static final String URL_SERVER_ADDRESS_NORMAL_HTTPS = "http://192.168.43.52:8080/";//正式服务器 + public static final String URL_SERVER_ADDRESS_NORMAL_HTTPS = "http://39.108.143.172:8080/";//正式服务器 /** * TODO 改为你的测试服务器地址,如果有的话 */ - public static final String URL_SERVER_ADDRESS_TEST = "http://192.168.2.105:8080/";//测试服务器 + public static final String URL_SERVER_ADDRESS_TEST = "http://192.168.0.100:8080/";//测试服务器 /**获取当前服务器地址 * isHttps = false diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/StringUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/StringUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/StringUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/StringUtil.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/TimeUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/TimeUtil.java similarity index 98% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/TimeUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/TimeUtil.java index d80e8a25d..5b7e47f83 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/ZBLibrary/src/zuo/biao/library/util/TimeUtil.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/TimeUtil.java @@ -243,6 +243,14 @@ public static String getSmartTime(long duration) { return smartTime; } + public static String getSmartDate(String date) { + date = StringUtil.getTrimedString(date); + try { + return getSmartDate(java.sql.Date.valueOf(date)); + } catch (Exception e) { + } + return date; + } public static String getSmartDate(Date date) { return date == null ? "" : getSmartDate(date.getTime()); } @@ -261,7 +269,7 @@ public static String getSmartDate(long date) { if (nowDetails[0] == smartDetail[0]) {//this year if(nowDetails[1] == smartDetail[1]) {//this month String time = " " + StringUtil.getString(new SimpleDateFormat("HH:mm").format(date)); - + long day = nowDetails[2] - smartDetail[2];//between/(24*3600); if (day >= 3) {//fomer day smartDate = String.valueOf(smartDetail[2]) + "日" + time; diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/java/zuo/biao/library/util/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in_keyboard.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in_keyboard.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in_keyboard.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_in_keyboard.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out_keyboard.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out_keyboard.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out_keyboard.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_push_out_keyboard.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_enter.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_enter.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_enter.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_enter.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_exit.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_exit.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_exit.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/bottom_window_exit.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/fade.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/fade.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/fade.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/fade.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/hold.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/hold.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/hold.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/hold.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_in.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_in.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_in.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_out.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_out.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/left_push_out.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/null_anim.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/null_anim.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/null_anim.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/null_anim.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/push_in.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/push_in.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/push_in.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/push_out.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/push_out.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/push_out.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_in.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_in.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_in.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_in.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_out.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_out.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_out.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/right_push_out.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_bottom.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_bottom.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_bottom.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_bottom.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_top.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_top.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_top.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_from_top.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_right.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_right.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_right.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_in_right.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_left.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_left.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_left.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_left.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_bottom.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_bottom.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_bottom.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_bottom.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_top.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_top.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_top.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/anim/slide_out_to_top.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/color/alpha_to_darker_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/color/alpha_to_darker_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/color/alpha_to_darker_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/color/alpha_to_darker_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/color/black_to_white_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/color/black_to_white_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/color/black_to_white_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/color/black_to_white_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/color/white_to_black_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/color/white_to_black_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/color/white_to_black_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/color/white_to_black_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_small.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_small.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/add_small.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back2_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/back_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light_small.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light_small.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/cancel_light_small.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/default_head.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/default_head.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/default_head.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/default_head.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_small.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_small.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/down2_small.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward2_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward2_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward2_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_small_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_small_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_small_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/forward_small_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_down.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_down.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_down.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_down.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_up.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_up.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_up.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/triangle_up.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/up2_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/up2_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/up2_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/up2_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/xlistview_arrow.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/xlistview_arrow.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/xlistview_arrow.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable-hdpi/xlistview_arrow.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha3.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha3.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha3.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha3.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha_to_darker_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha_to_darker_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha_to_darker_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/alpha_to_darker_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_black_to_white_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_black_to_white_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_black_to_white_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_black_to_white_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_gray_to_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_gray_to_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_gray_to_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_gray_to_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_green_to_darker_green.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_green_to_darker_green.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_green_to_darker_green.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_green_to_darker_green.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_item_to_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_item_to_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_item_to_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_item_to_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_pressed_common.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_pressed_common.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_pressed_common.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_pressed_common.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_gray.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_gray.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_gray.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/bg_white_to_gray.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_normal_shape.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_normal_shape.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_normal_shape.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_normal_shape.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_pressed_shape.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_pressed_shape.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_pressed_shape.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_pressed_shape.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_normal.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_normal.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_normal.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_pressed.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_pressed.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_normal.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_normal.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_normal.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_pressed.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_pressed.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_round_big_pressed.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_sky_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_sky_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_sky_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_sky_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_small.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_small.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_small.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_blue_small.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_green_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_green_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_green_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_green_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_orange_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_orange_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_orange_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_orange_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_normal.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_normal.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_normal.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_pressed.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_pressed.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/btn_red_round_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray_to_white.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray_to_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray_to_white.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/cilcle_gray_to_white.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_blue.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_blue.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_blue.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_blue.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_green.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_green.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_green.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_green.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_pink.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_pink.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_pink.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_pink.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_white.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_white.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_white.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_yellow.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_yellow.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_yellow.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/circle_yellow.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_common.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_common.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_common.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_common.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_map.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_map.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_map.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_map.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_rec.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_rec.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_rec.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_bg_rec.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_btn_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_btn_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_btn_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_btn_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_left_but_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_left_but_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_left_but_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_left_but_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_right_but_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_right_but_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_right_but_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_right_but_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_web_but_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_web_but_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_web_but_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/dialog_web_but_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_cusor.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_cusor.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_cusor.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_cusor.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_item_text_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_item_text_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_item_text_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_item_text_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_text_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_text_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_text_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/edit_text_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/green_rounded_rectangle_normal.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/green_rounded_rectangle_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/green_rounded_rectangle_normal.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/green_rounded_rectangle_normal.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_gray_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_gray_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_gray_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_gray_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_white_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_white_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_white_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/icon_white_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg_pressed.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg_pressed.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/input_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_blank_divider.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_blank_divider.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_blank_divider.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/list_item_blank_divider.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_normal.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_normal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_normal.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_normal.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_pressed.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_pressed.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_pressed.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_manage_manager_cancel_bg_pressed.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_cancel_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_cancel_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_cancel_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_cancel_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_item_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_item_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_item_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/menu_member_manage_item_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/null_drawable.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/null_drawable.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/null_drawable.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/null_drawable.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_white.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_white.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/oval_white.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/progress_color_horizontal.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/progress_color_horizontal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/progress_color_horizontal.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/progress_color_horizontal.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/round_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/round_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/round_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/round_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/round_rectangle_empty_white.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/round_rectangle_empty_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/round_rectangle_empty_white.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/round_rectangle_empty_white.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/square_alpha.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/square_alpha.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/square_alpha.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/square_alpha.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_center_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_center_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_center_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_center_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_full_white.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_full_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_full_white.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_full_white.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_left_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_full_white.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_full_white.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_full_white.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_full_white.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/tab_bg_right_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/to_gray_slight.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/to_gray_slight.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/to_gray_slight.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/to_gray_slight.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/white_btn_bg.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/white_btn_bg.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/drawable/white_btn_bg.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/drawable/white_btn_bg.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/alert_dialog.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/alert_dialog.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/alert_dialog.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/alert_dialog.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/base_list_fragment.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/base_list_fragment.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/base_list_fragment.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/base_list_fragment.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/base_tab_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/base_tab_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/base_tab_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/base_tab_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/base_view_bottom_window.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/base_view_bottom_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/base_view_bottom_window.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/base_view_bottom_window.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/blank_middle.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/blank_middle.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/blank_middle.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/blank_middle.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_view.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_window.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_window.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/bottom_menu_window.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/divider_horizontal.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/divider_horizontal.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/divider_horizontal.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/divider_horizontal.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1dp.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1dp.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1dp.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1dp.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1px.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1px.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1px.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/divider_vertical_1px.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_window.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_window.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/edit_text_info_window.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/grid_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/grid_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/grid_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/grid_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/grid_picker_view.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/icon_name_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/icon_name_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/icon_name_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/icon_name_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/image_picker_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/item_dialog_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_divider.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_divider.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_divider.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_divider.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item_2.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item_2.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item_2.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/key_value_item_2.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/list_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/list_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/list_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/list_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/list_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/list_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/list_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/list_view.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/select_picture_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/select_picture_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/select_picture_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/select_picture_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/server_setting_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/server_setting_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/server_setting_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/server_setting_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/square_menu.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/square_menu.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/square_menu.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/square_menu.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_list_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_list_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_list_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_list_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_window.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_window.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_window.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_menu_window.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_iv.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_iv.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_iv.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_iv.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_tv.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_tv.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_tv.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_right_tv.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_tv_center.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_tv_center.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_tv_center.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_tv_center.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/top_tab_view.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/web_view_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/web_view_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/web_view_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/web_view_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_footer.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_footer.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_footer.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_footer.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_header.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_header.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_header.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/layout/xlistview_header.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/arrays.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/arrays.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/arrays.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/arrays.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/colors.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/colors.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/colors.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/colors.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/dimens.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/dimens.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/dimens.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/dimens.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/ids.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/ids.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/ids.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/ids.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/strings.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/strings.xml similarity index 96% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/strings.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/strings.xml index f60debbbd..2ae464bc7 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/strings.xml +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/strings.xml @@ -13,6 +13,8 @@ 登录成功 正在退出,请稍侯…… 正在加载,请稍后... + 失败,请检查网络后重试 + 成功 获取失败,请检查网络后重试 获取成功 正在添加,请稍后... diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/styles.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/styles.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/main/res/values/styles.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/main/res/values/styles.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/test/java/zuo/biao/library/ExampleUnitTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/test/java/zuo/biao/library/ExampleUnitTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/ZBLibrary/src/test/java/zuo/biao/library/ExampleUnitTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/ZBLibrary/src/test/java/zuo/biao/library/ExampleUnitTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/proguard-rules.pro b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/proguard-rules.pro similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/proguard-rules.pro rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/proguard-rules.pro diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/androidTest/java/apijson/demo/client/ApplicationTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/androidTest/java/apijson/demo/client/ApplicationTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/androidTest/java/apijson/demo/client/ApplicationTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/androidTest/java/apijson/demo/client/ApplicationTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/AndroidManifest.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/AndroidManifest.xml similarity index 97% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/AndroidManifest.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/AndroidManifest.xml index d4bc32851..bfd07e31f 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/AndroidManifest.xml +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/AndroidManifest.xml @@ -119,6 +119,10 @@ android:name="apijson.demo.client.activity_fragment.QRCodeActivity" android:screenOrientation="portrait" android:windowSoftInputMode="stateAlwaysHidden" /> + diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/AboutActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/AboutActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/AboutActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/AboutActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/LoginActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/LoginActivity.java similarity index 92% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/LoginActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/LoginActivity.java index 574723bdd..85c83fdaf 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/LoginActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/LoginActivity.java @@ -22,6 +22,7 @@ import zuo.biao.library.ui.ServerSettingActivity; import zuo.biao.library.ui.TextClearSuit; import zuo.biao.library.util.EditTextUtil; +import zuo.biao.library.util.Log; import zuo.biao.library.util.SettingUtil; import zuo.biao.library.util.StringUtil; import android.annotation.SuppressLint; @@ -29,7 +30,6 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; @@ -174,16 +174,16 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { JSONResponse response = new JSONResponse(resultJson); User user = response.getObject(User.class); - if (response.isSucceed() == false) { - switch (response.getStatus()) { - case 404: + if (response.isSuccess() == false) { + switch (response.getCode()) { + case JSONResponse.CODE_NOT_FOUND: showShortToast("账号不存在,请先注册"); onDragBottom(true); break; - case 406: + case JSONResponse.CODE_ILLEGAL_ARGUMENT: showShortToast("账号或密码不合法!"); break; - case 412: + case JSONResponse.CODE_CONDITION_ERROR: showShortToast("账号或密码错误!"); showForget(); break; @@ -192,6 +192,7 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { break; } } else { + user.setPhone(phone); APIJSONApplication.getInstance().saveCurrentUser(user); if (APIJSONApplication.getInstance().isLoggedIn() == false) { showShortToast((requestCode == Login.TYPE_PASSWORD ? "密码" : "验证码") + "错误"); @@ -341,8 +342,9 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { case REQUEST_TO_VERIFY: case REQUEST_TO_REGISTER: if (data != null) { - String phone = data.getStringExtra(INTENT_PHONE); - String password = data.getStringExtra(requestCode == REQUEST_TO_VERIFY ? INTENT_VERIFY : INTENT_PASSWORD); + String phone = data.getStringExtra(PasswordActivity.RESULT_PHONE); + String password = data.getStringExtra(requestCode == REQUEST_TO_VERIFY + ? PasswordActivity.RESULT_VERIFY : PasswordActivity.RESULT_PASSWORD); if (StringUtil.isPhone(phone)) { etLoginPhone.setText(phone); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MainTabActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MainTabActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MainTabActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MainTabActivity.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MineFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MineFragment.java similarity index 98% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MineFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MineFragment.java index cd22c9796..ab7849bf9 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MineFragment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MineFragment.java @@ -43,7 +43,6 @@ import apijson.demo.client.application.APIJSONApplication; import apijson.demo.client.base.BaseFragment; import apijson.demo.client.interfaces.TopBarMenuCallback; -import apijson.demo.client.model.Login; import apijson.demo.client.model.User; import apijson.demo.client.util.HttpRequest; @@ -320,8 +319,8 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { } switch (requestCode) { case HTTP_LOUOUT: - JSONResponse response = new JSONResponse(resultJson).getJSONResponse(Login.class.getSimpleName()); - boolean succeed = JSONResponse.isSucceed(response); + JSONResponse response = new JSONResponse(resultJson).getJSONResponse(User.class.getSimpleName()); + boolean succeed = JSONResponse.isSuccess(response); Log.d(TAG, succeed ? "服务端退出成功" : "服务端退出失败"); showShortToast(succeed ? "服务端退出成功" : "服务端退出失败"); break; diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentActivity.java similarity index 97% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentActivity.java index b7db3805d..df2327958 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentActivity.java @@ -14,6 +14,22 @@ package apijson.demo.client.activity_fragment; +import java.util.List; + +import zuo.biao.apijson.JSONResponse; +import zuo.biao.library.base.BaseView.OnDataChangedListener; +import zuo.biao.library.interfaces.AdapterCallBack; +import zuo.biao.library.interfaces.CacheCallBack; +import zuo.biao.library.interfaces.OnBottomDragListener; +import zuo.biao.library.manager.CacheManager; +import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; +import zuo.biao.library.ui.AlertDialog; +import zuo.biao.library.ui.AlertDialog.OnDialogButtonClickListener; +import zuo.biao.library.util.CommonUtil; +import zuo.biao.library.util.EditTextUtil; +import zuo.biao.library.util.Log; +import zuo.biao.library.util.SettingUtil; +import zuo.biao.library.util.StringUtil; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -25,12 +41,10 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; - -import java.util.List; - import apijson.demo.client.R; import apijson.demo.client.adapter.CommentAdapter; import apijson.demo.client.application.APIJSONApplication; +import apijson.demo.client.base.BaseHttpListActivity; import apijson.demo.client.manager.HttpManager; import apijson.demo.client.model.Comment; import apijson.demo.client.model.CommentItem; @@ -40,22 +54,7 @@ import apijson.demo.client.util.HttpRequest; import apijson.demo.client.view.CommentView.OnCommentClickListener; import apijson.demo.client.view.MomentView; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONResponse; -import zuo.biao.library.base.BaseHttpListActivity; -import zuo.biao.library.base.BaseView.OnDataChangedListener; -import zuo.biao.library.interfaces.AdapterCallBack; -import zuo.biao.library.interfaces.CacheCallBack; -import zuo.biao.library.interfaces.OnBottomDragListener; -import zuo.biao.library.manager.CacheManager; -import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; -import zuo.biao.library.ui.AlertDialog; -import zuo.biao.library.ui.AlertDialog.OnDialogButtonClickListener; -import zuo.biao.library.util.CommonUtil; -import zuo.biao.library.util.EditTextUtil; -import zuo.biao.library.util.Log; -import zuo.biao.library.util.SettingUtil; -import zuo.biao.library.util.StringUtil; +import apijson.demo.server.model.BaseModel; /**用户列表界面fragment * @author Lemon @@ -351,7 +350,7 @@ private void deleteComment(CommentItem commentItem) { Log.e(TAG, "deleteComment id <= 0 >> return;"); return; } - HttpRequest.deleteComment(id, HTTP_DELETE, this); + HttpRequest.deleteComment(id, BaseModel.value(commentItem.getUserId()), HTTP_DELETE, this); } @@ -367,7 +366,7 @@ public void getListAsync(final int page) { @Override public List parseArray(String json) { - return JSON.parseArray(new JSONResponse(json).getArray(CommentItem.class.getSimpleName()), CommentItem.class); + return new JSONResponse(json).getList(CommentItem.class); } @Override @@ -520,7 +519,7 @@ public void run() { if (requestCode == HTTP_GET_MOMENT) { MomentItem data = JSONResponse.toObject(response, MomentItem.class); if (data == null || data.getId() <= 0) { - if (JSONResponse.isSucceed(response)) { + if (JSONResponse.isSuccess(response)) { showShortToast("动态不存在"); MomentActivity.super.finish();//需要动画,且不需要保存缓存 return; @@ -532,9 +531,12 @@ public void run() { return; } + if (verifyHttpLogin(response.getCode()) == false) { + return; + } JSONResponse comment = response.getJSONResponse(Comment.class.getSimpleName()); - final boolean succeed = JSONResponse.isSucceed(comment); + final boolean succeed = JSONResponse.isSuccess(comment); String operation = "操作"; switch (requestCode) { case HTTP_COMMENT: // 新增评论 diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListActivity.java similarity index 91% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListActivity.java index 02600f72c..0b579666f 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListActivity.java @@ -19,6 +19,7 @@ import android.content.Intent; import android.os.Bundle; import android.view.View; +import android.widget.ImageView; import com.alibaba.fastjson.JSONObject; @@ -134,9 +135,15 @@ protected void onCreate(Bundle savedInstanceState) { //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + private boolean isCurrentUser = false; + + private ImageView ivMomentListForward; private MomentListFragment fragment; @Override public void initView() {//必须在onCreate方法内调用 + ivMomentListForward = (ImageView) findViewById(R.id.ivMomentListForward); + ivMomentListForward.setVisibility(showSearch ? View.VISIBLE : View.GONE); + String title; switch (range) { case MomentListFragment.RANGE_ALL: @@ -146,7 +153,14 @@ public void initView() {//必须在onCreate方法内调用 // title = "动态"; // break; case MomentListFragment.RANGE_USER: - title = APIJSONApplication.getInstance().isCurrentUser(id) ? "我的动态" : "TA的动态"; + isCurrentUser = APIJSONApplication.getInstance().isCurrentUser(id); + title = isCurrentUser ? "我的动态" : "TA的动态"; + if (isCurrentUser) { + ivMomentListForward.setVisibility(View.VISIBLE); + ivMomentListForward.setImageResource(R.drawable.add); + } else { + ivMomentListForward.setVisibility(View.GONE); + } break; case MomentListFragment.RANGE_USER_CIRCLE: title = "朋友圈"; @@ -158,10 +172,9 @@ public void initView() {//必须在onCreate方法内调用 tvBaseTitle.setText(title); autoSetTitle(); - findViewById(R.id.ivMomentListForward).setVisibility(showSearch ? View.VISIBLE : View.GONE); - fragment = MomentListFragment.createInstance(range, id, search); + fragment.setIsAdd(isCurrentUser); fragmentManager .beginTransaction() diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListFragment.java similarity index 85% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListFragment.java index 881f9768e..8025b37e0 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/MomentListFragment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/MomentListFragment.java @@ -14,6 +14,19 @@ package apijson.demo.client.activity_fragment; +import java.util.List; + +import zuo.biao.apijson.JSON; +import zuo.biao.apijson.JSONRequest; +import zuo.biao.apijson.JSONResponse; +import zuo.biao.apijson.SQL; +import zuo.biao.apijson.StringUtil; +import zuo.biao.library.base.BaseView.OnDataChangedListener; +import zuo.biao.library.interfaces.AdapterCallBack; +import zuo.biao.library.interfaces.CacheCallBack; +import zuo.biao.library.interfaces.OnBottomDragListener; +import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; +import zuo.biao.library.ui.EditTextInfoWindow; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; @@ -27,30 +40,17 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.TextView; - -import com.alibaba.fastjson.JSONObject; - -import java.util.List; - import apijson.demo.client.R; import apijson.demo.client.adapter.MomentAdapter; import apijson.demo.client.application.APIJSONApplication; import apijson.demo.client.base.BaseHttpListFragment; import apijson.demo.client.interfaces.TopBarMenuCallback; +import apijson.demo.client.model.Moment; import apijson.demo.client.model.MomentItem; import apijson.demo.client.util.CommentUtil; import apijson.demo.client.util.HttpRequest; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONRequest; -import zuo.biao.apijson.JSONResponse; -import zuo.biao.apijson.SQL; -import zuo.biao.apijson.StringUtil; -import zuo.biao.library.base.BaseView.OnDataChangedListener; -import zuo.biao.library.interfaces.AdapterCallBack; -import zuo.biao.library.interfaces.CacheCallBack; -import zuo.biao.library.interfaces.OnBottomDragListener; -import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; -import zuo.biao.library.ui.EditTextInfoWindow; + +import com.alibaba.fastjson.JSONObject; /**用户列表界面fragment * @author Lemon @@ -204,7 +204,7 @@ public void refreshAdapter() { }); } - + private TextView leftMenu; @SuppressLint("InflateParams") @Override @@ -261,6 +261,12 @@ public void initData() {//必须调用 } + private boolean isAdd = false; + public void setIsAdd(boolean isAdd) { + this.isAdd = isAdd; + } + + @Override public void getListAsync(final int page) { HttpRequest.getMomentList(range, id, search, getCacheCount(), page, -page, this); @@ -332,10 +338,17 @@ public void onDragBottom(boolean rightToLeft) { return; } - showShortToast("输入为空则查看全部"); - toActivity(EditTextInfoWindow.createIntent(context - , EditTextInfoWindow.TYPE_NAME, "关键词", null), - REQUEST_TO_EDIT_TEXT_INFO, false); + if (isAdd) { + toActivity(EditTextInfoWindow.createIntent(context + , EditTextInfoWindow.TYPE_NOTE, "发动态", "说点什么吧~"), + REQUEST_TO_EDIT_TEXT_INFO, false); + } else { + showShortToast("输入为空则查看全部"); + toActivity(EditTextInfoWindow.createIntent(context + , EditTextInfoWindow.TYPE_NAME, "关键词", null), + REQUEST_TO_EDIT_TEXT_INFO, false); + } + } } @@ -346,6 +359,40 @@ public void onDataChanged() { } } + private static final int HTTP_ADD = 1; + + @Override + public void onHttpResponse(int requestCode, String resultJson, Exception e) { + JSONResponse response = new JSONResponse(resultJson); + if ((range == RANGE_USER_CIRCLE || requestCode == HTTP_ADD) && verifyHttpLogin(response.getCode()) == false) { + return; + } + switch (requestCode) { + case HTTP_ADD: + response = response.getJSONResponse(Moment.class.getSimpleName()); + + if (JSONResponse.isSuccess(response) == false) { + showShortToast("发布失败,请检查网络后重试"); + } else { + runUiThread(new Runnable() { + + @Override + public void run() { + showShortToast("发布成功"); + lvBaseList.onRefresh(); + } + }); + } + break; + default: + super.onHttpResponse(requestCode, resultJson, e); + break; + } + + } + + + //系统自带监听方法 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -363,14 +410,19 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { case REQUEST_TO_EDIT_TEXT_INFO: if (data != null) { String value = StringUtil.getString(data.getStringExtra(EditTextInfoWindow.RESULT_VALUE)); - String split = ""; - JSONRequest search = new JSONRequest(); - if (StringUtil.isNotEmpty(value, true)) { - split = ":"; - search.putSearch(HttpRequest.CONTENT, value, SQL.SEARCH_TYPE_CONTAIN_ORDER); + + if (isAdd) { + HttpRequest.addMoment(value, HTTP_ADD, this); + } else { + String split = ""; + JSONRequest search = new JSONRequest(); + if (StringUtil.isNotEmpty(value, true)) { + split = ":"; + search.putsSearch(HttpRequest.CONTENT, value, SQL.SEARCH_TYPE_CONTAIN_ORDER); + } + toActivity(MomentListActivity.createIntent(context, range, id, search, false) + .putExtra(INTENT_TITLE, "搜索" + split + value)); } - toActivity(MomentListActivity.createIntent(context, range, id, search, false) - .putExtra(INTENT_TITLE, "搜索" + split + value)); } break; default: diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/NumberPasswordActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/NumberPasswordActivity.java new file mode 100644 index 000000000..80af3e746 --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/NumberPasswordActivity.java @@ -0,0 +1,406 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.client.activity_fragment; + +import zuo.biao.apijson.JSONResponse; +import zuo.biao.library.base.BaseActivity; +import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; +import zuo.biao.library.ui.EditTextManager; +import zuo.biao.library.util.Log; +import zuo.biao.library.util.StringUtil; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.EditText; +import android.widget.TextView; +import apijson.demo.client.R; +import apijson.demo.client.util.HttpRequest; +import apijson.demo.server.model.Privacy; + +/**支付密码设置界面activity + * @author Lemon + * @use toActivity(PasswordSettingActivity.createIntent(...)); + */ +public class NumberPasswordActivity extends BaseActivity implements OnClickListener, OnHttpResponseListener { + private static final String TAG = "NumberPasswordActivity"; + + //启动方法<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final String INTENT_IS_TO_SETTING = "INTENT_IS_TO_SETTING"; + public static final String INTENT_USER_ID = "INTENT_USER_ID"; + public static final String INTENT_PASSWORD = "INTENT_PASSWORD"; + public static final String INTENT_REMIND = "INTENT_REMIND"; + + public static final String RESULT_PASSWORD = "RESULT_PASSWORD"; + + public static final String RESULT_IS_CHANGE_PASSWORD = "RESULT_IS_CHANGE_PASSWORD"; + + /**启动这个Activity的Intent + * 返回输入结果,isToSetting = false; + * @param context + * @return + */ + public static Intent createIntent(Context context) { + return createIntent(context, false); + } + + /**启动这个Activity的Intent + * @param context + * @param isToSetting true-设置密码;false-返回输入结果 + * @return + */ + public static Intent createIntent(Context context, boolean isToSetting) { + return createIntent(context, null).putExtra(INTENT_IS_TO_SETTING, isToSetting); + } + /**启动这个Activity的Intent + * @param context + * @param password + * @return + */ + public static Intent createIntent(Context context, String password) { + return createIntent(context, null, null, null); + } + /**启动这个Activity的Intent + * @param context + * @param password + * @param title + * @return + */ + public static Intent createIntent(Context context, String password, String remind, String title) { + return new Intent(context, NumberPasswordActivity.class). + putExtra(INTENT_PASSWORD, password). + putExtra(INTENT_REMIND, remind). + putExtra(INTENT_TITLE, title); + } + + //启动方法>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + @Override + public Activity getActivity() { + return this; + } + + + private boolean isToSetting; + private boolean isToConfirm; + private String password; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.number_password_activity); + + password = StringUtil.getNumber(getIntent().getStringExtra(INTENT_PASSWORD)); + + isToConfirm = StringUtil.getLength(password, true) == 6; + isToSetting = isToConfirm || getIntent().getBooleanExtra(INTENT_IS_TO_SETTING, false); + + //功能归类分区方法,必须调用<<<<<<<<<< + initView(); + initData(); + initEvent(); + //功能归类分区方法,必须调用>>>>>>>>>> + + toInput(); + } + + + //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int PASSWORD_LENGTH = 6; + + private TextView tvPasswordSettingTitle; + + private TextView tvPasswordSettingRemind; + private EditText etPasswordSetting; + private TextView[] tvPasswordSettingNumbers; + + @Override + public void initView() {//必须调用 + + exitAnim = R.anim.bottom_push_out; + + tvPasswordSettingTitle = (TextView) findViewById(R.id.tvPasswordSettingTitle); + + + //pay<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + tvPasswordSettingRemind = (TextView) findViewById(R.id.tvPasswordSettingPayRemind); + + etPasswordSetting = (EditText) findViewById(R.id.etPasswordSettingPay); + + tvPasswordSettingNumbers = new TextView[PASSWORD_LENGTH]; + tvPasswordSettingNumbers[0] = (TextView) findViewById(R.id.tvPasswordSettingPayNumber0); + tvPasswordSettingNumbers[1] = (TextView) findViewById(R.id.tvPasswordSettingPayNumber1); + tvPasswordSettingNumbers[2] = (TextView) findViewById(R.id.tvPasswordSettingPayNumber2); + tvPasswordSettingNumbers[3] = (TextView) findViewById(R.id.tvPasswordSettingPayNumber3); + tvPasswordSettingNumbers[4] = (TextView) findViewById(R.id.tvPasswordSettingPayNumber4); + tvPasswordSettingNumbers[5] = (TextView) findViewById(R.id.tvPasswordSettingPayNumber5); + //pay>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + } + + private void toInput() { + toInput(null, null); + } + private String phone; + private String verify; + /** + * @param verify + */ + private void toInput(String phone, String verify) { + this.phone = phone; + this.verify = verify; + if (isToSetting == false || isToConfirm == true) { + return; + } + + Log.i(TAG, "toInput phone = " + phone + + "\n verify = " + verify); + if (StringUtil.isNotEmpty(phone, true) == false || StringUtil.isNotEmpty(verify, true) == false) { + toActivity(PasswordActivity.createIntent(context, PasswordActivity.TYPE_VERIFY) + .putExtra(INTENT_TITLE, "验证手机"), REQUEST_TO_VERIFY_PHONE); + return; + } + + EditTextManager.showKeyboard(context, etPasswordSetting); + } + + private void next() { + if (isToSetting == false || isToConfirm) { + saveAndExit(); + } else { + startActivityForResult(NumberPasswordActivity.createIntent( + context, inputedString, "请再次输入以确认", ""), REQUEST_TO_PASSWORD_SETTING); + overridePendingTransition(R.anim.bottom_push_in, R.anim.hold); + } + } + + private void saveAndExit() { + saveAndExit(false); + } + private void saveAndExit(boolean isChangePassword) { + if (isToConfirm && inputedString.equals(password) == false) { + showShortToast(R.string.password_not_equal); + return; + } + + setResult(RESULT_OK, new Intent(). + putExtra(RESULT_PASSWORD, inputedString). + putExtra(RESULT_IS_CHANGE_PASSWORD, isChangePassword)); + finish(); + } + + + //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + + + + + //data数据区(存在数据获取或处理代码,但不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + @Override + public void initData() {//必须调用 + + if (StringUtil.isNotEmpty(getIntent().getStringExtra(INTENT_TITLE), false)) { + tvPasswordSettingTitle.setText("" + StringUtil.getCurrentString()); + } + if (StringUtil.isNotEmpty(getIntent().getStringExtra(INTENT_REMIND), false)) { + tvPasswordSettingRemind.setText("" + StringUtil.getCurrentString()); + } + + tvPasswordSettingTitle.setText(isToSetting ? "设置支付密码" : "输入支付密码"); + if (isToSetting) { + + } else { + if (isToConfirm == false) { + password = null; + } + } + + } + + + //data数据区(存在数据获取或处理代码,但不存在事件监听代码)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + + + //listener事件监听区(只要存在事件监听代码就是)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + private String inputedString = ""; + private int inputedLength; + @Override + public void initEvent() {//必须调用 + + findViewById(R.id.llPasswordSettingPayNumberContainer).setOnClickListener(this); + + for (int i = 0; i < tvPasswordSettingNumbers.length; i++) { + tvPasswordSettingNumbers[i].setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + EditTextManager.showKeyboard(context, etPasswordSetting, true); + } + }); + } + + etPasswordSetting.addTextChangedListener(new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + inputedString = StringUtil.getNoBlankString(s); + inputedLength = inputedString.length(); + + for (int i = 0; i < inputedLength; i++) { + tvPasswordSettingNumbers[i].setText(inputedString.substring(i, i + 1)); + } + for (int j = inputedString.length(); j < PASSWORD_LENGTH; j++) { + tvPasswordSettingNumbers[j].setText(""); + } + + if (inputedLength >= PASSWORD_LENGTH) { + next(); + } + } + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override + public void afterTextChanged(Editable s) { } + }); + } + + + private static final int HTTP_SET_PASSWORD = 1; + + @Override + public void onHttpResponse(int requestCode, String resultJson, Exception e) { + if (isAlive() == false) { + return; + } + JSONResponse response = new JSONResponse(resultJson); + + dismissProgressDialog(); + switch (requestCode) { + case HTTP_SET_PASSWORD: + if (response.isSuccess()) { + showShortToast(R.string.change_succeed); + saveAndExit(true); + } else { + showShortToast(R.string.change_failed); + } + break; + default: + break; + } + } + + + //系统自带监听方法<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.llPasswordSettingPayNumberContainer://设置不响应,解决抢占焦点 + break; + default: + break; + } + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_ENTER && inputedLength >= 6) { + next(); + return true; + } + return super.onKeyUp(keyCode, event); + } + + //类相关监听<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + private static final int REQUEST_TO_PASSWORD_SETTING = 10; + private static final int REQUEST_TO_VERIFY_PHONE = 11; + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode != RESULT_OK) { + enterAnim = exitAnim = R.anim.null_anim; + finish(); + return; + } + switch (requestCode) { + case REQUEST_TO_VERIFY_PHONE: + if (data != null) { + toInput(data.getStringExtra(PasswordActivity.RESULT_PHONE) + , data.getStringExtra(PasswordActivity.RESULT_VERIFY)); + } + break; + case REQUEST_TO_PASSWORD_SETTING: + if (data != null) { + password = data.getStringExtra(NumberPasswordActivity.RESULT_PASSWORD); + if (StringUtil.isNotEmpty(password, true)) { + HttpRequest.setPassword(Privacy.PASSWORD_TYPE_PAY, password, phone, verify + , HTTP_SET_PASSWORD, this); + } + } + break; + default: + break; + } + } + + + + //类相关监听>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + //系统自带监听方法>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //listener事件监听区(只要存在事件监听代码就是)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + + + //内部类,尽量少用<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + + //内部类,尽量少用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +} \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/PasswordActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/PasswordActivity.java similarity index 82% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/PasswordActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/PasswordActivity.java index 4c947eaa6..1a3cbe0b3 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/PasswordActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/PasswordActivity.java @@ -14,6 +14,14 @@ package apijson.demo.client.activity_fragment; +import static zuo.biao.apijson.JSONResponse.CODE_TIME_OUT; +import zuo.biao.apijson.JSONResponse; +import zuo.biao.library.base.BaseActivity; +import zuo.biao.library.interfaces.OnBottomDragListener; +import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; +import zuo.biao.library.ui.TextClearSuit; +import zuo.biao.library.util.EditTextUtil; +import zuo.biao.library.util.StringUtil; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -25,19 +33,12 @@ import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; - import apijson.demo.client.R; import apijson.demo.client.application.APIJSONApplication; import apijson.demo.client.model.User; import apijson.demo.client.model.Verify; import apijson.demo.client.util.HttpRequest; -import zuo.biao.apijson.JSONResponse; -import zuo.biao.library.base.BaseActivity; -import zuo.biao.library.interfaces.OnBottomDragListener; -import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; -import zuo.biao.library.ui.TextClearSuit; -import zuo.biao.library.util.EditTextUtil; -import zuo.biao.library.util.StringUtil; +import apijson.demo.server.model.Privacy; /**注册、验证码登录、重置密码等密码相关界面 * @author Lemon @@ -47,6 +48,14 @@ public class PasswordActivity extends BaseActivity implements OnClickListener, O //启动方法<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**启动这个Activity的Intent + * @param context + * @return + */ + public static Intent createIntent(Context context, int type) { + return createIntent(context, type, null, null); + } /**启动这个Activity的Intent * @param context * @param phone @@ -78,7 +87,7 @@ public Activity getActivity() { public static final int TYPE_VERIFY = 0; public static final int TYPE_REGISTER = 1; - public static final int TYPE_RESET = 3; + public static final int TYPE_RESET = 2; private int type = TYPE_VERIFY; private String phone; @@ -203,7 +212,7 @@ private void getVerify() { /**从服务器获取验证码 */ - private void getVerifyFromServer() { + private void getVerifyFromServer(int type) { runUiThread(new Runnable() { @Override @@ -212,7 +221,7 @@ public void run() { } }); - HttpRequest.getAuthCode(StringUtil.getTrimedString(etPasswordPhone), HTTP_GET_VERIFY, this); + HttpRequest.getVerify(type, StringUtil.getTrimedString(etPasswordPhone), HTTP_GET_VERIFY, this); } /**下一步 @@ -236,16 +245,20 @@ private void toNextStep() { case TYPE_REGISTER: register(); break; - default: - checkVerify(true); + case TYPE_VERIFY: + checkVerify(Verify.TYPE_LOGIN, true); + break; + case TYPE_RESET: + checkVerify(Verify.TYPE_PASSWORD, true); break; } } /**验证验证码 + * @param type * @param fromServer */ - private boolean checkVerify(boolean fromServer) { + private boolean checkVerify(int type, boolean fromServer) { if (EditTextUtil.isInputedCorrect(context, etPasswordPhone, EditTextUtil.TYPE_PHONE) == false || EditTextUtil.isInputedCorrect(context, etPasswordVerify, EditTextUtil.TYPE_VERIFY) == false) { return false; @@ -253,7 +266,7 @@ private boolean checkVerify(boolean fromServer) { if (fromServer) { showProgressDialog(); - HttpRequest.checkAuthCode(StringUtil.getTrimedString(etPasswordPhone), + HttpRequest.checkVerify(type, StringUtil.getTrimedString(etPasswordPhone), StringUtil.getTrimedString(etPasswordVerify), HTTP_CHECK_VERIFY, this); } @@ -262,7 +275,7 @@ private boolean checkVerify(boolean fromServer) { private void register() { - if (checkVerify(false) == false) { + if (checkVerify(Verify.TYPE_REGISTER, false) == false) { return; } showProgressDialog(); @@ -283,9 +296,9 @@ private void setPassword() { private Intent newResult() { return new Intent() - .putExtra(INTENT_PHONE, StringUtil.getTrimedString(etPasswordPhone)) - .putExtra(INTENT_VERIFY, StringUtil.getTrimedString(etPasswordVerify)) - .putExtra(INTENT_PASSWORD, StringUtil.getTrimedString(etPasswordPassword0)); + .putExtra(RESULT_PHONE, StringUtil.getTrimedString(etPasswordPhone)) + .putExtra(RESULT_VERIFY, StringUtil.getTrimedString(etPasswordVerify)) + .putExtra(RESULT_PASSWORD, StringUtil.getTrimedString(etPasswordPassword0)); } private void saveAndExit(Intent intent) { @@ -336,23 +349,23 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { dismissProgressDialog(); switch (requestCode) { case HTTP_CHECK_REGISTER: - response2 = response.getJSONResponse(User.class.getSimpleName()); + response2 = response.getJSONResponse(HttpRequest.PRIVACY_); Log.i(TAG, "checkPassword result = " + resultJson); runUiThread(new Runnable() { @Override public void run() { showVerifyGet(false); - if (JSONResponse.isSucceed(response2) == false) { + if (JSONResponse.isSuccess(response2) == false) { showShortToast(R.string.get_failed); } else if (JSONResponse.isExist(response2)) { if (type == TYPE_REGISTER) { showShortToast("手机号已经注册"); } else { - getVerifyFromServer(); + getVerifyFromServer(type == TYPE_VERIFY ? Verify.TYPE_LOGIN : Verify.TYPE_PASSWORD); } } else {//手机号未被注册过 if (type == TYPE_REGISTER) { - getVerifyFromServer(); + getVerifyFromServer(Verify.TYPE_REGISTER); } else { showShortToast("手机号未注册"); } @@ -379,7 +392,7 @@ public void run() { } } else {//验证码错误 EditTextUtil.showInputedError(context, etPasswordVerify - , response.getStatus() == 408 ? "验证码已过期" : "验证码错误"); + , response.getCode() == CODE_TIME_OUT ? "验证码已过期" : "验证码错误"); } } }); @@ -390,12 +403,12 @@ public void run() { @Override public void run() { showVerifyGet(false); - if (verify == null || StringUtil.isNotEmpty(verify.getCode(), true) == false) { + if (verify == null || StringUtil.isNotEmpty(verify.getVerify(), true) == false) { showShortToast(R.string.get_failed); } else { Log.i(TAG, "发送成功"); time.start(); - Toast.makeText(context, "验证码是\n" + verify.getCode(), Toast.LENGTH_LONG).show(); + Toast.makeText(context, "验证码是\n" + verify.getVerify(), Toast.LENGTH_LONG).show(); } } }); @@ -403,11 +416,11 @@ public void run() { case HTTP_REGISTER: User user = response.getObject(User.class); dismissProgressDialog(); - if (user == null || user.getId() <= 0 || JSONResponse.isSucceed( + if (user == null || user.getId() <= 0 || JSONResponse.isSuccess( response.getJSONResponse(User.class.getSimpleName())) == false) { - if (response.getStatus() == 408 || response.getStatus() == 412) { + if (response.getCode() == CODE_TIME_OUT || response.getCode() == 412) { EditTextUtil.showInputedError(context, etPasswordVerify - , response.getStatus() == 408 ? "验证码已过期" : "验证码错误"); + , response.getCode() == CODE_TIME_OUT ? "验证码已过期" : "验证码错误"); } else { showShortToast("注册失败,请检查网络后重试"); } @@ -419,7 +432,16 @@ public void run() { } break; case HTTP_RESET_PASSWORD: - //TODO + response2 = response.getJSONResponse(Privacy.class.getSimpleName()); + dismissProgressDialog(); + if (JSONResponse.isSuccess(response2) == false) { + EditTextUtil.showInputedError(context, etPasswordVerify + , response.getCode() == CODE_TIME_OUT ? "验证码已过期" : "验证码错误"); + } else { + showShortToast("修改密码成功,请重新登录"); + + saveAndExit(newResult().putExtra(INTENT_PHONE, phone)); + } break; default: break; diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/QRCodeActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/QRCodeActivity.java similarity index 97% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/QRCodeActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/QRCodeActivity.java index 4efa2ac12..126c295e7 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/activity_fragment/QRCodeActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/QRCodeActivity.java @@ -133,9 +133,7 @@ public void run() { @Override public void run() { ImageLoaderUtil.loadImage(ivQRCodeHead, user.getHead()); - tvQRCodeName.setText(StringUtil.getTrimedString( - StringUtil.isNotEmpty(user.getName(), true) - ? user.getName() : user.getPhone())); + tvQRCodeName.setText(StringUtil.getTrimedString(user.getName())); } }); diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/ScanActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/ScanActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/ScanActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/ScanActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SettingActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SettingActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SettingActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SettingActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SplashActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SplashActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SplashActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SplashActivity.java index 33f24ae2b..678c76270 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SplashActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/SplashActivity.java @@ -44,5 +44,10 @@ public void finish() { super.finish(); overridePendingTransition(R.anim.fade, R.anim.hold); } + + @Override + public void onBackPressed() { + //super.onBackPressed(); + } } \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserActivity.java similarity index 91% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserActivity.java index b85bc226d..6f3f89ea3 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserActivity.java @@ -38,6 +38,7 @@ import apijson.demo.client.util.HttpRequest; import apijson.demo.client.util.MenuUtil; import apijson.demo.client.view.UserView; +import apijson.demo.server.model.Privacy; import zuo.biao.apijson.JSONRequest; import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseView.OnDataChangedListener; @@ -131,7 +132,7 @@ protected void onCreate(Bundle savedInstanceState) { private GridView gvUserMoment; private TextView tvUserRemark; - private TextView tvUserTag; + private TextView tvUserPhone; private ViewGroup llUserBottomMenuContainer; private BottomMenuView bottomMenuView; @@ -159,7 +160,7 @@ public void initView() {//必须调用 gvUserMoment = (GridView) findViewById(R.id.gvUserMoment); tvUserRemark = (TextView) findViewById(R.id.tvUserRemark); - tvUserTag = (TextView) findViewById(R.id.tvUserTag); + tvUserPhone = (TextView) findViewById(R.id.tvUserPhone); llUserMoment.setVisibility(isOnEditMode ? View.GONE : View.VISIBLE); if (isOnEditMode == false) { @@ -188,12 +189,12 @@ private void setUser(User user_) { * @param momentList_ */ private void setUser(User user_, List momentList_) { + if (user_ == null) { + Log.w(TAG, "setUser user_ == null >> user = new User();"); + user_ = new User(); + } this.user = user_; this.momentList = momentList_; - if (user == null) { - Log.w(TAG, "setUser user == null >> user = new User();"); - user = new User(); - } if (momentList == null) { momentList = new ArrayList<>(); } @@ -211,7 +212,6 @@ public void run() { userView.bindView(user);//方式三 tvUserRemark.setText(StringUtil.getTrimedString(user.getHead())); - tvUserTag.setText(StringUtil.getTrimedString(user.getTag())); if (adapter == null) { adapter = new GridAdapter(context); @@ -223,6 +223,26 @@ public void run() { }); } + + private Privacy privacy; + /**显示用户隐私信息 + * @param privacy + */ + private void setPrivacy(Privacy privacy_) { + if (privacy_ == null) { + Log.w(TAG, "setUser user_ == null >> user = new User();"); + privacy_ = new Privacy(); + } + this.privacy = privacy_; + runUiThread(new Runnable() { + + @Override + public void run() { + tvUserPhone.setText(StringUtil.getTrimedString(privacy.getPhone())); + } + }); + } + /**裁剪图片 * @param path */ @@ -270,7 +290,7 @@ public void onDataChanged() { bottomMenuView.bindView(MenuUtil.getMenuList(MenuUtil.USER, id, ! User.isFriend(currentUser, id))); } - runThread(TAG + "run", new Runnable() { + runThread(TAG + "onDataChanged", new Runnable() { @Override public void run() { @@ -284,10 +304,12 @@ public void run() { @Override public void run() { setUser(user, momentList); + setPrivacy(null); } }); HttpRequest.getUser(id, ! isOnEditMode, HTTP_GET, UserActivity.this); + HttpRequest.getPrivacy(id, HTTP_GET_PRIVACY, UserActivity.this); } }); @@ -343,7 +365,7 @@ public boolean onTouch(View v, MotionEvent event) { if (isOnEditMode) { findViewById(R.id.llUserRemark).setOnClickListener(this); - findViewById(R.id.llUserTag).setOnClickListener(this); + findViewById(R.id.llUserPhone).setOnClickListener(this); userView.setOnDataChangedListener(new OnDataChangedListener() { @@ -384,12 +406,12 @@ public void onClick(View v) { user.setSex(user.getSex() == User.SEX_FEMALE ? User.SEX_MAIL : User.SEX_FEMALE); } break; - case R.id.tvUserViewPhone: + case R.id.tvUserViewTag: if (isOnEditMode) { - toActivity(EditTextInfoWindow.createIntent(context, EditTextInfoWindow.TYPE_PHONE - , "手机", user.getPhone()), REQUEST_TO_EDIT_TEXT_INFO_PHONE, false); + toActivity(EditTextInfoWindow.createIntent(context + , "标签", user.getTag()), REQUEST_TO_EDIT_TEXT_INFO_TAG, false); } else { - CommonUtil.copyText(context, user.getPhone()); + CommonUtil.copyText(context, user.getTag()); } break; default: @@ -442,6 +464,7 @@ public void onBottomMenuItemClick(int intentCode) { //对应HttpRequest.getUser(id, 0, UserActivity.this); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< protected static final int HTTP_GET = 1; + protected static final int HTTP_GET_PRIVACY = 5; protected static final int HTTP_ADD = 2; protected static final int HTTP_DELETE = 3; protected static final int HTTP_PUT = 4; @@ -450,14 +473,14 @@ public void onBottomMenuItemClick(int intentCode) { public void onHttpResponse(int requestCode, String resultJson, Exception e) { JSONResponse response = new JSONResponse(resultJson); JSONResponse response2 = response.getJSONResponse(User.class.getSimpleName()); - boolean isSucceed = JSONResponse.isSucceed(response2); + boolean isSucceed = JSONResponse.isSuccess(response2); dismissProgressDialog(); switch (requestCode) { case HTTP_GET: User user = response.getObject(User.class); if (user == null || user.getId() <= 0) { - if (JSONResponse.isSucceed(response)) { + if (JSONResponse.isSuccess(response)) { showShortToast("用户已注销"); super.finish();//需要动画,且不需要保存缓存 return; @@ -466,8 +489,14 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { } setUser(user, response.getList(Moment.class.getSimpleName() + "[]", Moment.class)); break; + case HTTP_GET_PRIVACY: + setPrivacy(response.getObject(Privacy.class)); + break; case HTTP_ADD: case HTTP_DELETE: + if (verifyHttpLogin(response.getCode()) == false) { + return; + } if (isSucceed) { showShortToast(requestCode == HTTP_ADD ? R.string.add_succeed : R.string.delete_succeed); sendBroadcast(new Intent(ActionUtil.ACTION_RELOAD_CURRENT_USER)); @@ -476,6 +505,9 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { } break; case HTTP_PUT: + if (verifyHttpLogin(response.getCode()) == false) { + return; + } if (isSucceed) { isDataChanged = false; sendBroadcast(new Intent(ActionUtil.ACTION_RELOAD_CURRENT_USER)); @@ -513,9 +545,9 @@ public void onClick(View v) { toActivity(EditTextInfoActivity.createIntent(context, EditTextInfoActivity.TYPE_WEBSITE, "备注" , StringUtil.getTrimedString(tvUserRemark)), REQUEST_TO_EDIT_TEXT_INFO_REMARK); break; - case R.id.llUserTag: - toActivity(EditTextInfoActivity.createIntent(context, "标签" - , StringUtil.getTrimedString(tvUserTag)), REQUEST_TO_EDIT_TEXT_INFO_TAG); + case R.id.llUserPhone: + toActivity(EditTextInfoWindow.createIntent(context, EditTextInfoWindow.TYPE_PHONE + , "手机", privacy.getPhone()), REQUEST_TO_EDIT_TEXT_INFO_PHONE, false); break; default: break; @@ -579,7 +611,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { user.setName(value); break; case REQUEST_TO_EDIT_TEXT_INFO_PHONE: - user.setPhone(value); + privacy.setPhone(value); break; case REQUEST_TO_EDIT_TEXT_INFO_REMARK: user.setHead(value); diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListActivity.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListActivity.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListFragment.java index 0ea1fe1c4..056c07ce7 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListFragment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/UserListFragment.java @@ -337,15 +337,15 @@ public void onDragBottom(boolean rightToLeft) { if (searchType <= 0) { searchType = EditTextInfoWindow.TYPE_PHONE; } - if (searchType == EditTextInfoWindow.TYPE_NAME) { +// if (searchType == EditTextInfoWindow.TYPE_NAME) { toActivity(EditTextInfoWindow.createIntent(context , EditTextInfoWindow.TYPE_NAME, "姓名", null), REQUEST_TO_EDIT_TEXT_INFO_SEARCH, false); - } else { - toActivity(EditTextInfoWindow.createIntent(context - , EditTextInfoWindow.TYPE_PHONE, "手机号", null), - REQUEST_TO_EDIT_TEXT_INFO_ADD, false); - } +// } else { +// toActivity(EditTextInfoWindow.createIntent(context +// , EditTextInfoWindow.TYPE_PHONE, "手机号", null), +// REQUEST_TO_EDIT_TEXT_INFO_ADD, false); +// } } } @@ -358,6 +358,16 @@ public void onDataChanged() { } } + + @Override + public void onHttpResponse(int requestCode, String resultJson, Exception e) { + JSONResponse response = new JSONResponse(resultJson); + if ((range == RANGE_USER_FRIEND) && verifyHttpLogin(response.getCode()) == false) { + return; + } + super.onHttpResponse(requestCode, resultJson, e); + } + //系统自带监听方法 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -383,9 +393,9 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (StringUtil.isNotEmpty(value, true)) { split = ":"; if (isSearch) { - search.putSearch(HttpRequest.NAME, value); + search.putsSearch(HttpRequest.NAME, value); } else { - search.put(HttpRequest.PHONE, value); + search.puts(HttpRequest.PHONE, value); } } intent = isSearch diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/WalletActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/WalletActivity.java similarity index 56% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/WalletActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/WalletActivity.java index be05676db..5588e365a 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/WalletActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/WalletActivity.java @@ -15,9 +15,10 @@ package apijson.demo.client.activity_fragment; import zuo.biao.apijson.JSONResponse; -import zuo.biao.library.base.BaseActivity; import zuo.biao.library.interfaces.OnBottomDragListener; import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; +import zuo.biao.library.ui.EditTextInfoActivity; +import zuo.biao.library.ui.EditTextInfoWindow; import zuo.biao.library.util.StringUtil; import android.app.Activity; import android.content.Context; @@ -27,8 +28,9 @@ import android.view.View.OnClickListener; import android.widget.TextView; import apijson.demo.client.R; -import apijson.demo.client.model.Wallet; +import apijson.demo.client.base.BaseActivity; import apijson.demo.client.util.HttpRequest; +import apijson.demo.server.model.Privacy; /**钱包界面 * @author Lemon @@ -36,7 +38,7 @@ */ public class WalletActivity extends BaseActivity implements OnClickListener, OnBottomDragListener , OnHttpResponseListener { - // private static final String TAG = "WalletActivity"; + private static final String TAG = "WalletActivity"; //启动方法<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -81,19 +83,19 @@ public void initView() {//必须调用 } - private Wallet wallet; - public void setWallet(Wallet wallet_) { - this.wallet = wallet_; + private Privacy privacy; + public void setWallet(Privacy privacy_) { + this.privacy = privacy_; runUiThread(new Runnable() { @Override public void run() { dismissProgressDialog(); tvBaseTitle.setText(getTitleName()); - if (wallet == null) { - wallet = new Wallet(); + if (privacy == null) { + privacy = new Privacy(); } - tvWalletCount.setText(StringUtil.getPrice(wallet.getBalance(), StringUtil.PRICE_FORMAT_PREFIX)); + tvWalletCount.setText(StringUtil.getPrice(privacy.getBalance(), StringUtil.PRICE_FORMAT_PREFIX)); } }); } @@ -115,7 +117,7 @@ public void run() { public void initData() {//必须调用 showProgressDialog(getTitleName()); - HttpRequest.getWallet(0, this); + HttpRequest.getPrivacy(HTTP_GET, this); } public String getTitleName() { @@ -151,13 +153,53 @@ public void onDragBottom(boolean rightToLeft) { } + private static final int HTTP_GET = 1; + private static final int HTTP_RECHARGE = 2; + private static final int HTTP_WITHDRAW = 3; + private boolean isSucceed = true; @Override - public void onHttpResponse(int requestCode, String resultJson, Exception e) { - JSONResponse response = new JSONResponse(resultJson); - isSucceed = JSONResponse.isSucceed(response); - - setWallet(response.getObject(Wallet.class)); + public void onHttpResponse(final int requestCode, final String resultJson, Exception e) { + runThread(TAG + "onHttpResponse", new Runnable() { + + @Override + public void run() { + + JSONResponse response = new JSONResponse(resultJson); + if (verifyHttpLogin(response.getCode()) == false) { + return; + } + + isSucceed = JSONResponse.isSuccess(response); + + dismissProgressDialog(); + switch (requestCode) { + case HTTP_RECHARGE: + case HTTP_WITHDRAW: + if (response.getCode() == JSONResponse.CODE_CONDITION_ERROR) { + showShortToast("密码错误!"); + } else if (requestCode == HTTP_WITHDRAW && response.getCode() == JSONResponse.CODE_OUT_OF_RANGE) { + showShortToast("余额不足!"); + } else { + showShortToast((requestCode == HTTP_RECHARGE ? "充值" : "提现") + + getString(isSucceed ? R.string.succeed : R.string.failed)); + if (isSucceed) { + initData(); + } + } + break; + case HTTP_GET: + if (isSucceed) { + setWallet(response.getObject(Privacy.class)); + } else { + showShortToast(R.string.get_failed); + } + break; + default: + break; + } + } + }); } //系统自带监听<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -167,8 +209,12 @@ public void onHttpResponse(int requestCode, String resultJson, Exception e) { public void onClick(View v) { switch (v.getId()) { case R.id.tvWalletRecharge: + toActivity(EditTextInfoWindow.createIntent(context, EditTextInfoWindow.TYPE_DECIMAL, "充值", null) + , REQUEST_RECHARGE, false); + break; case R.id.tvWalletWithdraw: - showShortToast(StringUtil.getString((TextView) v)); + toActivity(EditTextInfoWindow.createIntent(context, EditTextInfoWindow.TYPE_DECIMAL, "提现", null) + , REQUEST_WITHDRAW, false); break; default: break; @@ -181,6 +227,50 @@ public void onClick(View v) { //类相关监听<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + private static final int REQUEST_RECHARGE = 1; + private static final int REQUEST_WITHDRAW = 2; + private static final int REQUEST_PASSWORD = 3; + + private boolean isRecharge; + private double change; + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode != RESULT_OK) { + return; + } + switch (requestCode) { + case REQUEST_RECHARGE: + case REQUEST_WITHDRAW: + if (data == null) { + break; + } + String value = data.getStringExtra(EditTextInfoActivity.RESULT_VALUE); + try { + this.change = Double.valueOf(value); + } catch (Exception e) { + showShortToast("输入值不是数字!"); + } + if (change <= 0 || change > 10000) { + showShortToast("输入值必须为0-10000间的数字!"); + } else { + startActivityForResult(NumberPasswordActivity.createIntent(context), REQUEST_PASSWORD); + overridePendingTransition(R.anim.bottom_push_in, R.anim.fade); + this.isRecharge = requestCode == REQUEST_RECHARGE; + } + break; + case REQUEST_PASSWORD: + String password = data == null ? null : data.getStringExtra(EditTextInfoActivity.RESULT_PASSWORD); + password = StringUtil.getString(password); + if (password.isEmpty() == false) { + showProgressDialog(); + HttpRequest.changeBalance(isRecharge ? change : -change, password + , isRecharge ? HTTP_RECHARGE : HTTP_WITHDRAW, this); + } + break; + } + + } //类相关监听>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/activity_fragment/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/CommentAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/CommentAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/CommentAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/CommentAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/MomentAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/MomentAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/MomentAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/MomentAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/UserAdapter.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/UserAdapter.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/UserAdapter.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/adapter/UserAdapter.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/application/APIJSONApplication.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/application/APIJSONApplication.java similarity index 93% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/application/APIJSONApplication.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/application/APIJSONApplication.java index 2a81150e7..9bd686d1f 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/application/APIJSONApplication.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/application/APIJSONApplication.java @@ -75,6 +75,10 @@ public void saveCurrentUser(User user) { return; } + if (currentUser != null && user.getId().equals(currentUser.getId()) + && StringUtil.isNotEmpty(user.getPhone(), true) == false) { + user.setPhone(currentUser.getPhone()); + } currentUser = user; DataManager.getInstance().saveCurrentUser(currentUser); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseActivity.java index 682f131f3..df04738e7 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -48,7 +49,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseBottomTabActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseBottomTabActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseBottomTabActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseBottomTabActivity.java index 653476213..c4f2a86f2 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseBottomTabActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseBottomTabActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -48,7 +49,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseFragment.java index bd744df08..bfbe974f7 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseFragment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseFragment.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -55,7 +56,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListActivity.java index f353b3e21..b90a6074f 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -50,7 +51,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListFragment.java index 283f74611..4e2b70db8 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/base/BaseHttpListFragment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseHttpListFragment.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -61,6 +62,17 @@ private void setCurrentUser() { protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } /**未登录会toLoginActivity(); * @return isLoggedIn */ diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListActivity.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListActivity.java index e6229ad48..3314a6a3f 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListActivity.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -51,7 +52,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListFragment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListFragment.java similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListFragment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListFragment.java index 87fc934ea..69b047fe0 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListFragment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/base/BaseListFragment.java @@ -14,6 +14,7 @@ package apijson.demo.client.base; +import zuo.biao.apijson.JSONResponse; import zuo.biao.library.base.BaseBroadcastReceiver; import zuo.biao.library.base.BaseView.OnDataChangedListener; import zuo.biao.library.util.Log; @@ -58,7 +59,17 @@ private void setCurrentUser() { currentUserId = currentUser == null ? 0 : currentUser.getId(); isLoggedIn = isCurrentUserCorrect(); } - + + protected boolean verifyHttpLogin(int code) { + if (isAlive() == false) { + return true; + } + if (code == JSONResponse.CODE_NOT_LOGGED_IN) { + APIJSONApplication.getInstance().logout(); + setCurrentUser(); + } + return verifyLogin(); + } protected static boolean isCurrentUser(long userId) { return APIJSONApplication.getInstance().isCurrentUser(userId); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/OnTopBarClickListener.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/OnTopBarClickListener.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/OnTopBarClickListener.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/OnTopBarClickListener.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/TopBarMenuCallback.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/TopBarMenuCallback.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/TopBarMenuCallback.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/TopBarMenuCallback.java diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/manager/DataManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/manager/DataManager.java new file mode 100755 index 000000000..93c2e5a25 --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/manager/DataManager.java @@ -0,0 +1,198 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.client.manager; + +import android.content.Context; +import android.content.SharedPreferences; + +import apijson.demo.client.application.APIJSONApplication; +import apijson.demo.client.model.User; +import zuo.biao.library.util.JSON; +import zuo.biao.library.util.Log; +import zuo.biao.library.util.StringUtil; + +/**数据工具类 + * @author Lemon + */ +public class DataManager { + private final String TAG = "DataManager"; + + private Context context; + private DataManager(Context context) { + this.context = context; + } + + private static DataManager instance = new DataManager(APIJSONApplication.getInstance()); + public static DataManager getInstance() { + return instance; + } + + //用户 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + private String PATH_USER = "PATH_USER"; + + public final String KEY_USER = "KEY_USER"; + public final String KEY_USER_ID = "KEY_USER_ID"; + public final String KEY_USER_NAME = "KEY_USER_NAME"; + public final String KEY_USER_PHONE = "KEY_USER_PHONE"; + + public final String KEY_CURRENT_USER_ID = "KEY_CURRENT_USER_ID"; + public final String KEY_LAST_USER_ID = "KEY_LAST_USER_ID"; + + + /**判断是否为当前用户 + * @param userId + * @return + */ + public boolean isCurrentUser(long userId) { + return userId > 0 && userId == getCurrentUserId(); + } + + /**获取当前用户id + * @return + */ + public long getCurrentUserId() { + User user = getCurrentUser(); + return user == null ? 0 : user.getId(); + } + + /**获取当前用户的手机号 + * @return + */ + public String getCurrentUserPhone() { + User user = getCurrentUser(); + return user == null ? "" : user.getPhone(); + } + /**获取当前用户 + * @return + */ + public User getCurrentUser() { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + return sdf == null ? null : getUser(sdf.getLong(KEY_CURRENT_USER_ID, 0)); + } + + + /**获取最后一次登录的用户的手机号 + * @return + */ + public String getLastUserPhone() { + User user = getLastUser(); + return user == null ? "" : user.getPhone(); + } + + /**获取最后一次登录的用户 + * @return + */ + public User getLastUser() { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + return sdf == null ? null : getUser(sdf.getLong(KEY_LAST_USER_ID, 0)); + } + + /**获取用户 + * @param userId + * @return + */ + public User getUser(long userId) { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + if (sdf == null) { + Log.e(TAG, "get sdf == null >> return;"); + return null; + } + Log.i(TAG, "getUser userId = " + userId); + return JSON.parseObject(sdf.getString(StringUtil.getTrimedString(userId), null), User.class); + } + + + /**保存当前用户,只在登录或注销时调用 + * @param user user == null >> user = new User(); + */ + public void saveCurrentUser(User user) { + SharedPreferences sdf = context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE); + if (sdf == null) { + Log.e(TAG, "saveUser sdf == null >> return;"); + return; + } + SharedPreferences.Editor editor = sdf.edit(); + if (user != null) { + editor.remove(KEY_LAST_USER_ID).putLong(KEY_LAST_USER_ID, user.getId()); + } + editor.remove(KEY_CURRENT_USER_ID).putLong(KEY_CURRENT_USER_ID, user == null ? 0 : user.getId()); + editor.commit(); + + saveUser(sdf, user); + } + + /**保存用户 + * @param user + */ + public void saveUser(User user) { + saveUser(context.getSharedPreferences(PATH_USER, Context.MODE_PRIVATE), user); + } + /**保存用户 + * @param sdf + * @param user + */ + public void saveUser(SharedPreferences sdf, User user) { + if (sdf == null || user == null) { + Log.e(TAG, "saveUser sdf == null || user == null >> return;"); + return; + } + String key = StringUtil.getTrimedString(user.getId()); + Log.i(TAG, "saveUser key = user.getId() = " + user.getId()); + sdf.edit().remove(key).putString(key, JSON.toJSONString(user)).commit(); + } + + /**删除用户 + * @param sdf + * @param userId + */ + public void removeUser(SharedPreferences sdf, long userId) { + if (sdf == null) { + Log.e(TAG, "removeUser sdf == null >> return;"); + return; + } + sdf.edit().remove(StringUtil.getTrimedString(userId)).commit(); + } + + /**设置当前用户手机号 + * @param phone + */ + public void setCurrentUserPhone(String phone) { + User user = getCurrentUser(); + if (user == null) { + user = new User(); + } + user.setPhone(phone); + saveUser(user); + } + + /**设置当前用户姓名 + * @param name + */ + public void setCurrentUserName(String name) { + User user = getCurrentUser(); + if (user == null) { + user = new User(); + } + user.setName(name); + saveUser(user); + } + + //用户 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + +} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/manager/HttpManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/manager/HttpManager.java similarity index 75% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/manager/HttpManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/manager/HttpManager.java index d28af5efa..4752a0447 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/manager/HttpManager.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/manager/HttpManager.java @@ -15,37 +15,32 @@ package apijson.demo.client.manager; -import android.content.Context; -import android.os.AsyncTask; -import android.text.TextUtils; - -import com.squareup.okhttp.MediaType; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.RequestBody; -import com.squareup.okhttp.Response; - -import org.json.JSONException; -import org.json.JSONObject; - import java.io.IOException; import java.net.CookieHandler; import java.net.URI; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -import apijson.demo.client.application.APIJSONApplication; -import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONRequest; +import org.json.JSONException; + import zuo.biao.apijson.StringUtil; import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; import zuo.biao.library.util.Log; +import android.content.Context; +import android.os.AsyncTask; +import android.text.TextUtils; +import apijson.demo.client.application.APIJSONApplication; -import static zuo.biao.apijson.StringUtil.UTF_8; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.RequestBody; +import com.squareup.okhttp.Response; /**HTTP请求管理类 * @author Lemon @@ -85,58 +80,6 @@ public static HttpManager getInstance() { public static final String KEY_COOKIE = "cookie"; - /**GET请求 - * @param url_ 接口url - * @param request 请求 - * @param requestCode - * 请求码,类似onActivityResult中请求码,当同一activity中以实现接口方式发起多个网络请求时,请求结束后都会回调 - * {@link OnHttpResponseListener#onHttpResponse(int, String, Exception)}
- * 在发起请求的类中可以用requestCode来区分各个请求 - * @param listener - */ - public void get(final String url_, final com.alibaba.fastjson.JSONObject request - , final int requestCode, final OnHttpResponseListener listener) { - new AsyncTask() { - - String result; - @Override - protected Exception doInBackground(Void... params) { - String body = request == null || request.isEmpty() ? null : JSON.toJSONString(request); - Log.d(TAG, "\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n get url_ = " + url_ + "\n request = \n" + body); - try { - String url = StringUtil.getNoBlankString(url_) - + (body == null ? "" : URLEncoder.encode(StringUtil.getNoBlankString(body), UTF_8)); - StringBuffer sb = new StringBuffer(); - sb.append(url); - - OkHttpClient client = getHttpClient(url); - if (client == null) { - return new Exception(TAG + ".get AsyncTask.doInBackground client == null >> return;"); - } - - result = getResponseJson(client, new Request.Builder() - .addHeader(KEY_TOKEN, getToken(url)) - .url(sb.toString()).build()); - Log.d(TAG, "\n get result = \n" + result + "\n >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); - } catch (Exception e) { - Log.e(TAG, "get AsyncTask.doInBackground try { result = getResponseJson(..." + - "} catch (Exception e) {\n" + e.getMessage()); - return e; - } - - return null; - } - - @Override - protected void onPostExecute(Exception exception) { - super.onPostExecute(exception); - listener.onHttpResponse(requestCode, result, exception); - } - - }.execute(); - - } - public static final MediaType TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); /**POST请求 @@ -150,11 +93,6 @@ protected void onPostExecute(Exception exception) { */ public void post(final String url_, final com.alibaba.fastjson.JSONObject request , final int requestCode, final OnHttpResponseListener listener) { - if (request == null || request.containsKey(JSONRequest.KEY_TAG) == false) { - throw new IllegalArgumentException("post " + url_ + " \n" + - " request == null || request.containsKey(JSONRequest.KEY_TAG) == false !!!"); - } - new AsyncTask() { String result; @@ -169,7 +107,7 @@ protected Exception doInBackground(Void... params) { return new Exception(TAG + ".post AsyncTask.doInBackground client == null >> return;"); } String body = JSON.toJSONString(request); - Log.d(TAG, "\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n get post = " + url_ + "\n request = \n" + body); + Log.d(TAG, "\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n post url = " + url_ + "\n request = \n" + body); RequestBody requestBody = RequestBody.create(TYPE_JSON, body); @@ -280,7 +218,7 @@ private String getResponseJson(OkHttpClient client, Request request) throws Exce * @throws JSONException */ public T getValue(String json, String key) throws JSONException { - return getValue(new JSONObject(json), key); + return getValue(JSON.parseObject(json), key); } /**从object中获取key对应的值 * *获取如果T是基本类型容易崩溃,所以需要try-catch diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Comment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Comment.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Comment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Comment.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/CommentItem.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/CommentItem.java similarity index 97% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/CommentItem.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/CommentItem.java index d0f16e7ab..8cb163811 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/CommentItem.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/CommentItem.java @@ -14,11 +14,10 @@ package apijson.demo.client.model; -import android.support.annotation.NonNull; - import java.util.List; -import zuo.biao.apijson.BaseModel; +import android.support.annotation.NonNull; +import apijson.demo.server.model.BaseModel; public class CommentItem extends BaseModel { private static final long serialVersionUID = -1011007127735372824L; diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Login.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Login.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Login.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Login.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Moment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Moment.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Moment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Moment.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/MomentItem.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/MomentItem.java similarity index 99% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/MomentItem.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/MomentItem.java index e2554fac1..e0923e2cd 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/MomentItem.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/MomentItem.java @@ -14,13 +14,12 @@ package apijson.demo.client.model; -import android.support.annotation.NonNull; - import java.util.ArrayList; import java.util.List; +import android.support.annotation.NonNull; import apijson.demo.client.application.APIJSONApplication; -import zuo.biao.apijson.BaseModel; +import apijson.demo.server.model.BaseModel; public class MomentItem extends BaseModel { private static final long serialVersionUID = -7437225320551780084L; diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/User.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/User.java similarity index 85% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/User.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/User.java index a6c91f848..4088dd8cb 100755 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/model/User.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/User.java @@ -14,9 +14,7 @@ package apijson.demo.client.model; -import android.support.annotation.NonNull; import apijson.demo.client.application.APIJSONApplication; -import apijson.demo.server.model.UserPrivacy; /**用户类 * @author Lemon @@ -24,7 +22,7 @@ public class User extends apijson.demo.server.model.User { private static final long serialVersionUID = 1L; - private UserPrivacy privacy; + private String phone;//为了方便写在这里,登录成功是存入 public User() { super(); @@ -33,23 +31,11 @@ public User(long id) { super(id); } - @NonNull - public UserPrivacy getPrivacy() { - if (privacy == null) { - privacy = new UserPrivacy(getId()); - } - return privacy; - } - public User setPrivacy(UserPrivacy privacy) { - this.privacy = privacy; - return this; - } - public String getPhone() { - return getPrivacy().getPhone(); + return phone; } public User setPhone(String phone) { - getPrivacy().setPhone(phone); + this.phone = phone; return this; } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Wallet.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Verify.java similarity index 71% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Wallet.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Verify.java index 9ced1831e..0d72b828b 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/Wallet.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/Verify.java @@ -14,30 +14,24 @@ package apijson.demo.client.model; - -/**钱包类 +/**验证码类 * @author Lemon */ -public class Wallet extends apijson.demo.server.model.Wallet { +public class Verify extends apijson.demo.server.model.Verify { private static final long serialVersionUID = 4298571449155754300L; - - - public Wallet() { + + public Verify() { super(); } - public Wallet(long id) { - super(id); + + public Verify(int type, String phone) { + super(type, phone); } + @Override public Long getId() { - Long value = super.getId(); - return value == null ? 0 : value; - } - @Override - public Long getUserId() { - Long value = super.getUserId(); - return value == null ? 0 : value; + return value(super.getId()); } } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/model/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/ActionUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/ActionUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/ActionUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/ActionUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/CommentUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/CommentUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/CommentUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/CommentUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/Constant.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/Constant.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/Constant.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/Constant.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/HttpRequest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/HttpRequest.java similarity index 63% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/HttpRequest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/HttpRequest.java index ba7f62758..8571b79ee 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/HttpRequest.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/HttpRequest.java @@ -20,17 +20,19 @@ import zuo.biao.apijson.JSONObject; import zuo.biao.apijson.JSONRequest; import zuo.biao.apijson.JSONResponse; +import zuo.biao.apijson.RequestRole; import zuo.biao.library.manager.HttpManager.OnHttpResponseListener; import zuo.biao.library.util.Log; import zuo.biao.library.util.SettingUtil; +import android.os.Handler; import apijson.demo.client.application.APIJSONApplication; import apijson.demo.client.manager.HttpManager; import apijson.demo.client.model.CommentItem; import apijson.demo.server.model.Comment; -import apijson.demo.server.model.Login; import apijson.demo.server.model.Moment; +import apijson.demo.server.model.Privacy; import apijson.demo.server.model.User; -import apijson.demo.server.model.Wallet; +import apijson.demo.server.model.Verify; /**HTTP请求工具类 * @author Lemon @@ -52,8 +54,8 @@ public class HttpRequest { public static final String URL_HEAD = URL_BASE + "head/"; public static final String URL_GET = URL_BASE + "get/"; public static final String URL_POST = URL_BASE + "post/"; - public static final String URL_POST_HEAD = URL_BASE + "post_head/"; - public static final String URL_POST_GET = URL_BASE + "post_get/"; + public static final String URL_HEADS = URL_BASE + "heads/"; + public static final String URL_GETS = URL_BASE + "gets/"; public static final String URL_PUT = URL_BASE + "put/"; public static final String URL_DELETE = URL_BASE + "delete/"; @@ -63,7 +65,7 @@ public class HttpRequest { * @param listener */ public static void head(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().get(URL_HEAD, request, requestCode, listener); + HttpManager.getInstance().post(URL_HEAD, request, requestCode, listener); } /** * @param request @@ -71,7 +73,7 @@ public static void head(JSONObject request, int requestCode, OnHttpResponseListe * @param listener */ public static void get(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().get(URL_GET, request, requestCode, listener); + HttpManager.getInstance().post(URL_GET, request, requestCode, listener); } /** * @param request @@ -88,8 +90,8 @@ public static void post(JSONObject request, int requestCode, OnHttpResponseListe * @param listener * @must request最外层有tag,部分请求还要currentUserId和对应的password */ - public static void postHead(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().post(URL_POST_HEAD, request, requestCode, listener); + public static void heads(JSONObject request, int requestCode, OnHttpResponseListener listener) { + HttpManager.getInstance().post(URL_HEADS, request, requestCode, listener); } /**用POST方法GET数据,request和response都非明文,浏览器看不到,用于对安全性要求高的GET请求 * @param request @@ -97,8 +99,8 @@ public static void postHead(JSONObject request, int requestCode, OnHttpResponseL * @param listener * @must request最外层有tag,部分请求还要currentUserId和对应的password */ - public static void postGet(JSONObject request, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().post(URL_POST_GET, request, requestCode, listener); + public static void gets(JSONObject request, int requestCode, OnHttpResponseListener listener) { + HttpManager.getInstance().post(URL_GETS, request, requestCode, listener); } /** * @param request @@ -128,13 +130,18 @@ public static void delete(JSONObject request, int requestCode, OnHttpResponseLis - public static final String USER; - public static final String MOMENT; - public static final String COMMENT; + //加 _ 表示class名,避免VERIFY不知道是 Verify 还是 verify 这种冲突 + public static final String USER_; + public static final String PRIVACY_; + public static final String MOMENT_; + public static final String COMMENT_; + public static final String VERIFY_; static { - USER = User.class.getSimpleName(); - MOMENT = Moment.class.getSimpleName(); - COMMENT = Comment.class.getSimpleName(); + USER_ = User.class.getSimpleName(); + PRIVACY_ = Privacy.class.getSimpleName(); + MOMENT_ = Moment.class.getSimpleName(); + COMMENT_ = Comment.class.getSimpleName(); + VERIFY_ = Verify.class.getSimpleName(); } @@ -146,13 +153,13 @@ public static void delete(JSONObject request, int requestCode, OnHttpResponseLis public static final String ID = "id"; public static final String USER_ID = "userId"; - public static final String CURRENT_USER_ID = "currentUserId"; public static final String NAME = "name"; public static final String PHONE = "phone"; public static final String PASSWORD = "password"; public static final String LOGIN_PASSWORD = "loginPassword"; public static final String PAY_PASSWORD = "payPassword"; + public static final String OLD_PASSWORD = "oldPassword"; public static final String VERIFY = "verify"; public static final String SEX = "sex"; @@ -197,13 +204,51 @@ public static void delete(JSONObject request, int requestCode, OnHttpResponseLis */ public static void register(String verify, String phone, String password, String name, int sex , int requestCode, OnHttpResponseListener listener) { - JSONObject request = new JSONRequest(new User().setPhone(phone).setName(name).setSex(sex)) - .setTag(USER); - request.put(VERIFY, verify); + JSONObject request = new JSONRequest(new Privacy(phone, password)); + request.puts(new User().setName(name).setSex(sex)); + request.puts(VERIFY, verify); + HttpManager.getInstance().post(URL_BASE + "register", request, requestCode, listener); + } + + /** + * @param phone + * @param requestCode + * @param listener + */ + public static void checkRegister(String phone, int requestCode, OnHttpResponseListener listener) { + head(new JSONRequest(new Privacy().setPhone(phone)), requestCode, listener); + } + + /**登录 + * @param phone + * @param password + * @param requestCode + * @param listener + */ + public static void login(String phone, String password, int type, int requestCode, OnHttpResponseListener listener) { + JSONRequest request = new JSONRequest(); + request.put(TYPE, type); + request.put(PHONE, phone); request.put(PASSWORD, password); - HttpManager.getInstance().post(URL_POST + "register/user/", request, requestCode, listener); + HttpManager.getInstance().post(URL_BASE + "login/", request, requestCode, listener); } - /**重置密码 + /**退出登录 + * @param requestCode + * @param listener + */ + public static void logout(int requestCode, OnHttpResponseListener listener) { + HttpManager.getInstance().post(URL_BASE + "logout/", new JSONRequest(), requestCode, listener); + //不能在传到服务器之前销毁session + new Handler().postDelayed(new Runnable() { + + @Override + public void run() { + HttpManager.getInstance().saveCookie(null); + } + }, 500); + } + + /**重置登录密码 * @param verify * @param phone * @param password @@ -212,49 +257,78 @@ public static void register(String verify, String phone, String password, String */ public static void setPassword(String verify, String phone, String password , int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().post(URL_PUT + "user/password/" + verify + "/" + phone + "/" + password - , null, requestCode, listener); + setPassword(verify, phone, password, Privacy.PASSWORD_TYPE_LOGIN, requestCode, listener); } - /** + /**重置密码 + * @param verify * @param phone + * @param password + * @param type * @param requestCode * @param listener */ - public static void checkRegister(String phone, int requestCode, OnHttpResponseListener listener) { - head(new JSONRequest(new User().setPhone(phone)), requestCode, listener); + public static void setPassword(String verify, String phone, String password, int type + , int requestCode, OnHttpResponseListener listener) { + JSONRequest request = new JSONRequest(); + request.put(VERIFY, verify); + Privacy privacy = new Privacy().setPhone(phone); + if (type == Privacy.PASSWORD_TYPE_LOGIN) { + privacy.setPassword(password); + } else { + privacy.setPayPassword(password); + } + request.put(privacy); + + HttpManager.getInstance().post(URL_BASE + "put/password", request, requestCode, listener); } - /**登陆 + + + /**获取验证码 + * @param type * @param phone - * @param password * @param requestCode * @param listener */ - public static void login(String phone, String password, int type, int requestCode, OnHttpResponseListener listener) { - HttpManager.getInstance().get(URL_GET + "login/" + type + "/" + phone + "/" + password - , null, requestCode, listener); + public static void getVerify(int type, String phone, int requestCode, OnHttpResponseListener listener) { + HttpManager.getInstance().post(URL_BASE + "post/verify/" + , new JSONRequest(PHONE, phone).puts(TYPE, type).setTag(VERIFY_) + , requestCode, listener); } - /**退出登录 + /**校验验证码 + * @param type + * @param phone + * @param verify * @param requestCode * @param listener */ - public static void logout(int requestCode, OnHttpResponseListener listener) { - post(new JSONRequest(new Login(APIJSONApplication.getInstance().getCurrentUserId()).setType(0) - ).setTag(Login.class.getSimpleName()), requestCode, listener); + public static void checkVerify(int type, String phone, String verify, int requestCode, OnHttpResponseListener listener) { + JSONRequest request = new JSONRequest(); + request.put(TYPE, type); + request.put(PHONE, phone); + request.put(VERIFY, verify); + + HttpManager.getInstance().post(URL_BASE + "heads/verify" + , request.setTag(VERIFY_) + , requestCode, listener); } - /** + + /**设置密码 + * @param type + * @param password 只需要phone和verify,不需要old password * @param phone + * @param verify * @param requestCode * @param listener */ - public static void getAuthCode(String phone, int requestCode, OnHttpResponseListener listener) { - // get(new JSONRequest(new Verify(phone)), requestCode, listener); - HttpManager.getInstance().get(URL_POST + "authCode/" + phone, null, requestCode, listener); - } - public static void checkAuthCode(String phone, String code, int requestCode, OnHttpResponseListener listener) { - // postHead(new JSONRequest(new Verify(phone, code)).setTag(Verify.class.getSimpleName()), requestCode, listener); - HttpManager.getInstance().get(URL_BASE + "check/authCode/" + phone + "/" + code, null, requestCode, listener); + public static void setPassword(int type, String password, String phone, String verify + , int requestCode, OnHttpResponseListener listener) { + Privacy privacy = new Privacy(phone, password); + JSONRequest request = new JSONRequest(privacy); + request.put(VERIFY, verify); + + put(request.setTag(PRIVACY_), requestCode, listener); } //account>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -280,9 +354,9 @@ public static void getUser(long id, int requestCode, OnHttpResponseListener list public static void getUser(long id, boolean withMomentList, int requestCode, OnHttpResponseListener listener) { JSONRequest request = new JSONRequest(new User(id)); if (withMomentList) { - request.add(new JSONRequest(MOMENT + request.putsAll(new JSONRequest(MOMENT_ , new JSONRequest(USER_ID, id).setColumn("pictureList").setOrder(DATE_DOWN)) - .toArray(3, 0, MOMENT)); + .toArray(3, 0, MOMENT_)); } get(request, requestCode, listener); } @@ -292,12 +366,15 @@ public static void getUser(long id, boolean withMomentList, int requestCode, OnH * @param listener */ public static void setIsFriend(long id, boolean isFriend, int requestCode, OnHttpResponseListener listener) { - User user = APIJSONApplication.getInstance().getCurrentUser(); + User user = application.getCurrentUser(); + if (user == null) { + user = new User(); + } List list = new ArrayList(); list.add(id); JSONObject userObject = new JSONObject(new User(user.getId())); - userObject.put("friendIdList" + (isFriend ? "+" : "-"), list, true); - put(new JSONRequest(USER, userObject).setTag(USER), requestCode, listener); + userObject.put("contactIdList" + (isFriend ? "+" : "-"), list); + put(new JSONRequest(USER_, userObject).setTag(USER_), requestCode, listener); } public static final int RANGE_ALL = 0; @@ -307,6 +384,7 @@ public static void setIsFriend(long id, boolean isFriend, int requestCode, OnHtt public static final int RANGE_USER_CIRCLE = 4;//RANGE_USER + RANGE_USER_FRIEND public static final int RANGE_MOMENT = 5; public static final int RANGE_COMMENT = 6; + /**获取用户列表 * @param range * @param id @@ -325,12 +403,13 @@ public static void getUserList(int range, long id, com.alibaba.fastjson.JSONObje if (idList != null) { userItem.put(ID_IN, idList); } else { - apijson.demo.client.model.User currentUser = APIJSONApplication.getInstance().getCurrentUser(); + apijson.demo.client.model.User currentUser = application.getCurrentUser(); if (currentUser == null) { currentUser = new apijson.demo.client.model.User(); } switch (range) { case RANGE_ALL://1.首推注册时间长的(也可以是级别高的);2.给男性用户首推女性用户 + userItem.put("id!", currentUser.getId()); //排除当前用户 userItem.setOrder(DATE_UP, (currentUser.getSex() == 0 ? "sex-" : "")); break; case RANGE_SINGLE: @@ -339,11 +418,11 @@ public static void getUserList(int range, long id, com.alibaba.fastjson.JSONObje break; case RANGE_USER_FRIEND: case RANGE_USER_CIRCLE: - if (APIJSONApplication.getInstance().isCurrentUser(id) == false) { + if (application.isCurrentUser(id) == false) { Log.e(TAG, "只允许查看当前用户的!"); return; } - List list = currentUser.getFriendIdList(); + List list = currentUser.getContactIdList(); if (list == null) {//不能放在range == RANGE_USER_CIRCLE里面,为null不会当成查询条件! list = new ArrayList(); } @@ -358,24 +437,24 @@ public static void getUserList(int range, long id, com.alibaba.fastjson.JSONObje case RANGE_MOMENT: JSONObject moment = new JSONObject(new Moment(id)); moment.setColumn("praiseUserIdList"); - request.put(MOMENT, moment); + request.put(MOMENT_, moment); userItem.put(ID_IN+"@", "Moment/praiseUserIdList"); break; case RANGE_COMMENT: JSONObject comment = new JSONObject(new Comment(id)); comment.setColumn(USER_ID); - request.put(COMMENT, comment); + request.put(COMMENT_, comment); userItem.put(ID_AT, "Comment/userId"); break; default: break; } - userItem.add(search); + userItem.putsAll(search); } - JSONRequest listRequest = new JSONRequest(USER, userItem); - listRequest = listRequest.toArray(count, page, USER); - request.add(listRequest); + JSONRequest listRequest = new JSONRequest(USER_, userItem); + listRequest = listRequest.toArray(count, page, USER_); + request.putsAll(listRequest); get(request, requestCode, listener); } @@ -393,14 +472,14 @@ public static void getUserList(int range, long id, com.alibaba.fastjson.JSONObje */ public static void getMoment(long id, int requestCode, OnHttpResponseListener listener) { JSONRequest request = new JSONRequest(new Moment(id)); - request.put(USER, new JSONRequest(ID_AT, "/Moment/userId").setColumn(COLUMNS_USER)); + request.put(USER_, new JSONRequest(ID_AT, "/Moment/userId").setColumn(COLUMNS_USER)); //praise <<<<<<<<<<<<<<<<<< JSONRequest userItem = new JSONRequest(); - userItem.put(USER, new JSONRequest(ID_IN+"@", "Moment/praiseUserIdList") + userItem.put(USER_, new JSONRequest(ID_IN+"@", "Moment/praiseUserIdList") .setColumn(COLUMNS_USER_SIMPLE)); userItem.setQuery(JSONRequest.QUERY_ALL);//同时获取Table和total - request.add(userItem.toArray(10, 0, USER)); + request.putsAll(userItem.toArray(10, 0, USER_)); request.put("praiseCount@", "/User[]/total");//获取Table的总数total //praise >>>>>>>>>>>>>>>>>> @@ -433,15 +512,15 @@ public static void getMomentList(int range, long id, com.alibaba.fastjson.JSONOb break; case RANGE_USER_FRIEND: case RANGE_USER_CIRCLE: - if (APIJSONApplication.getInstance().isCurrentUser(id) == false) { + if (application.isCurrentUser(id) == false) { Log.e(TAG, "只允许查看当前用户的!"); return; } - apijson.demo.client.model.User currentUser = APIJSONApplication.getInstance().getCurrentUser(); + apijson.demo.client.model.User currentUser = application.getCurrentUser(); if (currentUser == null) { currentUser = new apijson.demo.client.model.User(); } - List list = currentUser.getFriendIdList(); + List list = currentUser.getContactIdList(); if (list == null) { list = new ArrayList(); } @@ -449,34 +528,35 @@ public static void getMomentList(int range, long id, com.alibaba.fastjson.JSONOb list.add(currentUser.getId()); } moment.put(USER_ID_IN, list); + // moment.setRole(range == RANGE_USER_FRIEND ? RequestRole.CONTACT.name() : RequestRole.CIRCLE.name()); break; default: break; } moment.setOrder(DATE_DOWN); - moment.add(search); + moment.putsAll(search); - request.put(MOMENT, moment); - request.put(USER, new JSONRequest(ID_AT, "/Moment/userId").setColumn(COLUMNS_USER)); + request.put(MOMENT_, moment); + request.put(USER_, new JSONRequest(ID_AT, "/Moment/userId").setColumn(COLUMNS_USER)); //praise <<<<<<<<<<<<<<<<<< JSONRequest userItem = new JSONRequest(); - userItem.put(USER, new JSONRequest(ID_IN+"@", "[]/Moment/praiseUserIdList") + userItem.put(USER_, new JSONRequest(ID_IN+"@", "[]/Moment/praiseUserIdList") .setColumn(COLUMNS_USER_SIMPLE)); // userItem.setQuery(JSONRequest.QUERY_ALL); - request.add(userItem.toArray(10, 0, USER)); + request.putsAll(userItem.toArray(10, 0, USER_)); // request.put("praiseCount@", "/User[]/total"); //praise >>>>>>>>>>>>>>>>>> //comment <<<<<<<<<<<<<<<<<< JSONRequest commentItem = new JSONRequest(); - commentItem.put(COMMENT, new JSONRequest(MOMENT_ID_AT, "[]/Moment/id").setOrder(DATE_UP)); - commentItem.put(USER, new JSONRequest(ID_AT, "/Comment/userId") + commentItem.put(COMMENT_, new JSONRequest(MOMENT_ID_AT, "[]/Moment/id").setOrder(DATE_UP)); + commentItem.put(USER_, new JSONRequest(ID_AT, "/Comment/userId") .setColumn(COLUMNS_USER_SIMPLE)); // commentItem.setQuery(JSONRequest.QUERY_ALL); - request.add(commentItem.toArray(6, 0, CommentItem.class.getSimpleName())); + request.putsAll(commentItem.toArray(6, 0, CommentItem.class.getSimpleName())); // request.put("commentCount@", "/CommentItem[]/total"); //comment >>>>>>>>>>>>>>>>>> @@ -492,9 +572,29 @@ public static void getMomentList(int range, long id, com.alibaba.fastjson.JSONOb public static void praiseMoment(long id, boolean toPraise, int requestCode, OnHttpResponseListener listener) { JSONObject data = new JSONObject(new Moment(id)); List list = new ArrayList(); - list.add(APIJSONApplication.getInstance().getCurrentUserId()); - data.put("praiseUserIdList" + (toPraise ? "+" : "-"), list, true); - put(new JSONRequest(MOMENT, data).setTag(MOMENT), requestCode, listener); + list.add(application.getCurrentUserId()); + data.puts("praiseUserIdList" + (toPraise ? "+" : "-"), list); + + put(new JSONRequest(MOMENT_, data).setTag(MOMENT_), requestCode, listener); + } + + /**新增动态 + * @param content + * @param requestCode + * @param listener + */ + public static void addMoment(String content, int requestCode, OnHttpResponseListener listener) { + List list = new ArrayList(); + list.add("http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000"); + list.add("http://common.cnblogs.com/images/icon_weibo_24.png"); + + post(new JSONRequest( + new Moment() + .setUserId(application.getCurrentUserId()) + .setContent(content) + .setPictureList(list) + ).setTag(MOMENT_) + , requestCode, listener); } /**删除动态 @@ -503,9 +603,10 @@ public static void praiseMoment(long id, boolean toPraise, int requestCode, OnHt * @param listener */ public static void deleteMoment(Long id, int requestCode, OnHttpResponseListener listener) { - delete(new JSONRequest(new Moment(id)).setTag(MOMENT), requestCode, listener); + delete(new JSONRequest(new Moment(id)).setTag(MOMENT_), requestCode, listener); } + //Moment>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -524,8 +625,8 @@ public static void getCommentList(long momentId, int count, int page , int requestCode, OnHttpResponseListener listener) { JSONRequest request = new JSONRequest(); JSONObject comment = new JSONObject(new Comment().setMomentId(momentId)); - request.put(COMMENT, comment.setOrder(DATE_UP)); - request.put(USER, new JSONRequest(ID_AT, "/Comment/userId").setColumn(COLUMNS_USER)); + request.put(COMMENT_, comment.setOrder("toId+", DATE_UP)); + request.put(USER_, new JSONRequest(ID_AT, "/Comment/userId").setColumn(COLUMNS_USER)); // if (page == 0) { // request.setQuery(JSONRequest.QUERY_ALL); @@ -553,46 +654,67 @@ public static void addComment(long momentId, long toCommentId, long toUserId, St .setUserId(application.getCurrentUserId()) .setMomentId(momentId) .setContent(content); - post(new JSONRequest(comment).setTag(COMMENT), requestCode, listener); + + post(new JSONRequest(comment).setTag(COMMENT_), requestCode, listener); } /** * @param id + * @param userId * @param requestCode * @param listener */ - public static void deleteComment(long id, int requestCode, OnHttpResponseListener listener) { - delete(new JSONRequest(new Comment(id)).setTag(COMMENT), requestCode, listener); + public static void deleteComment(long id, long userId, int requestCode, OnHttpResponseListener listener) { + delete(new JSONRequest( + COMMENT_, new JSONObject( + new Comment(id) + ).setRole(application.isCurrentUser(userId) ? RequestRole.OWNER.name() : RequestRole.ADMIN.name()) + ).setTag(COMMENT_) + , requestCode, listener); } //Comment>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + //Money<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /**获取钱包 + /**获取当前用户隐私信息 * @param requestCode * @param listener */ - public static void getWallet(int requestCode, OnHttpResponseListener listener) { - long userId = APIJSONApplication.getInstance().getCurrentUserId(); - if (userId <= 0) { - userId = 38710; - } - - JSONRequest request = new JSONRequest(); - request.put(new Wallet().setUserId(userId)); - request.put(CURRENT_USER_ID, userId); - request.put(LOGIN_PASSWORD, "apijson"); - request.put(PAY_PASSWORD, "123456"); - postGet(request.setTag(Wallet.class.getSimpleName()), requestCode, listener); + public static void getPrivacy(int requestCode, OnHttpResponseListener listener) { + gets(new JSONRequest( + new Privacy(application.getCurrentUserId()) + ).setTag(PRIVACY_), requestCode, listener); + } + /**获取圈子内用户隐私信息 + * @param id + * @param requestCode + * @param listener + */ + public static void getPrivacy(long id, int requestCode, OnHttpResponseListener listener) { + gets(new JSONRequest( + PRIVACY_, new JSONObject(new Privacy(id)).setRole(RequestRole.CIRCLE.name()) + ).setTag("Privacy-CIRCLE"), requestCode, listener); } + /**修改余额 + * @param change + * @param payPassword + * @param requestCode + * @param listener + */ + public static void changeBalance(double change, String payPassword, int requestCode, OnHttpResponseListener listener) { + JSONObject privacy = new JSONObject( + new Privacy(application.getCurrentUserId()).setPayPassword(payPassword) + ); + privacy.puts("balance+", change); + JSONRequest request = new JSONRequest(PRIVACY_, privacy); + + HttpManager.getInstance().post(URL_BASE + "put/balance", request.setTag(PRIVACY_), requestCode, listener); + } - - - - //示例代码>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + //Money>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/MenuUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/MenuUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/util/MenuUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/util/MenuUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/BaseViewLayout.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/BaseViewLayout.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/BaseViewLayout.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/BaseViewLayout.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentContainerView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentContainerView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentContainerView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentContainerView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentTextView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentTextView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentTextView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentTextView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/CommentView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/EmptyEventGridView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/EmptyEventGridView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/EmptyEventGridView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/EmptyEventGridView.java diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/MomentView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/MomentView.java similarity index 99% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/MomentView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/MomentView.java index 0e2177d2f..05cad282e 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/client/view/MomentView.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/MomentView.java @@ -400,7 +400,7 @@ public void onHttpResponse(int requestCode, String result, Exception e) { return; } JSONResponse response = new JSONResponse(result).getJSONResponse(Moment.class.getSimpleName()); - boolean isSucceed = JSONResponse.isSucceed(response); + boolean isSucceed = JSONResponse.isSuccess(response); boolean refresh = false; switch (requestCode) { diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/PraiseTextView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/PraiseTextView.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/PraiseTextView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/PraiseTextView.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/UserView.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/UserView.java similarity index 95% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/UserView.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/UserView.java index 4c70f1e8a..beee728e8 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/view/UserView.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/client/view/UserView.java @@ -59,7 +59,7 @@ public UserView(Activity context, Resources resources) { public TextView tvUserViewName; public TextView tvUserViewId; - public TextView tvUserViewPhone; + public TextView tvUserViewTag; @SuppressLint("InflateParams") @Override public View createView(LayoutInflater inflater) { @@ -71,7 +71,7 @@ public View createView(LayoutInflater inflater) { tvUserViewName = findViewById(R.id.tvUserViewName, this); tvUserViewId = findViewById(R.id.tvUserViewId); - tvUserViewPhone = findViewById(R.id.tvUserViewPhone, this); + tvUserViewTag = findViewById(R.id.tvUserViewTag, this); return convertView; } @@ -93,7 +93,7 @@ public void bindView(User data){ tvUserViewName.setText(StringUtil.getTrimedString(data.getName())); tvUserViewId.setText("ID:" + data.getId()); - tvUserViewPhone.setText("Phone:" + StringUtil.getNoBlankString(data.getPhone())); + tvUserViewTag.setText("Tag:" + StringUtil.getTrimedString(data.getTag())); } @Override diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/BaseModel.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/BaseModel.java similarity index 71% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/BaseModel.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/BaseModel.java index d2f1f639d..551c632b1 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/BaseModel.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/BaseModel.java @@ -15,8 +15,10 @@ package apijson.demo.server.model; import java.io.Serializable; +import java.sql.Timestamp; import java.util.Arrays; import java.util.Collection; +import java.util.Date; import java.util.Map; import com.alibaba.fastjson.JSON; @@ -28,8 +30,9 @@ public abstract class BaseModel implements Serializable { private static final long serialVersionUID = 1L; - private Long id; - private Long date; + private Long id; //主键,唯一标识 + private Long userId; //对应User表中的id,外键 + private Long date; //创建时间,JSON没有Date,TimeStamp类型,都会被转成Long,不能用! public Long getId() { return id; @@ -38,6 +41,13 @@ public BaseModel setId(Long id) { this.id = id; return this; } + public Long getUserId() { + return userId; + } + public BaseModel setUserId(Long userId) { + this.userId = userId; + return this; + } public Long getDate() { return date; } @@ -52,7 +62,29 @@ public String toString() { return JSON.toJSONString(this); } - + + /**获取当前时间戳 + * @return + */ + public static Timestamp currentTimeStamp() { + return new Timestamp(new Date().getTime()); + } + /**获取时间戳 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static Timestamp getTimeStamp(String time) { + return Timestamp.valueOf(time); + } + /**获取时间毫秒值 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static long getTimeMillis(String time) { + return getTimeStamp(time).getTime(); + } + + //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**判断array是否为空 * @param array @@ -218,4 +250,53 @@ public static double value(Double value) { } //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + /**index是否在arr长度范围内 + * @param index + * @param array + * @return + */ + public static boolean isIndexInRange(Integer index, Object[] array) { + return index != null && index >= 0 && index < count(array); + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param index + * @param array + * @return + */ + public static int getIndexInRange(Integer index, Object[] array) { + return getIndexInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static int getIndexInRange(Integer index, Object[] array, int defaultIndex) { + return isIndexInRange(index, array) ? index : defaultIndex; + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param + * @param index + * @param array + * @return + */ + public static T getInRange(Integer index, T[] array) { + return getInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static T getInRange(Integer index, T[] array, int defaultIndex) { + return get(array, getIndexInRange(index, array, defaultIndex)); + } + } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Comment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Comment.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Comment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Comment.java index 32f4f69c7..e11555d85 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Comment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Comment.java @@ -33,7 +33,6 @@ public class Comment extends BaseModel { private static final long serialVersionUID = 1L; private Long toId; - private Long userId; private Long momentId; private String content; public Comment() { @@ -52,11 +51,8 @@ public Comment setToId(Long toId) { this.toId = toId; return this; } - public Long getUserId() { - return userId; - } public Comment setUserId(Long userId) { - this.userId = userId; + super.setUserId(userId); return this; } public Long getMomentId() { diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Login.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Login.java similarity index 94% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Login.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Login.java index b123f241e..f5ba5e4f7 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Login.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Login.java @@ -25,7 +25,7 @@ /**登录类,已用session替代 * @author Lemon * @see - *
POST_HEAD:
+ * 
HEADS:
 {
  "Login":{
      "disallow":"!",
@@ -56,8 +56,8 @@
 @Deprecated
 @SuppressWarnings("serial")
 @MethodAccess(
-		POST_GET = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
-		POST_HEAD = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
+		GETS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
+		HEADS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
 		POST = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
 		PUT = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN},
 		DELETE = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}
diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Moment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Moment.java
similarity index 96%
rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Moment.java
rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Moment.java
index 21214a1da..b6ddf6844 100644
--- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Moment.java
+++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Moment.java
@@ -50,7 +50,6 @@
 public class Moment extends BaseModel {
 	private static final long serialVersionUID = 1L;
 
-	private Long userId;
 	private String content;
 	private List pictureList;
 	private List praiseUserIdList;
@@ -64,11 +63,9 @@ public Moment(long id) {
 		setId(id);
 	}
 
-	public Long getUserId() {
-		return userId;
-	}
+
 	public Moment setUserId(Long userId) {
-		this.userId = userId;
+		super.setUserId(userId);
 		return this;
 	}
 	public String getContent() {
diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/UserPrivacy.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Privacy.java
similarity index 52%
rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/UserPrivacy.java
rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Privacy.java
index 8904fc820..7fcf3545b 100644
--- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/UserPrivacy.java
+++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Privacy.java
@@ -1,3 +1,17 @@
+/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.*/
+
 package apijson.demo.server.model;
 
 import static zuo.biao.apijson.RequestRole.ADMIN;
@@ -6,33 +20,36 @@
 
 import zuo.biao.apijson.MethodAccess;
 
-/**会员隐私信息表
+/**用户隐私信息
  * @author Lemon
  */
 @MethodAccess(
 		GET = {},
-		POST_GET = {OWNER, ADMIN},
+		GETS = {OWNER, ADMIN},
 		POST = {UNKNOWN, ADMIN},
 		DELETE = {ADMIN}
 		)
-public class UserPrivacy extends BaseModel {
+public class Privacy extends BaseModel {
 	private static final long serialVersionUID = 1L;
 
+	public static final int PASSWORD_TYPE_LOGIN = 0;
+	public static final int PASSWORD_TYPE_PAY = 1;
+	
 	private String phone; //手机
 	private String password; //登录密码,隐藏字段
 	private String payPassword; //支付密码,隐藏字段
 	private Double balance;	//余额
 
-	public UserPrivacy() {
+	public Privacy() {
 		super();
 	}
 
-	public UserPrivacy(long id) {
+	public Privacy(long id) {
 		this();
 		setId(id);
 	}
 
-	public UserPrivacy(String phone, String password) {
+	public Privacy(String phone, String password) {
 		this();
 		setPhone(phone);
 		setPassword(password);
@@ -43,7 +60,7 @@ public UserPrivacy(String phone, String password) {
 	public String getPhone() {
 		return phone;
 	}
-	public UserPrivacy setPhone(String phone) {
+	public Privacy setPhone(String phone) {
 		this.phone = phone;
 		return this;
 	}
@@ -54,7 +71,7 @@ public UserPrivacy setPhone(String phone) {
 	public String get__password() {
 		return password;
 	}
-	public UserPrivacy setPassword(String password) {
+	public Privacy setPassword(String password) {
 		this.password = password;
 		return this;
 	}
@@ -65,7 +82,7 @@ public UserPrivacy setPassword(String password) {
 	public String get__payPassword() {
 		return payPassword;
 	}
-	public UserPrivacy setPayPassword(String payPassword) {
+	public Privacy setPayPassword(String payPassword) {
 		this.payPassword = payPassword;
 		return this;
 	}
@@ -73,7 +90,7 @@ public UserPrivacy setPayPassword(String payPassword) {
 	public Double getBalance() {
 		return balance;
 	}
-	public UserPrivacy setBalance(Double balance) {
+	public Privacy setBalance(Double balance) {
 		this.balance = balance;
 		return this;
 	}
diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/User.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/User.java
similarity index 98%
rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/User.java
rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/User.java
index c16127d20..d4d18d08a 100644
--- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/User.java
+++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/User.java
@@ -55,7 +55,7 @@
 		POST = {UNKNOWN, ADMIN},
 		DELETE = {ADMIN}
 		)
-public class User extends BaseModel{
+public class User extends BaseModel {
 	private static final long serialVersionUID = 1L;
 	
 	public static final int SEX_MAIL = 0;
diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Verify.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Verify.java
similarity index 61%
rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Verify.java
rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Verify.java
index 7bc8be59b..23062a00b 100644
--- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Verify.java
+++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/Verify.java
@@ -22,32 +22,15 @@
 import static zuo.biao.apijson.RequestRole.UNKNOWN;
 
 import zuo.biao.apijson.MethodAccess;
-import zuo.biao.apijson.StringUtil;
 
-/**验证码类
+/**验证码
  * @author Lemon
- * @see
- * 
POST_GET:post_get/authCode
-{
-    "Verify":{
-        "disallow":"id"
-    }
-}
- * 
- *
POST:post/authCode
-{
-    "Verify":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
*/ @MethodAccess( GET = {}, HEAD = {}, - POST_GET = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, - POST_HEAD = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + GETS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + HEADS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, POST = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, PUT = {ADMIN}, DELETE = {ADMIN} @@ -55,42 +38,50 @@ public class Verify extends BaseModel { private static final long serialVersionUID = 1L; - private String verify; + public static final int TYPE_LOGIN = 0; //登录 + public static final int TYPE_REGISTER = 1; //注册 + public static final int TYPE_PASSWORD = 2; //设置密码 + + private String phone; //手机 + private String verify; //验证码 + private Integer type; //验证类型 public Verify() { super(); } - public Verify(String phone) { + /**type和phone为联合主键,必传 + * @param type + * @param phone + */ + public Verify(int type, String phone) { this(); + setType(type); setPhone(phone); } - public Verify(Long phone) { - this(); - setId(phone); - } - public Verify(Long phone, Integer verify) { - this(phone); - setVerify(verify == null ? null : ("" + verify)); - } - public Verify(String phone, String verify) { - this(phone); - setVerify(verify); - } public String getVerify() { return verify; } - public void setVerify(String verify) { + public Verify setVerify(String verify) { this.verify = verify; + return this; } - //phone is not column - // public String getPhone() { - // return StringUtil.getString(getId()); - // } + public String getPhone() { + return phone; + } public Verify setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); + this.phone = phone; return this; } + + public Integer getType() { + return type; + } + public Verify setType(Integer type) { + this.type = type; + return this; + } + } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/server/model/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/java/apijson/demo/server/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/angel.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/angel.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/angel.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/angel.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/back_black_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/back_black_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/back_black_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/back_black_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/call_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/call_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/call_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/call_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/comment.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/comment.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/comment.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/comment.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/commented.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/commented.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/commented.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/commented.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/default_head.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/default_head.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/default_head.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/default_head.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/delete.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/delete.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/delete.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/delete.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/delete_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/delete_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/delete_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/delete_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/earth.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/earth.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/earth.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/earth.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/earth_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/earth_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/earth_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/earth_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/edit.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/edit.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/edit.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/edit.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light_small.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light_small.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light_small.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/edit_light_small.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/flash_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/flash_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/flash_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/flash_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/ic_launcher.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/loading.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/loading.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/loading.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/loading.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/mail.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/mail.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/mail.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/mail.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/mail_add.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/mail_add.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/mail_add.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/mail_add.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/mail_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/mail_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/mail_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/mail_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/menu.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/menu.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/menu.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/menu.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/menu_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/menu_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/menu_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/menu_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/off.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/off.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/off.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/off.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/on.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/on.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/on.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/on.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/praise.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/praise.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/praise.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/praise.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/praised.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/praised.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/praised.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/praised.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/qrcode.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/qrcode.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/qrcode.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/qrcode.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/search.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/search.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/search.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/search.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/search_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/search_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/search_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/search_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/send_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/send_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/send_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/send_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/setting.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/setting.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/setting.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/setting.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/setting_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/setting_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/setting_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/setting_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/star.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/star.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/star.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/star.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/star_light.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/star_light.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable-hdpi/star_light.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable-hdpi/star_light.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/earth_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/earth_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/earth_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/earth_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/gesture_left.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/gesture_left.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/gesture_left.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/gesture_left.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/gesture_right.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/gesture_right.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/gesture_right.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/gesture_right.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/ic_launcher.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/ic_launcher.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/mail_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/mail_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/mail_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/mail_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/search_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/search_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/search_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/search_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/setting_selector.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/setting_selector.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/setting_selector.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/setting_selector.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/splash.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/splash.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/drawable/splash.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/drawable/splash.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/about_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/about_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/about_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/about_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/comment_container_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/comment_container_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/comment_container_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/comment_container_view.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/comment_item.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/comment_item.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/comment_item.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/comment_item.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/comment_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/comment_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/comment_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/comment_view.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/login_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/login_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/login_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/login_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/main_tab_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/main_tab_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/main_tab_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/main_tab_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/mine_fragment.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/mine_fragment.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/mine_fragment.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/mine_fragment.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/moment_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/moment_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/moment_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/moment_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/moment_list_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/moment_list_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/moment_list_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/moment_list_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/moment_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/moment_view.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/moment_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/moment_view.xml diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/number_password_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/number_password_activity.xml new file mode 100644 index 000000000..505f9c0d6 --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/number_password_activity.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/password_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/password_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/password_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/password_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/qrcode_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/qrcode_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/qrcode_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/qrcode_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/scan_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/scan_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/scan_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/scan_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/setting_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/setting_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/setting_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/setting_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_activity.xml similarity index 96% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_activity.xml index c11165285..43c446f37 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_activity.xml +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_activity.xml @@ -84,18 +84,18 @@ + android:text="手机" /> + android:text="12345678900" /> diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_list_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_list_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_list_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_list_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_view.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_view.xml similarity index 94% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_view.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_view.xml index bcc4fa26f..4fa54da78 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/user_view.xml +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/user_view.xml @@ -40,9 +40,9 @@ android:text="ID:" /> + android:text="Tag:" /> \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/wallet_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/wallet_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/layout/wallet_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/layout/wallet_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/dimens.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/dimens.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/dimens.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/dimens.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/strings.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/strings.xml similarity index 75% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/strings.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/strings.xml index b0d87fc2a..a8627ecb8 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/strings.xml +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/strings.xml @@ -6,5 +6,6 @@ 发布成功 评论失败,再试一次吧^_^ 评论成功 - + 请输入密码 + 密码不一致 \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/styles.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/styles.xml similarity index 51% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/styles.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/styles.xml index 08d1de725..b928815ae 100755 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/res/values/styles.xml +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/main/res/values/styles.xml @@ -17,4 +17,19 @@ @color/black_to_white_selector + + + + \ No newline at end of file diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/test/java/apijson/demo/client/ExampleUnitTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/test/java/apijson/demo/client/ExampleUnitTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/test/java/apijson/demo/client/ExampleUnitTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/app/src/test/java/apijson/demo/client/ExampleUnitTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradle.properties b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradle.properties similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradle.properties rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradle.properties diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradle/wrapper/gradle-wrapper.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradle/wrapper/gradle-wrapper.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradle/wrapper/gradle-wrapper.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradle/wrapper/gradle-wrapper.properties b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradle/wrapper/gradle-wrapper.properties rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradle/wrapper/gradle-wrapper.properties diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradlew b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradlew similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradlew rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradlew diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradlew.bat b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradlew.bat similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/gradlew.bat rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/gradlew.bat diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/settings.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/settings.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/settings.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONApp/settings.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/libs/fastjson-1.2.24.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/libs/fastjson-1.2.24.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/libs/fastjson-1.2.24.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/libs/fastjson-1.2.24.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/proguard-rules.pro b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/proguard-rules.pro similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/proguard-rules.pro rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/proguard-rules.pro diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/androidTest/java/zuo/biao/apijson/client/ApplicationTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/AndroidManifest.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/AndroidManifest.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSON.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java similarity index 84% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSON.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java index 521acb01d..7bd24b97d 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSON.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java @@ -60,21 +60,24 @@ public static String getCorrectJson(String s) { public static String getCorrectJson(String s, boolean isArray) { s = StringUtil.getTrimedString(s); // if (isArray) { - // if (s.startsWith("\"")) { + // while (s.startsWith("\"")) { // s = s.substring(1); // } - // if (s.endsWith("\"")) { + // while (s.endsWith("\"")) { // s = s.substring(0, s.length() - 1); // } // } return s;//isJsonCorrect(s) ? s : null; } - /**json转JSONObject + /**obj转JSONObject * @param json * @return */ public static JSONObject parseObject(Object obj) { + if (obj instanceof JSONObject) { + return (JSONObject) obj; + } return parseObject(toJSONString(obj)); } /**json转JSONObject @@ -114,12 +117,16 @@ public static T parseObject(JSONObject object, Class clazz) { * @return */ public static T parseObject(String json, Class clazz) { - try { - int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; - features |= Feature.OrderedField.getMask(); - return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); - } catch (Exception e) { - Log.i(TAG, "parseObject catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseObject clazz == null >> return null;"); + } else { + try { + int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; + features |= Feature.OrderedField.getMask(); + return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); + } catch (Exception e) { + Log.i(TAG, "parseObject catch \n" + e.getMessage()); + } } return null; } @@ -131,6 +138,16 @@ public static T parseObject(String json, Class clazz) { public static JSONArray parseArray(List list) { return new JSONArray(list); } + /**obj转JSONArray + * @param json + * @return + */ + public static JSONArray parseArray(Object obj) { + if (obj instanceof JSONArray) { + return (JSONArray) obj; + } + return parseArray(toJSONString(obj)); + } /**json转JSONArray * @param json * @return @@ -157,10 +174,14 @@ public static List parseArray(JSONArray array, Class clazz) { * @return */ public static List parseArray(String json, Class clazz) { - try { - return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); - } catch (Exception e) { - Log.i(TAG, "parseArray catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseArray clazz == null >> return null;"); + } else { + try { + return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); + } catch (Exception e) { + Log.i(TAG, "parseArray catch \n" + e.getMessage()); + } } return null; } diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java new file mode 100644 index 000000000..3c9e0d1cf --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONObject.java @@ -0,0 +1,374 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Map; + +/**use this class instead of com.alibaba.fastjson.JSONObject + * @author Lemon + * @see #put + * @see #puts + * @see #putsAll + */ +public class JSONObject extends com.alibaba.fastjson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONObject"; + + + /**ordered + */ + public JSONObject() { + super(true); + } + /**transfer Object to JSONObject + * @param object + * @see {@link #JSONObject(Object, boolean)} + */ + public JSONObject(Object object) { + this(toJSONString(object)); + } + /**parse JSONObject with JSON String + * @param json + * @see {@link #JSONObject(String, boolean)} + */ + public JSONObject(String json) { + this(parseObject(json)); + } + /**transfer com.alibaba.fastjson.JSONObject to JSONObject + * @param object + * @see {@link #putsAll(com.alibaba.fastjson.JSONObject)} + */ + public JSONObject(com.alibaba.fastjson.JSONObject object) { + this(); + putsAll(object); + } + + + + + //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ARRAY = "[]"; + + /**判断是否为Array的key + * @param key + * @return + */ + public static boolean isArrayKey(String key) { + return key != null && key.endsWith(KEY_ARRAY); + } + /**判断是否为对应Table的key + * @param key + * @return + */ + public static boolean isTableKey(String key) { + return StringUtil.isBigName(key); + } + //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + + /**set "id":id in Table layer + * @param id + * @return + */ + public JSONObject setId(Long id) { + return puts(KEY_ID, id); + } + /**set id{}:[] in Table layer + * @param list + * @return + */ + public JSONObject setIdIn(List list) { + return puts(KEY_ID_IN, list); + } + + + //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ROLE = "@role"; //角色,拥有对某些数据的某些操作的权限 + public static final String KEY_CONDITION = "@condition"; //条件 TODO 用 @where& @where| @where! 替代? + public static final String KEY_TRY = "@try"; //尝试,忽略异常 + public static final String KEY_DROP = "@drop"; //丢弃,不返回 + public static final String KEY_CORRECT = "@correct"; //字段校正 + + public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明 + public static final String KEY_ABOUT = "@about"; //关于,返回数据库表的信息,包括表说明和字段说明 + public static final String KEY_COLUMN = "@column"; //查询的Table字段或SQL函数 + public static final String KEY_GROUP = "@group"; //分组方式 + public static final String KEY_HAVING = "@having"; //聚合函数条件,一般和@group一起用 + public static final String KEY_ORDER = "@order"; //排序方式 + //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> + + + /**set role of request sender + * @param role + * @return this + */ + public JSONObject setRole(String role) { + return puts(KEY_ROLE, role); + } + + /**set try, ignore exceptions + * @param tri + * @return this + */ + public JSONObject setTry(boolean tri) { + return puts(KEY_TRY, tri); + } + + /**set drop, data dropped will not return + * @param drop + * @return this + */ + public JSONObject setDrop(boolean drop) { + return puts(KEY_DROP, drop); + } + + /**set correct, correct keys to target ones + * @param correct Map{originKey, [posibleKeys]}, posibleKey之间用 , 隔开 + * @return this + */ + public JSONObject setCorrect(Map correct) { + return puts(KEY_CORRECT, correct); + } + + + + /**set schema where table was puts + * @param schema + * @return this + */ + public JSONObject setSchema(String schema) { + return puts(KEY_SCHEMA, schema); + } + + /**set about + * @param about + * @return this + */ + public JSONObject setAbout(boolean about) { + return puts(KEY_ABOUT, about); + } + + /**set keys need to be returned + * @param keys key0, key1, key2 ... + * @return {@link #setColumn(String)} + */ + public JSONObject setColumn(String... keys) { + return setColumn(StringUtil.getString(keys, true)); + } + /**set keys need to be returned + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setColumn(String keys) { + return puts(KEY_COLUMN, keys); + } + + /**set keys for group by + * @param keys key0, key1, key2 ... + * @return {@link #setGroup(String)} + */ + public JSONObject setGroup(String... keys) { + return setGroup(StringUtil.getString(keys, true)); + } + /**set keys for group by + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setGroup(String keys) { + return puts(KEY_GROUP, keys); + } + + /**set keys for having + * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... + * @return {@link #setHaving(String)} + */ + public JSONObject setHaving(String... keys) { + return setHaving(StringUtil.getString(keys, true)); + } + /**set keys for having + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setHaving(String keys) { + return puts(KEY_HAVING, keys); + } + + /**set keys for order by + * @param keys key0, key1+, key2- ... + * @return {@link #setOrder(String)} + */ + public JSONObject setOrder(String... keys) { + return setOrder(StringUtil.getString(keys, true)); + } + /**set keys for order by + * @param keys "key0,key1+,key2-..." + * @return + */ + public JSONObject setOrder(String keys) { + return puts(KEY_ORDER, keys); + } + + + //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //Request <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + /** + * @param key + * @param keys path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsPath(String key, String... keys) { + return puts(key+"@", StringUtil.getString(keys, "/")); + } + + /** + * @param key + * @param isNull + * @return {@link #puts(String, Object)} + */ + public JSONObject putsNull(String key, boolean isNull) { + return puts(key+"{}", SQL.isNull(isNull)); + } + /** + * trim = false + * @param key + * @param isEmpty + * @return {@link #putsEmpty(String, boolean, boolean)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty) { + return putsEmpty(key, isEmpty, false); + } + /** + * @param key + * @param isEmpty + * @return {@link #puts(String, Object)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty, boolean trim) { + return puts(key+"{}", SQL.isEmpty(key, isEmpty, trim)); + } + /** + * @param key + * @param compare <=0, >5 ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsLength(String key, String compare) { + return puts(key+"{}", SQL.length(key) + compare); + } + + /**设置搜索 + * type = SEARCH_TYPE_CONTAIN_FULL + * @param key + * @param value + * @return {@link #putsSearch(String, String, int)} + */ + public JSONObject putsSearch(String key, String value) { + return putsSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); + } + /**设置搜索 + * @param key + * @param value + * @param type + * @return {@link #puts(String, Object)} + */ + public JSONObject putsSearch(String key, String value, int type) { + return puts(key+"$", SQL.search(value, type)); + } + + //Request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + /**puts key-value in object into this + * @param object + * @return this + */ + public JSONObject putsAll(Map map) { + putAll(map); + return this; + } + @Override + public void putAll(Map map) { + if (map != null && map.isEmpty() == false) { + super.putAll(map); + } + } + + + + /**put and return this + * @param value must be annotated by {@link MethodAccess} + * @return {@link #puts(String, boolean)} + */ + public JSONObject puts(Object value) { + return puts(null, value); + } + /**put and return this + * @param key + * @param value + * @return this + * @see {@link #put(String, Object)} + */ + public JSONObject puts(String key, Object value) { + put(key, value); + return this; + } + + /**put and return value + * @param value must be annotated by {@link MethodAccess} + * @return {@link #put(String, boolean)} + */ + public Object put(Object value) { + return put(null, value); + } + /**put and return value + * @param key StringUtil.isEmpty(key, true) ? key = value.getClass().getSimpleName(); + * @param value + * @return value + */ + @Override + public Object put(String key, Object value) { + if (value == null) { + Log.e(TAG, "put value == null >> return null;"); + return null; + } + if (StringUtil.isEmpty(key, true)) { + Class clazz = value.getClass(); + if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { + throw new IllegalArgumentException("puts StringUtil.isNotEmpty(key, true) == false" + + " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + + " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + + " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + + " \n 如果是类似 key[]:{} 结构的请求,建议用 putsAll(...) !"); + } + key = value.getClass().getSimpleName(); + } + return super.put(key, value); + } + + + +} diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java new file mode 100644 index 000000000..5d33b681d --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONRequest.java @@ -0,0 +1,138 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.Map; + +/**wrapper for request + * @author Lemon + * @see #puts + * @see #toArray + * @use JSONRequest request = new JSONRequest(...); + *
request.puts(...);//not a must + *
request.toArray(...);//not a must + */ +public class JSONRequest extends JSONObject { + private static final long serialVersionUID = 1L; + + public JSONRequest() { + super(); + } + /** + * @param object must be annotated by {@link MethodAccess} + * @see {@link #JSONRequest(String, Object)} + */ + public JSONRequest(Object object) { + this(null, object); + } + /** + * @param name + * @param object + * @see {@link #puts(String, Object)} + */ + public JSONRequest(String name, Object object) { + this(); + puts(name, object); + } + + + + + public static final String KEY_TAG = "tag";//只在最外层,最外层用JSONRequest + + /**set "tag":tag in outermost layer + * for write operations + * @param tag + * @return + */ + public JSONRequest setTag(String tag) { + return puts(KEY_TAG, tag); + } + + + //array object <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int QUERY_TABLE = 0; + public static final int QUERY_TOTAL = 1; + public static final int QUERY_ALL = 2; + + public static final String KEY_QUERY = "query"; + public static final String KEY_COUNT = "count"; + public static final String KEY_PAGE = "page"; + + /**set what to query in Array layer + * @param query what need to query, Table,total,ALL? + * @return + * @see {@link #QUERY_TABLE} + * @see {@link #QUERY_TOTAL} + * @see {@link #QUERY_ALL} + */ + public JSONRequest setQuery(int query) { + return puts(KEY_QUERY, query); + } + /**set maximum count of Tables to query in Array layer + * @param count <= 0 || >= max ? max : count + * @return + */ + public JSONRequest setCount(int count) { + return puts(KEY_COUNT, count); + } + /**set page of Tables to query in Array layer + * @param page <= 0 ? 0 : page + * @return + */ + public JSONRequest setPage(int page) { + return puts(KEY_PAGE, page); + } + //array object >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + /**create a parent JSONObject named KEY_ARRAY + * @param count + * @param page + * @return {@link #toArray(int, int, boolean)} + */ + public JSONRequest toArray(int count, int page) { + return toArray(count, page, null); + } + /**create a parent JSONObject named name+KEY_ARRAY. + * @param count + * @param page + * @param name + * @return {name+KEY_ARRAY : this}. if needs to be put, use {@link #add(com.alibaba.fastjson.JSONObject)} instead + */ + public JSONRequest toArray(int count, int page, String name) { + return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page)); + } + + + @Override + public JSONObject putsAll(Map map) { + super.putsAll(map); + return this; + } + + @Override + public JSONRequest puts(Object value) { + return puts(null, value); + } + @Override + public JSONRequest puts(String key, Object value) { + super.puts(key, value); + return this; + } + +} diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java new file mode 100644 index 000000000..f9b6d3fc9 --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSONResponse.java @@ -0,0 +1,400 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Set; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/**parser for response + * @author Lemon + * @see #getObject + * @see #getList + * @use JSONResponse response = new JSONResponse(json); + *
User user = response.getObject(User.class);//not a must + *
List commenntList = response.getList("Comment[]", Comment.class);//not a must + */ +public class JSONResponse extends zuo.biao.apijson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONResponse"; + + public JSONResponse() { + super(); + } + public JSONResponse(String json) { + this(parseObject(json)); + } + public JSONResponse(JSONObject object) { + super(format(object)); + } + + //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int CODE_SUCCESS = 200; //成功 + public static final int CODE_UNSUPPORTED_ENCODING = 400; //编码错误 + public static final int CODE_ILLEGAL_ACCESS = 401; //权限错误 + public static final int CODE_UNSUPPORTED_OPERATION = 403; //禁止操作 + public static final int CODE_NOT_FOUND = 404; //未找到 + public static final int CODE_ILLEGAL_ARGUMENT = 406; //参数错误 + public static final int CODE_NOT_LOGGED_IN = 407; //未登录 + public static final int CODE_TIME_OUT = 408; //超时 + public static final int CODE_CONFLICT = 409; //重复,已存在 + public static final int CODE_CONDITION_ERROR = 412; //条件错误,如密码错误 + public static final int CODE_UNSUPPORTED_TYPE = 415; //类型错误 + public static final int CODE_OUT_OF_RANGE = 416; //超出范围 + public static final int CODE_NULL_POINTER = 417; //对象为空 + public static final int CODE_SERVER_ERROR = 500; //服务器内部错误 + + + public static final String MSG_SUCCEED = "success"; //成功 + public static final String MSG_SERVER_ERROR = "Internal Server Error!"; //服务器内部错误 + + + public static final String KEY_CODE = "code"; + public static final String KEY_MSG = "msg"; + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + public static final String KEY_COUNT = "count"; + public static final String KEY_TOTAL = "total"; + + /**获取状态 + * @return + */ + public int getCode() { + try { + return getIntValue(KEY_CODE); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取信息 + * @return + */ + public String getMsg() { + return getString(KEY_MSG); + } + /**获取id + * @return + */ + public long getId() { + try { + return getLongValue(KEY_ID); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取数量 + * @return + */ + public int getCount() { + try { + return getIntValue(KEY_COUNT); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取总数 + * @return + */ + public int getTotal() { + try { + return getIntValue(KEY_TOTAL); + } catch (Exception e) { + //empty + } + return 0; + } + + + /**是否成功 + * @return + */ + public boolean isSuccess() { + return isSuccess(getCode()); + } + /**是否成功 + * @param code + * @return + */ + public static boolean isSuccess(int code) { + return code == CODE_SUCCESS; + } + /**是否成功 + * @param response + * @return + */ + public static boolean isSuccess(JSONResponse response) { + return response != null && response.isSuccess(); + } + + /**校验服务端是否存在table + * @return + */ + public boolean isExist() { + return isExist(getCount()); + } + /**校验服务端是否存在table + * @param count + * @return + */ + public static boolean isExist(int count) { + return count > 0; + } + /**校验服务端是否存在table + * @param response + * @return + */ + public static boolean isExist(JSONResponse response) { + return response != null && response.isExist(); + } + + /**获取内部的JSONResponse + * @param key + * @return + */ + public JSONResponse getJSONResponse(String key) { + return getObject(key, JSONResponse.class); + } + //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + /** + * key = clazz.getSimpleName() + * @param clazz + * @return + */ + public T getObject(Class clazz) { + return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); + } + /** + * @param key + * @param clazz + * @return + */ + public T getObject(String key, Class clazz) { + return getObject(this, key, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static T getObject(JSONObject object, String key, Class clazz) { + return toObject(object == null ? null : object.getJSONObject(key), clazz); + } + + /** + * @param clazz + * @return + */ + public T toObject(Class clazz) { + return toObject(this, clazz); + } + /** + * @param object + * @param clazz + * @return + */ + public static T toObject(JSONObject object, Class clazz) { + return JSON.parseObject(JSON.toJSONString(object), clazz); + } + + + + + /** + * key = KEY_ARRAY + * @param clazz + * @return + */ + public List getList(Class clazz) { + return getList(KEY_ARRAY, clazz); + } + /** + * arrayObject = this + * @param key + * @param clazz + * @return + */ + public List getList(String key, Class clazz) { + return getList(this, key, clazz); + } + + /** + * key = KEY_ARRAY + * @param object + * @param clazz + * @return + */ + public static List getList(JSONObject object, Class clazz) { + return getList(object, KEY_ARRAY, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static List getList(JSONObject object, String key, Class clazz) { + return object == null ? null : JSON.parseArray(object.getString(replaceArray(key)), clazz); + } + + /** + * key = KEY_ARRAY + * @return + */ + public JSONArray getArray() { + return getArray(KEY_ARRAY); + } + /** + * @param key + * @return + */ + public JSONArray getArray(String key) { + return getArray(this, key); + } + /** + * @param object + * @return + */ + public static JSONArray getArray(JSONObject object) { + return getArray(object, KEY_ARRAY); + } + /** + * key = KEY_ARRAY + * @param object + * @param key + * @return + */ + public static JSONArray getArray(JSONObject object, String key) { + return object == null ? null : object.getJSONArray(replaceArray(key)); + } + + + // /** + // * @return + // */ + // public JSONObject format() { + // return format(this); + // } + /**格式化key名称 + * @param object + * @return + */ + public static JSONObject format(final JSONObject object) { + //太长查看不方便,不如debug Log.i(TAG, "format object = \n" + JSON.toJSONString(object)); + if (object == null || object.isEmpty()) { + Log.i(TAG, "format object == null || object.isEmpty() >> return object;"); + return object; + } + JSONObject formatedObject = new JSONObject(true); + + Set set = object.keySet(); + if (set != null) { + + Object value; + for (String key : set) { + value = object.get(key); + + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedObject.put(replaceArray(key), format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedObject.put(getSimpleName(key), format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedObject.put(getSimpleName(key), value); + } + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedObject = " + JSON.toJSONString(formatedObject)); + return formatedObject; + } + + /**格式化key名称 + * @param array + * @return + */ + public static JSONArray format(final JSONArray array) { + //太长查看不方便,不如debug Log.i(TAG, "format array = \n" + JSON.toJSONString(array)); + if (array == null || array.isEmpty()) { + Log.i(TAG, "format array == null || array.isEmpty() >> return array;"); + return array; + } + JSONArray formatedArray = new JSONArray(); + + Object value; + for (int i = 0; i < array.size(); i++) { + value = array.get(i); + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedArray.add(format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedArray.add(format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedArray.add(value); + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedArray = " + JSON.toJSONString(formatedArray)); + return formatedArray; + } + + /**替换key+KEY_ARRAY为keyList + * @param key + * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} + */ + public static String replaceArray(String key) { + if (isArrayKey(key)) { + key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); + } + return getSimpleName(key); + } + /**获取列表变量名 + * @param key => StringUtil.getNoBlankString(key) + * @return empty ? "list" : key + "List" 且首字母小写 + */ + public static String getArrayKey(String key) { + return StringUtil.addSuffix(key, "list"); + } + + /**获取简单名称 + * @param fullName name 或 name:alias + * @return name => name; name:alias => alias + */ + public static String getSimpleName(String fullName) { + //key:alias -> alias; key:alias[] -> alias[] + int index = fullName == null ? -1 : fullName.indexOf(":"); + if (index >= 0) { + fullName = fullName.substring(index + 1); + } + return fullName; + } + + +} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/Log.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/MethodAccess.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodAccess.java similarity index 74% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/MethodAccess.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodAccess.java index 1cf14dc6e..939571625 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/MethodAccess.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodAccess.java @@ -36,37 +36,37 @@ public @interface MethodAccess { /**@see {@link RequestMethod#GET} - * @return 该请求方法允许的结构 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ RequestRole[] GET() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; /**@see {@link RequestMethod#HEAD} - * @return 该请求方法允许的结构 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ RequestRole[] HEAD() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; - /**@see {@link RequestMethod#POST_GET} - * @return 该请求方法允许的结构 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + /**@see {@link RequestMethod#GETS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ - RequestRole[] POST_GET() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + RequestRole[] GETS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; - /**@see {@link RequestMethod#POST_HEAD} - * @return 该请求方法允许的结构 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + /**@see {@link RequestMethod#HEADS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; */ - RequestRole[] POST_HEAD() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + RequestRole[] HEADS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; /**@see {@link RequestMethod#POST} - * @return 该请求方法允许的结构 default {LOGIN, ADMIN}; + * @return 该请求方法允许的角色 default {LOGIN, ADMIN}; */ RequestRole[] POST() default {LOGIN, ADMIN}; /**@see {@link RequestMethod#PUT} - * @return 该请求方法允许的结构 default {OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; */ RequestRole[] PUT() default {OWNER, ADMIN}; /**@see {@link RequestMethod#DELETE} - * @return 该请求方法允许的结构 default {OWNER, ADMIN}; + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; */ RequestRole[] DELETE() default {OWNER, ADMIN}; diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/MethodStructure.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodStructure.java similarity index 91% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/MethodStructure.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodStructure.java index ffd2a0c3c..27c30c96d 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/MethodStructure.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/MethodStructure.java @@ -30,15 +30,15 @@ @Target(TYPE) public @interface MethodStructure { - /**@see {@link RequestMethod#POST_HEAD} + /**@see {@link RequestMethod#HEADS} * @return 该请求方法允许的结构 */ - String POST_HEAD() default ""; + String HEADS() default ""; - /**@see {@link RequestMethod#POST_GET} + /**@see {@link RequestMethod#GETS} * @return 该请求方法允许的结构 */ - String POST_GET() default ""; + String GETS() default ""; /**@see {@link RequestMethod#POST} * @return 该请求方法允许的结构 diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/RequestMethod.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java similarity index 74% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/RequestMethod.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java index 11f928134..a450baad8 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/RequestMethod.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestMethod.java @@ -14,7 +14,7 @@ package zuo.biao.apijson; -/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出POST_GET,POST_HEAD方法 +/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出GETS,HEADS方法 * @author Lemon */ public enum RequestMethod { @@ -29,15 +29,15 @@ public enum RequestMethod { */ HEAD, - /** - * 通过POST来GET数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 + /**Safe, Single, Simple + *
限制性GET,通过POST来GET数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 */ - POST_GET, + GETS, - /** - * 通过POST来HEAD数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 + /**Safe, Single, Simple + *
限制性HEAD,通过POST来HEAD数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 */ - POST_HEAD, + HEADS, /** * 新增(或者说插入)数据 @@ -57,22 +57,22 @@ public enum RequestMethod { /**是否为GET请求方法 * @param method - * @param containPrivate 包含私密(非明文)获取方法POST_GET + * @param containPrivate 包含私密(非明文)获取方法GETS * @return */ public static boolean isGetMethod(RequestMethod method, boolean containPrivate) { boolean is = method == null || method == GET; - return containPrivate == false ? is : is || method == POST_GET; + return containPrivate == false ? is : is || method == GETS; } /**是否为HEAD请求方法 * @param method - * @param containPrivate 包含私密(非明文)获取方法POST_HEAD + * @param containPrivate 包含私密(非明文)获取方法HEADS * @return */ public static boolean isHeadMethod(RequestMethod method, boolean containPrivate) { boolean is = method == HEAD; - return containPrivate == false ? is : is || method == POST_HEAD; + return containPrivate == false ? is : is || method == HEADS; } /**是否为查询的请求方法 diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/RequestRole.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestRole.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/RequestRole.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/RequestRole.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/SQL.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java similarity index 67% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/SQL.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java index 63f532b52..a9da023e5 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/SQL.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java @@ -22,8 +22,16 @@ public class SQL { public static final String OR = " OR "; public static final String AND = " AND "; public static final String NOT = " NOT "; + public static final String AS = " AS "; public static final String IS = " is "; public static final String NULL = " null "; + + //括号必须紧跟函数名! count (...) 报错! + public static final String COUNT = "count"; + public static final String SUM = "sum"; + public static final String MAX = "max"; + public static final String MIN = "min"; + public static final String AVG = "avg"; /** * isNull = true @@ -34,7 +42,7 @@ public static String isNull() { } /** * @param isNull - * @return IS + (isNull ? "" : NOT) + NULL; + * @return {@link #IS} + (isNull ? "" : {@link #NOT}) + {@link #NULL}; */ public static String isNull(boolean isNull) { return IS + (isNull ? "" : NOT) + NULL; @@ -87,7 +95,7 @@ public static String isEmpty(String s, boolean isEmpty, boolean trim) { * @param s * @param isEmpty <=0 * @param trim s = trim(s); - * @param nullable isNull(s, true) + OR + + * @param nullable isNull(s, true) + {@link #OR} + * @return {@link #lengthCompare(String, String)} */ public static String isEmpty(String s, boolean isEmpty, boolean trim, boolean nullable) { @@ -171,30 +179,30 @@ public static String subString(String s, int start, int end) { /** * @param s - * @param c - * @return "instr(" + s + "," + c + ")" + * @param c -> 'c' + * @return "instr(" + s + ", '" + c + "')" */ public static String indexOf(String s, String c) { - return "instr(" + s + "," + c + ")"; + return "instr(" + s + ", '" + c + "')"; } /** * @param s - * @param c1 - * @param c2 - * @return + * @param c1 -> 'c1' + * @param c2 -> 'c2' + * @return "replace(" + s + ", '" + c1 + "', '" + c2 + "')" */ public static String replace(String s, String c1, String c2) { - return "replace(" + s + "," + c1 + "," + c2 + ")"; + return "replace(" + s + ", '" + c1 + "', '" + c2 + "')"; } /** * @param s1 - * @param s2 - * @return "strcmp(" + s1 + "," + s2 + ")" + * @param s2 -> 's2' + * @return "strcmp(" + s1 + ", '" + s2 + "')" */ public static String equals(String s1, String s2) { - return "strcmp(" + s1 + "," + s2 + ")"; + return "strcmp(" + s1 + ", '" + s2 + "')"; } /** @@ -212,9 +220,98 @@ public static String toLowerCase(String s) { return "lower(" + s + ")"; } + + + //column and function<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**字段 + * @param column + * @return column.isEmpty() ? "*" : column; + */ + public static String column(String column) { + column = StringUtil.getTrimedString(column); + return column.isEmpty() ? "*" : column; + } + /**有别名的字段 + * @param column + * @return {@link #count(String)} + {@link #AS}; + */ + public static String columnAs(String column) { + return count(column) + AS; + } + + /**函数 + * @param column if (StringUtil.isEmpty(column, true) || column.contains(",")) -> column = null; + * @return " " + fun + "(" + {@link #column(String)} + ") "; + */ + public static String function(String fun, String column) { + if (StringUtil.isEmpty(column, true) || column.contains(",")) { + column = null; //解决 count(id,name) 这种多个字段导致的SQL异常 + } + return " " + fun + "(" + column(column) + ") "; + } + /**有别名的函数 + * @param column + * @return {@link #function(String, String)} + {@link #AS} + fun; + */ + public static String functionAs(String fun, String column) { + return function(fun, column) + AS + fun + " "; + } + + /**计数 + * column = null + * @return {@link #count(String)} + */ + public static String count() { + return count(null); + } + /**计数 + * fun = {@link #COUNT} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String count(String column) { + return functionAs(COUNT, column); + } + /**求和 + * fun = {@link #SUM} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String sum(String column) { + return functionAs(SUM, column); + } + /**最大值 + * fun = {@link #MAX} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String max(String column) { + return functionAs(MAX, column); + } + /**最小值 + * fun = {@link #MIN} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String min(String column) { + return functionAs(MIN, column); + } + /**平均值 + * fun = {@link #AVG} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String avg(String column) { + return functionAs(AVG, column); + } - + //column and function>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //search<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static final int SEARCH_TYPE_CONTAIN_FULL = 0; public static final int SEARCH_TYPE_CONTAIN_ORDER = 1; @@ -286,5 +383,7 @@ public static String search(String s, int type, boolean ignoreCase) { return "%" + s + "%"; } } + + //search>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/StringUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java similarity index 83% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/StringUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java index 538db3e06..b219b430a 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/StringUtil.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java @@ -17,7 +17,6 @@ import java.io.File; import java.math.BigDecimal; import java.text.DecimalFormat; -import java.util.regex.Matcher; import java.util.regex.Pattern; /**通用字符串(String)相关类,为null时返回"" @@ -100,7 +99,7 @@ public static String getString(String s) { * @param array * @return {@link #getString(String[], boolean)} */ - public static String getString(String[] array) { + public static String getString(Object[] array) { return getString(array, false); } /**获取string,为null则返回"" @@ -109,7 +108,7 @@ public static String getString(String[] array) { * @param ignoreEmptyItem * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, boolean ignoreEmptyItem) { + public static String getString(Object[] array, boolean ignoreEmptyItem) { return getString(array, null, ignoreEmptyItem); } /**获取string,为null则返回"" @@ -118,7 +117,7 @@ public static String getString(String[] array, boolean ignoreEmptyItem) { * @param split * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, String split) { + public static String getString(Object[] array, String split) { return getString(array, split, false); } /**获取string,为null则返回"" @@ -127,7 +126,7 @@ public static String getString(String[] array, String split) { * @param ignoreEmptyItem * @return */ - public static String getString(String[] array, String split, boolean ignoreEmptyItem) { + public static String getString(Object[] array, String split, boolean ignoreEmptyItem) { String s = ""; if (array != null) { if (split == null) { @@ -304,43 +303,74 @@ public static boolean isNotEmpty(String s, boolean trim) { //判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final Pattern ALPHA_PATTERN; - public static final Pattern NAME_PATTERN; - public static final Pattern BIG_ALPHA_PATTERN; - public static final Pattern SMALL_ALPHA_PATTERN; + public static final Pattern PATTERN_NUMBER; + public static final Pattern PATTERN_PHONE; + public static final Pattern PATTERN_EMAIL; + public static final Pattern PATTERN_ID_CARD; + public static final Pattern PATTERN_ALPHA; + public static final Pattern PATTERN_PASSWORD; //TODO + public static final Pattern PATTERN_NAME; + public static final Pattern PATTERN_ALPHA_BIG; + public static final Pattern PATTERN_ALPHA_SMALL; static { - ALPHA_PATTERN = Pattern.compile("[a-zA-Z]"); - NAME_PATTERN = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 - BIG_ALPHA_PATTERN = Pattern.compile("[A-Z]"); - SMALL_ALPHA_PATTERN = Pattern.compile("[a-z]"); - } - - //判断手机格式是否正确 + PATTERN_NUMBER = Pattern.compile("^[0-9]+$"); + PATTERN_ALPHA = Pattern.compile("^[a-zA-Z]+$"); + PATTERN_ALPHA_BIG = Pattern.compile("^[A-Z]+$"); + PATTERN_ALPHA_SMALL = Pattern.compile("^[a-z]+$"); + PATTERN_NAME = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 + PATTERN_PHONE = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); + PATTERN_EMAIL = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); + PATTERN_ID_CARD = Pattern.compile("(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)"); + PATTERN_PASSWORD = Pattern.compile("^[0-9a-zA-Z]+$"); + } + + /**判断手机格式是否正确 + * @param phone + * @return + */ public static boolean isPhone(String phone) { if (isNotEmpty(phone, true) == false) { return false; } - Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); - currentString = phone; - - return p.matcher(phone).matches(); + return PATTERN_PHONE.matcher(phone).matches(); + } + /**判断手机格式是否正确 + * @param s + * @return + */ + public static boolean isPassword(String s) { + return getLength(s, false) >= 6 && PATTERN_PASSWORD.matcher(s).matches(); } - //判断email格式是否正确 + /**判断是否全是数字密码 + * @param s + * @return + */ + public static boolean isNumberPassword(String s) { + return getLength(s, false) == 6 && isNumer(s); + } + /**判断email格式是否正确 + * @param email + * @return + */ public static boolean isEmail(String email) { if (isNotEmpty(email, true) == false) { return false; } - String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; - Pattern p = Pattern.compile(str); - currentString = email; - - return p.matcher(email).matches(); + return PATTERN_EMAIL.matcher(email).matches(); } + + /**判断是否全是验证码 + * @param s + * @return + */ + public static boolean isVerify(String s) { + return getLength(s, false) >= 4 && isNumer(s); + } /**判断是否全是数字 * @param s * @return @@ -350,39 +380,20 @@ public static boolean isNumer(String s) { return false; } - Pattern pattern = Pattern.compile("[0-9]"); - Matcher matcher; - for (int i = 0; i < s.length(); i++) { - matcher = pattern.matcher(s.substring(i, i+1)); - if(! matcher.matches()){ - return false; - } - } - currentString = s; - - return true; + return PATTERN_NUMBER.matcher(s).matches(); } /**判断是否全是字母 * @param s * @return */ public static boolean isAlpha(String s) { - if (s == null) { - Log.i(TAG, "isNumberOrAlpha inputed == null >> return false;"); + if (isEmpty(s, true)) { return false; } - Pattern pAlpha = Pattern.compile("[a-zA-Z]"); - Matcher mAlpha; - for (int i = 0; i < s.length(); i++) { - mAlpha = pAlpha.matcher(s.substring(i, i+1)); - if(! mAlpha.matches()){ - return false; - } - } currentString = s; - return true; + return PATTERN_ALPHA.matcher(s).matches(); } /**判断是否全是数字或字母 * @param s @@ -392,53 +403,53 @@ public static boolean isNumberOrAlpha(String s) { return isNumer(s) || isAlpha(s); } - /**判断是否为单词,只能包含字母,数字或下划线 + /**判断是否为代码名称,只能包含字母,数字或下划线 * @param s * @return */ - public static boolean isWord(String s) { - return s != null && NAME_PATTERN.matcher(s).matches(); + public static boolean isName(String s) { + return s != null && PATTERN_NAME.matcher(s).matches(); } - /**判断是否为首字母大写的单词 + /**判断是否为首字母大写的代码名称 * @param key * @return */ - public static boolean isBigWord(String s) { + public static boolean isBigName(String s) { s = getString(s); - if (s.isEmpty() || BIG_ALPHA_PATTERN.matcher(s.substring(0, 1)).matches() == false) { + if (s.isEmpty() || PATTERN_ALPHA_BIG.matcher(s.substring(0, 1)).matches() == false) { return false; } - return s.length() <= 1 ? true : isWord(s.substring(1)); + return s.length() <= 1 ? true : isName(s.substring(1)); } - /**判断是否为首字母小写的单词 + /**判断是否为首字母小写的代码名称 * @param key * @return */ - public static boolean isSmallWord(String s) { + public static boolean isSmallName(String s) { s = getString(s); - if (s.isEmpty() || SMALL_ALPHA_PATTERN.matcher(s.substring(0, 1)).matches() == false) { + if (s.isEmpty() || PATTERN_ALPHA_SMALL.matcher(s.substring(0, 1)).matches() == false) { return false; } - return s.length() <= 1 ? true : isWord(s.substring(1)); + return s.length() <= 1 ? true : isName(s.substring(1)); } /**判断字符类型是否是身份证号 - * @param idCard + * @param number * @return */ - public static boolean isIDCard(String idCard) { - if (isNumberOrAlpha(idCard) == false) { + public static boolean isIDCard(String number) { + if (isNumberOrAlpha(number) == false) { return false; } - idCard = getString(idCard); - if (idCard.length() == 15) { - Log.i(TAG, "isIDCard idCard.length() == 15 old IDCard"); - currentString = idCard; + number = getString(number); + if (number.length() == 15) { + Log.i(TAG, "isIDCard number.length() == 15 old IDCard"); + currentString = number; return true; } - if (idCard.length() == 18) { - currentString = idCard; + if (number.length() == 18) { + currentString = number; return true; } @@ -726,11 +737,21 @@ public static String[] split(String s) { return split(s, null); } /**将s用split分割成String[] + * trim = true; * @param s * @param split * @return */ public static String[] split(String s, String split) { + return split(s, split, true); + } + /**将s用split分割成String[] + * @param s + * @param split + * @param trim 去掉前后两端的split + * @return + */ + public static String[] split(String s, String split, boolean trim) { s = getString(s); if (s.isEmpty()) { return null; @@ -738,11 +759,13 @@ public static String[] split(String s, String split) { if (isNotEmpty(split, false) == false) { split = ","; } - while (s.startsWith(split)) { - s = s.substring(split.length()); - } - while (s.endsWith(split)) { - s = s.substring(0, s.length() - split.length()); + if (trim) { + while (s.startsWith(split)) { + s = s.substring(split.length()); + } + while (s.endsWith(split)) { + s = s.substring(0, s.length() - split.length()); + } } return s.contains(split) ? s.split(split) : new String[]{s}; } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/APIJSONLibrary/src/test/java/zuo/biao/apijson/client/ExampleUnitTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/.gitignore b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/.gitignore similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/.gitignore rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/.gitignore diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/libs/okhttp-2.1.0.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/libs/okhttp-2.1.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/libs/okhttp-2.1.0.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/libs/okhttp-2.1.0.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/libs/okio-1.0.0.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/libs/okio-1.0.0.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/libs/okio-1.0.0.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/libs/okio-1.0.0.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/proguard-rules.pro b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/proguard-rules.pro similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/proguard-rules.pro rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/proguard-rules.pro diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/androidTest/java/apijson/demo/ApplicationTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/androidTest/java/apijson/demo/ApplicationTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/androidTest/java/apijson/demo/ApplicationTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/androidTest/java/apijson/demo/ApplicationTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/AndroidManifest.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/AndroidManifest.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/AndroidManifest.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/AndroidManifest.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/HttpManager.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/HttpManager.java similarity index 79% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/HttpManager.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/HttpManager.java index 9bde4a758..e8c5d73c8 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/HttpManager.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/HttpManager.java @@ -14,12 +14,9 @@ package apijson.demo; -import static zuo.biao.apijson.StringUtil.UTF_8; - import java.io.IOException; import java.net.CookieHandler; import java.net.URI; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -87,58 +84,58 @@ public synchronized static HttpManager getInstance() { public static final String KEY_TOKEN = "token"; public static final String KEY_COOKIE = "cookie"; + // encode和decode太麻烦,直接都用HTTP POST + // /**GET请求 + // * @param paramList 请求参数列表,(可以一个键对应多个值) + // * @param url 接口url + // * @param requestCode + // * 请求码,类似onActivityResult中请求码,当同一activity中以实现接口方式发起多个网络请求时,请求结束后都会回调 + // * {@link OnHttpResponseListener#onHttpResponse(int, String, Exception)}
+ // * 在发起请求的类中可以用requestCode来区分各个请求 + // * @param listener + // */ + // public void get(final String url_, final String request, final OnHttpResponseListener listener) { + // Log.d(TAG, "get url_ = " + url_ + "; request = " + request + " >>>"); + // new AsyncTask() { + // + // String result; + // @Override + // protected Exception doInBackground(Void... params) { + // try { + // String url = StringUtil.getNoBlankString(url_) + // + URLEncoder.encode(StringUtil.getNoBlankString(request), UTF_8); + // StringBuffer sb = new StringBuffer(); + // sb.append(url); + // + // OkHttpClient client = getHttpClient(url); + // if (client == null) { + // return new Exception(TAG + ".get AsyncTask.doInBackground client == null >> return;"); + // } + // + // result = getResponseJson(client, new Request.Builder() + // .addHeader(KEY_TOKEN, getToken(url)) + // .url(sb.toString()).build()); + // } catch (Exception e) { + // Log.e(TAG, "get AsyncTask.doInBackground try { result = getResponseJson(..." + + // "} catch (Exception e) {\n" + e.getMessage()); + // return e; + // } + // + // return null; + // } + // + // @Override + // protected void onPostExecute(Exception exception) { + // super.onPostExecute(exception); + // listener.onHttpResponse(0, result, exception); + // } + // + // }.execute(); + // + // } + + public static final MediaType TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); - /**GET请求 - * @param paramList 请求参数列表,(可以一个键对应多个值) - * @param url 接口url - * @param requestCode - * 请求码,类似onActivityResult中请求码,当同一activity中以实现接口方式发起多个网络请求时,请求结束后都会回调 - * {@link OnHttpResponseListener#onHttpResponse(int, String, Exception)}
- * 在发起请求的类中可以用requestCode来区分各个请求 - * @param listener - */ - public void get(final String url_, final String request, final OnHttpResponseListener listener) { - Log.d(TAG, "get url_ = " + url_ + "; request = " + request + " >>>"); - new AsyncTask() { - - String result; - @Override - protected Exception doInBackground(Void... params) { - try { - String url = StringUtil.getNoBlankString(url_) - + URLEncoder.encode(StringUtil.getNoBlankString(request), UTF_8); - StringBuffer sb = new StringBuffer(); - sb.append(url); - - OkHttpClient client = getHttpClient(url); - if (client == null) { - return new Exception(TAG + ".get AsyncTask.doInBackground client == null >> return;"); - } - - result = getResponseJson(client, new Request.Builder() - .addHeader(KEY_TOKEN, getToken(url)) - .url(sb.toString()).build()); - } catch (Exception e) { - Log.e(TAG, "get AsyncTask.doInBackground try { result = getResponseJson(..." + - "} catch (Exception e) {\n" + e.getMessage()); - return e; - } - - return null; - } - - @Override - protected void onPostExecute(Exception exception) { - super.onPostExecute(exception); - listener.onHttpResponse(0, result, exception); - } - - }.execute(); - - } - - public static final MediaType TYPE_JSON =MediaType.parse("application/json; charset=utf-8"); - /**POST请求 * @param paramList 请求参数列表,(可以一个键对应多个值) * @param url 接口url @@ -163,9 +160,9 @@ protected Exception doInBackground(Void... params) { if (client == null) { return new Exception(TAG + ".post AsyncTask.doInBackground client == null >> return;"); } - + RequestBody requestBody = RequestBody.create(TYPE_JSON, request); - + result = getResponseJson(client, new Request.Builder() .addHeader(KEY_TOKEN, getToken(url)).url(StringUtil.getNoBlankString(url)) .post(requestBody).build()); diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/RequestUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/RequestUtil.java similarity index 55% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/RequestUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/RequestUtil.java index a8e560f0b..b4cc06954 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/RequestUtil.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/RequestUtil.java @@ -23,11 +23,10 @@ import apijson.demo.application.DemoApplication; import apijson.demo.model.Comment; import apijson.demo.model.Moment; +import apijson.demo.model.Privacy; import apijson.demo.model.User; -import apijson.demo.model.Wallet; /**请求工具类 - * 设置encode参数只为方便展示,实际使用时并不需要 * @author Lemon */ public class RequestUtil { @@ -42,7 +41,7 @@ public class RequestUtil { - public static JSONObject newPostRequest(boolean encode) { + public static JSONObject newPostRequest() { Moment data = new Moment(); data.setUserId(DEFAULT_USER_ID); data.setContent(context.getString(R.string.apijson_slogan)); @@ -50,80 +49,76 @@ public static JSONObject newPostRequest(boolean encode) { list.add("http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000"); list.add("http://common.cnblogs.com/images/icon_weibo_24.png"); data.setPictureList(list); - return new JSONRequest(data, encode).setTag(Moment.class.getSimpleName()); + return new JSONRequest(data).setTag(Moment.class.getSimpleName()); } - public static JSONObject newPutRequest(long id, boolean encode) { + public static JSONObject newPutRequest(long id) { Moment data = new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id); // data.setContent(context.getString(R.string.apijson_info));//一般可用这种方式,encode是为了展示方便 List list = new ArrayList(); list.add((long) 82001); list.add((long) 82002); - JSONObject momentObject = new JSONObject(data, encode); - momentObject.put("praiseUserIdList+", list, encode); - momentObject.put("content", context.getString(R.string.apijson_info), encode); - return new JSONRequest(Moment.class.getSimpleName(), momentObject, encode).setTag(Moment.class.getSimpleName()); + JSONObject momentObject = new JSONObject(data); + momentObject.put("praiseUserIdList+", list); + momentObject.put("content", context.getString(R.string.apijson_info)); + return new JSONRequest(Moment.class.getSimpleName(), momentObject).setTag(Moment.class.getSimpleName()); } - public static JSONObject newDeleteRequest(long id, boolean encode) { - return new JSONRequest(new Moment(id <= 0 ? 10000 : id), encode).setTag(Moment.class.getSimpleName()); + public static JSONObject newDeleteRequest(long id) { + return new JSONRequest(new Moment(id <= 0 ? 10000 : id)).setTag(Moment.class.getSimpleName()); } - public static JSONObject newSingleRequest(long id, boolean encode) { - return new JSONRequest(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id), encode); + public static JSONObject newSingleRequest(long id) { + return new JSONRequest(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id)); } - public static JSONObject newColumnsRequest(long id, boolean encode) { - JSONObject object = new JSONObject(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id), encode); + public static JSONObject newColumnsRequest(long id) { + JSONObject object = new JSONObject(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id)); object.setColumn("id,userId,content"); - return new JSONRequest(Moment.class.getSimpleName(), object, encode); + return new JSONRequest(Moment.class.getSimpleName(), object); } - public static JSONObject newRelyRequest(long id, boolean encode) { + public static JSONObject newRelyRequest(long id) { JSONRequest request = new JSONRequest(); - request.put(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id), encode); - request.put(User.class.getSimpleName(), new JSONRequest("id@", "Moment/userId", encode)); + request.put(new Moment(id <= 0 ? DEFAULT_MOMENT_ID : id)); + request.put(User.class.getSimpleName(), new JSONRequest("id@", "Moment/userId")); return request; } - public static JSONObject newArrayRequest(boolean encode) { + public static JSONObject newArrayRequest() { JSONRequest dataObject = new JSONRequest(); - dataObject.put("name$", "%o%", encode); - JSONRequest request = new JSONRequest(User.class.getSimpleName(), dataObject, encode); - return request.toArray(5, 1, User.class.getSimpleName(), encode); + dataObject.put("name$", "%o%"); + JSONRequest request = new JSONRequest(User.class.getSimpleName(), dataObject); + return request.toArray(5, 1, User.class.getSimpleName()); } - public static JSONObject newComplexRequest(boolean encode) { + public static JSONObject newComplexRequest() { JSONRequest request = new JSONRequest(); List idList = new ArrayList(); idList.add(DEFAULT_USER_ID); idList.add((long) 93793); - request.put(Moment.class.getSimpleName(), new JSONRequest("userId{}", idList, encode), encode); + request.put(Moment.class.getSimpleName(), new JSONRequest("userId{}", idList)); - request.put(User.class.getSimpleName(), new JSONRequest("id@", "/Moment/userId", encode), encode); + request.put(User.class.getSimpleName(), new JSONRequest("id@", "/Moment/userId")); - request.add(new JSONRequest(Comment.class.getSimpleName() - , new JSONRequest("momentId@", "[]/Moment/id", encode), encode). - toArray(3, 0, Comment.class.getSimpleName()), encode); + request.putAll(new JSONRequest(Comment.class.getSimpleName() + , new JSONRequest("momentId@", "[]/Moment/id")). + toArray(3, 0, Comment.class.getSimpleName())); - return request.toArray(3, 0, encode); + return request.toArray(3, 0); } - public static JSONObject newAccessErrorRequest(boolean encode) { - return new JSONRequest(new Wallet().setUserId(DEFAULT_USER_ID), encode) - .setTag(Wallet.class.getSimpleName()); + public static JSONObject newAccessErrorRequest() { + return new JSONRequest(new Privacy(DEFAULT_USER_ID)); } - public static JSONObject newAccessPermittedRequest(boolean encode) { - JSONRequest request = new JSONRequest(); - request.put(new Wallet().setUserId(DEFAULT_USER_ID), encode); - request.put("currentUserId", DEFAULT_USER_ID, encode); - request.put("loginPassword", "apijson", encode); - return request.setTag(Wallet.class.getSimpleName()); + public static JSONObject newAccessPermittedRequest() { + JSONRequest request = new JSONRequest(new Privacy(DEFAULT_USER_ID)); + return request.setTag(Privacy.class.getSimpleName()); } } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/StringUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/StringUtil.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/StringUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/StringUtil.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/application/DemoApplication.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/application/DemoApplication.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/application/DemoApplication.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/application/DemoApplication.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/application/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/application/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/application/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/application/package-info.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/BaseModel.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/BaseModel.java similarity index 99% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/BaseModel.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/BaseModel.java index d2f1f639d..a6f375a3f 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/BaseModel.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/BaseModel.java @@ -12,7 +12,7 @@ See the License for the specific language governing permissions and limitations under the License.*/ -package apijson.demo.server.model; +package apijson.demo.model; import java.io.Serializable; import java.util.Arrays; diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Comment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Comment.java similarity index 97% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Comment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Comment.java index 32f4f69c7..fe554f164 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Comment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Comment.java @@ -12,7 +12,7 @@ See the License for the specific language governing permissions and limitations under the License.*/ -package apijson.demo.server.model; +package apijson.demo.model; import zuo.biao.apijson.MethodAccess; diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Moment.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Moment.java similarity index 98% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Moment.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Moment.java index 21214a1da..6a30926ff 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Moment.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Moment.java @@ -12,7 +12,7 @@ See the License for the specific language governing permissions and limitations under the License.*/ -package apijson.demo.server.model; +package apijson.demo.model; import static zuo.biao.apijson.RequestRole.ADMIN; import static zuo.biao.apijson.RequestRole.CIRCLE; diff --git a/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Privacy.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Privacy.java new file mode 100644 index 000000000..1d87e61af --- /dev/null +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/Privacy.java @@ -0,0 +1,98 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.OWNER; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import zuo.biao.apijson.MethodAccess; + +/**用户隐私信息 + * @author Lemon + */ +@MethodAccess( + GET = {}, + GETS = {OWNER, ADMIN}, + POST = {UNKNOWN, ADMIN}, + DELETE = {ADMIN} + ) +public class Privacy extends BaseModel { + private static final long serialVersionUID = 1L; + + public static final int PASSWORD_TYPE_LOGIN = 0; + public static final int PASSWORD_TYPE_PAY = 1; + + private String phone; //手机 + private String password; //登录密码,隐藏字段 + private String payPassword; //支付密码,隐藏字段 + private Double balance; //余额 + + public Privacy() { + super(); + } + + public Privacy(long id) { + this(); + setId(id); + } + + public Privacy(String phone, String password) { + this(); + setPhone(phone); + setPassword(password); + } + + + + public String getPhone() { + return phone; + } + public Privacy setPhone(String phone) { + this.phone = phone; + return this; + } + + /**get_password会转为password + * @return + */ + public String get__password() { + return password; + } + public Privacy setPassword(String password) { + this.password = password; + return this; + } + + /**get_PayPassword会转为PayPassword + * @return + */ + public String get__payPassword() { + return payPassword; + } + public Privacy setPayPassword(String payPassword) { + this.payPassword = payPassword; + return this; + } + + public Double getBalance() { + return balance; + } + public Privacy setBalance(Double balance) { + this.balance = balance; + return this; + } + +} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/User.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/User.java similarity index 100% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/model/User.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/User.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/model/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/AutoActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/AutoActivity.java similarity index 98% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/AutoActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/AutoActivity.java index 137cd4823..c067267c7 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/AutoActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/AutoActivity.java @@ -131,7 +131,7 @@ public void request(TextView tv) { } public void request(String method) { startActivityForResult(RequestActivity.createIntent(context, id, url, method - , JSON.parseObject(StringUtil.getString(tvAutoRequest)), false), REQUEST_TO_REQUEST); + , JSON.parseObject(StringUtil.getString(tvAutoRequest))), REQUEST_TO_REQUEST); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/CodeUtil.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/CodeUtil.java similarity index 88% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/CodeUtil.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/CodeUtil.java index 007d6eac2..fc1b6d5d2 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/CodeUtil.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/CodeUtil.java @@ -43,14 +43,12 @@ public static String parse(final String name, final JSONObject request) { if (set != null) { Object value; - String pairKey; for (String key : set) { value = request.get(key); if (value == null) { continue; } - pairKey = new String(key instanceof String ? "\"" + key + "\"" : key); if (value instanceof JSONObject) {//APIJSON Array转为常规JSONArray if (isArrayKey(key)) {//APIJSON Array转为常规JSONArray response += NEWLINE + NEWLINE + "//" + key + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; @@ -65,22 +63,25 @@ public static String parse(final String name, final JSONObject request) { String prefix = key.substring(0, key.length() - 2); response += NEWLINE + NEWLINE - + parentKey + ".add(" + getItemKey(key) + ".toArray(" + + parentKey + ".putAll(" + getItemKey(key) + ".toArray(" + count + ", " + page + (prefix.isEmpty() ? "" : ", \"" + prefix + "\"") + "));"; response += NEWLINE + "//" + key + ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + NEWLINE; - } else {//常规JSONObject,往下一级提取 + } + else {//常规JSONObject,往下一级提取 response += NEWLINE + NEWLINE + "//" + key + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; response += parse(key, (JSONObject) value); - response += NEWLINE + NEWLINE + parentKey + ".put(" + pairKey + ", " + getTableKey(key) + ");"; + response += NEWLINE + NEWLINE + parentKey + ".put(\"" + key + "\", " + getTableKey(key) + ");"; response += NEWLINE + "//" + key + ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + NEWLINE; } - } else {//其它Object,直接填充 + } + else {//其它Object,直接填充 if (value instanceof String) { value = "\"" + value + "\""; - } else if (value instanceof JSONArray) { + } + else if (value instanceof JSONArray) { String s = StringUtil.getString(value); if (s.startsWith("[")) { s = s.substring(1); @@ -93,7 +94,7 @@ public static String parse(final String name, final JSONObject request) { value = "new Object[]{" + s + "}";//反射获取泛型太麻烦,反正开发中还要改的 } - response += NEWLINE + parentKey + ".put(" + pairKey + ", " + value + ");"; + response += NEWLINE + parentKey + ".put(\"" + key + "\", " + value + ");"; } } } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/RequestActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/RequestActivity.java similarity index 83% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/RequestActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/RequestActivity.java index 3055746aa..91eba0e55 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/RequestActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/RequestActivity.java @@ -39,8 +39,9 @@ import apijson.demo.HttpManager.OnHttpResponseListener; import apijson.demo.R; import apijson.demo.StringUtil; +import apijson.demo.model.BaseModel; import apijson.demo.model.Moment; -import apijson.demo.model.Wallet; +import apijson.demo.model.Privacy; import com.alibaba.fastjson.JSONObject; @@ -56,7 +57,6 @@ public class RequestActivity extends Activity implements OnHttpResponseListener public static final String INTENT_URL = "INTENT_URL"; public static final String INTENT_METHOD = "INTENT_METHOD"; public static final String INTENT_REQUEST = "INTENT_REQUEST"; - public static final String INTENT_ENCODED = "INTENT_ENCODED"; public static final String RESULT_ID = "RESULT_ID"; public static final String RESULT_URL = "RESULT_URL"; @@ -68,17 +68,14 @@ public class RequestActivity extends Activity implements OnHttpResponseListener * @param url * @param method * @param request - * @param encoded * @return */ - public static Intent createIntent(Context context, long id, String url, String method, - JSONObject request, boolean encoded) { + public static Intent createIntent(Context context, long id, String url, String method, JSONObject request) { return new Intent(context, RequestActivity.class) .putExtra(RequestActivity.INTENT_ID, id) .putExtra(RequestActivity.INTENT_URL, url) .putExtra(RequestActivity.INTENT_METHOD, method) - .putExtra(RequestActivity.INTENT_REQUEST, JSON.toJSONString(request)) - .putExtra(RequestActivity.INTENT_ENCODED, encoded); + .putExtra(RequestActivity.INTENT_REQUEST, JSON.toJSONString(request)); } @@ -92,7 +89,6 @@ public static Intent createIntent(Context context, long id, String url, String m private String url; private String method; private String request; - private boolean encoded; private TextView tvRequestResult; private ProgressBar pbRequest; @@ -113,20 +109,9 @@ protected void onCreate(Bundle savedInstanceState) { url = getIntent().getStringExtra(INTENT_URL); method = getIntent().getStringExtra(INTENT_METHOD); request = getIntent().getStringExtra(INTENT_REQUEST); - encoded = getIntent().getBooleanExtra(INTENT_ENCODED, false); method = StringUtil.getTrimedString(method); url = StringUtil.getCorrectUrl(url); - if (encoded == false && request != null && request.contains("/")) { - // try {//导致JSON.format(request)返回null,然后tvRequestResult就显示为null了 - // String s = URLEncoder.encode(new String(request), StringUtil.UTF_8); - // request = s; - // } catch (UnsupportedEncodingException e) { - // e.printStackTrace(); - // } - request = request.replaceAll("/", "%2F"); - } - tvRequestResult = (TextView) findViewById(R.id.tvRequestResult); pbRequest = (ProgressBar) findViewById(R.id.pbRequest); @@ -136,7 +121,7 @@ protected void onCreate(Bundle savedInstanceState) { etRequestUrl.setText(StringUtil.getString(StringUtil.isNotEmpty(url, true) - ? url : "http://139.196.140.118:8080/"));//TODO 把这个ip地址改成你自己服务器的 + ? url : "http://39.108.143.172:8080/"));//TODO 把这个ip地址改成你自己服务器的 btnRequestRequest.setText(method); error = String.format(getResources().getString(R.string.request_error), StringUtil.getTrimedString(btnRequestRequest)); @@ -174,11 +159,7 @@ private void request() { tvRequestResult.setText("requesting...\n\n url = " + fullUrl + "\n\n request = \n" + JSON.format(request) + "\n\n\n" + error); pbRequest.setVisibility(View.VISIBLE); - if ("get".equals(method) || "head".equals(method)) { - HttpManager.getInstance().get(fullUrl, request, this); - } else { - HttpManager.getInstance().post(fullUrl, request, this); - } + HttpManager.getInstance().post(fullUrl, request, this); } /**用浏览器请求,只有GET请求才能正常访问 @@ -233,7 +214,7 @@ public void onHttpResponse(int requestCode, final String resultJson, final Excep if ("post".equals(method)) { Moment moment = response.getObject(Moment.class); - id = moment == null ? 0 : moment.getId(); + id = moment == null ? 0 : BaseModel.value(moment.getId()); Log.d(TAG, "onHttpResponse post.equals(method) >> id = " + id); } else if ("put".equals(method)) { @@ -242,15 +223,15 @@ public void onHttpResponse(int requestCode, final String resultJson, final Excep } else if ("delete".equals(method)) { response = response.getJSONResponse(Moment.class.getSimpleName()); - // if (JSONResponse.isSucceed(response)) {//delete succeed + // if (JSONResponse.isSuccess(response)) {//delete succeed id = 0;//reuse default value // } Log.d(TAG, "onHttpResponse delete.equals(method) >> id = " + id - + "; isSucceed = " + JSONResponse.isSucceed(response)); + + "; isSucceed = " + JSONResponse.isSuccess(response)); - } else if ("post_get".equals(method)) { - Wallet wallet = response.getObject(Wallet.class); - Log.d(TAG, "onHttpResponse post_get.equals(method) >> wallet = " + JSON.toJSONString(wallet)); + } else if ("gets".equals(method)) { + Privacy privacy = response.getObject(Privacy.class); + Log.d(TAG, "onHttpResponse gets.equals(method) >> privacy = \n" + JSON.toJSONString(privacy)); } diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/SelectActivity.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/SelectActivity.java similarity index 84% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/SelectActivity.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/SelectActivity.java index 0d716f4a8..710f30d38 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONTest/src/apijson/demo/ui/SelectActivity.java +++ b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/SelectActivity.java @@ -109,7 +109,7 @@ public void toUpdateLog(View v) { */ public void setRequest() { for (int i = 0; i < buttons.length; i++) { - buttons[i].setText(JSON.format(getRequest(buttons[i], false))); + buttons[i].setText(JSON.format(getRequest(buttons[i]))); } } @@ -119,30 +119,30 @@ public void setRequest() { * @param v * @return */ - public JSONObject getRequest(View v, boolean encode) { + public JSONObject getRequest(View v) { switch (v.getId()) { case R.id.btnSelectPost: - return RequestUtil.newPostRequest(encode); + return RequestUtil.newPostRequest(); case R.id.btnSelectPut: - return RequestUtil.newPutRequest(id, encode); + return RequestUtil.newPutRequest(id); case R.id.btnSelectDelete: - return RequestUtil.newDeleteRequest(id, encode); + return RequestUtil.newDeleteRequest(id); case R.id.btnSelectSingle: - return RequestUtil.newSingleRequest(id, encode); + return RequestUtil.newSingleRequest(id); case R.id.btnSelectColumns: - return RequestUtil.newColumnsRequest(id, encode); + return RequestUtil.newColumnsRequest(id); case R.id.btnSelectRely: - return RequestUtil.newRelyRequest(id, encode); + return RequestUtil.newRelyRequest(id); case R.id.btnSelectArray: - return RequestUtil.newArrayRequest(encode); + return RequestUtil.newArrayRequest(); case R.id.btnSelectAccessError: - return RequestUtil.newAccessErrorRequest(encode); + return RequestUtil.newAccessErrorRequest(); case R.id.btnSelectAccessPermitted: - return RequestUtil.newAccessPermittedRequest(encode); + return RequestUtil.newAccessPermittedRequest(); default: - return RequestUtil.newComplexRequest(encode); + return RequestUtil.newComplexRequest(); } } @@ -153,31 +153,31 @@ public JSONObject getRequest(View v, boolean encode) { public void onClick(View v) { switch (v.getId()) { case R.id.btnSelectPost: - select(getRequest(v, true), "post"); + select(getRequest(v), "post"); break; case R.id.btnSelectPut: - select(getRequest(v, true), "put"); + select(getRequest(v), "put"); break; case R.id.btnSelectDelete: - select(getRequest(v, true), "delete"); + select(getRequest(v), "delete"); break; case R.id.btnSelectAccessError: - select(getRequest(v, true), "post_get"); + select(getRequest(v), "gets"); break; case R.id.btnSelectAccessPermitted: - select(getRequest(v, true), "post_get"); + select(getRequest(v), "gets"); break; default: - select(getRequest(v, true), "get"); + select(getRequest(v), "get"); break; } } private void select(JSONObject request, String method) { - startActivityForResult(RequestActivity.createIntent(context, id, url, method, request, true), REQUEST_TO_REQUEST); + startActivityForResult(RequestActivity.createIntent(context, id, url, method, request), REQUEST_TO_REQUEST); } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/package-info.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/package-info.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/ui/package-info.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/java/apijson/demo/ui/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-hdpi/ic_launcher.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-hdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-mdpi/ic_launcher.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-mdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-mdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-xhdpi/ic_launcher.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-xhdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-xhdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-xhdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable-xxhdpi/ic_launcher.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable/ic_launcher.png b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable/ic_launcher.png similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/drawable/ic_launcher.png rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/drawable/ic_launcher.png diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/layout/auto_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/layout/auto_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/layout/auto_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/layout/auto_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/layout/request_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/layout/request_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/layout/request_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/layout/request_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/layout/select_activity.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/layout/select_activity.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/layout/select_activity.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/layout/select_activity.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values-en/strings.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values-en/strings.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values-en/strings.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values-en/strings.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values/dimens.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values/dimens.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values/dimens.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values/dimens.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values/strings.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values/strings.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values/strings.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values/strings.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values/styles.xml b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values/styles.xml similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/res/values/styles.xml rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/main/res/values/styles.xml diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/test/java/apijson/demo/ExampleUnitTest.java b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/test/java/apijson/demo/ExampleUnitTest.java similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/test/java/apijson/demo/ExampleUnitTest.java rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/app/src/test/java/apijson/demo/ExampleUnitTest.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/build.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/build.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/build.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/build.gradle diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradle.properties b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradle.properties similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradle.properties rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradle.properties diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradle/wrapper/gradle-wrapper.jar b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradle/wrapper/gradle-wrapper.jar rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradle/wrapper/gradle-wrapper.jar diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradle/wrapper/gradle-wrapper.properties b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradle/wrapper/gradle-wrapper.properties rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradle/wrapper/gradle-wrapper.properties diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradlew b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradlew similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradlew rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradlew diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradlew.bat b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradlew.bat similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/gradlew.bat rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/gradlew.bat diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/settings.gradle b/APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/settings.gradle similarity index 100% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/settings.gradle rename to APIJSON-Android/APIJSON-AndroidStudio/APIJSONTest/settings.gradle diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/.gitignore b/APIJSON-Java-Server/APIJSON-Eclipse/.gitignore similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/.gitignore rename to APIJSON-Java-Server/APIJSON-Eclipse/.gitignore diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/.mvn/wrapper/maven-wrapper.jar b/APIJSON-Java-Server/APIJSON-Eclipse/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/.mvn/wrapper/maven-wrapper.jar rename to APIJSON-Java-Server/APIJSON-Eclipse/.mvn/wrapper/maven-wrapper.jar diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/.mvn/wrapper/maven-wrapper.properties b/APIJSON-Java-Server/APIJSON-Eclipse/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/.mvn/wrapper/maven-wrapper.properties rename to APIJSON-Java-Server/APIJSON-Eclipse/.mvn/wrapper/maven-wrapper.properties diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/.travis.yml b/APIJSON-Java-Server/APIJSON-Eclipse/.travis.yml similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/.travis.yml rename to APIJSON-Java-Server/APIJSON-Eclipse/.travis.yml diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/WebContent/META-INF/MANIFEST.MF b/APIJSON-Java-Server/APIJSON-Eclipse/WebContent/META-INF/MANIFEST.MF similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/WebContent/META-INF/MANIFEST.MF rename to APIJSON-Java-Server/APIJSON-Eclipse/WebContent/META-INF/MANIFEST.MF diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/WebContent/WEB-INF/web.xml b/APIJSON-Java-Server/APIJSON-Eclipse/WebContent/WEB-INF/web.xml similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/WebContent/WEB-INF/web.xml rename to APIJSON-Java-Server/APIJSON-Eclipse/WebContent/WEB-INF/web.xml diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/apijson.eml b/APIJSON-Java-Server/APIJSON-Eclipse/apijson.eml similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/apijson.eml rename to APIJSON-Java-Server/APIJSON-Eclipse/apijson.eml diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/apijson.userlibraries b/APIJSON-Java-Server/APIJSON-Eclipse/apijson.userlibraries similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/apijson.userlibraries rename to APIJSON-Java-Server/APIJSON-Eclipse/apijson.userlibraries diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/mvnw b/APIJSON-Java-Server/APIJSON-Eclipse/mvnw similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/mvnw rename to APIJSON-Java-Server/APIJSON-Eclipse/mvnw diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/mvnw.cmd b/APIJSON-Java-Server/APIJSON-Eclipse/mvnw.cmd similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/mvnw.cmd rename to APIJSON-Java-Server/APIJSON-Eclipse/mvnw.cmd diff --git a/APIJSON(Server)/APIJSON(Idea)/pom.xml b/APIJSON-Java-Server/APIJSON-Eclipse/pom.xml similarity index 98% rename from APIJSON(Server)/APIJSON(Idea)/pom.xml rename to APIJSON-Java-Server/APIJSON-Eclipse/pom.xml index 3e26692f0..95b801dc2 100755 --- a/APIJSON(Server)/APIJSON(Idea)/pom.xml +++ b/APIJSON-Java-Server/APIJSON-Eclipse/pom.xml @@ -8,7 +8,7 @@ 0.0.1-SNAPSHOT jar - APIJSON(Idea) + APIJSON APIJSON Server project using Spring Boot diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/APIJSONApplication.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/APIJSONApplication.java similarity index 66% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/APIJSONApplication.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/APIJSONApplication.java index 5a5a66056..522bb5fd6 100755 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/APIJSONApplication.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/APIJSONApplication.java @@ -32,19 +32,26 @@ public class APIJSONApplication { public static void main(String[] args) throws Exception { SpringApplication.run(APIJSONApplication.class, args); + System.out.println("\n\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<< APIJSON >>>>>>>>>>>>>>>>>>>>>>>>\n"); + System.out.println("开始测试:远程函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); try { Function.test(); } catch (Exception e) { e.printStackTrace(); } + System.out.println("\n完成测试:远程函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); // Structure.init(); + System.out.println("\n\n\n开始测试:请求校验 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); try { Structure.test(); } catch (Exception e) { e.printStackTrace(); } + System.out.println("\n完成测试:请求校验 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + + System.out.println("\n\n<<<<<<<<<<<<<<<<<<<<<<<<< APIJSON已启动 >>>>>>>>>>>>>>>>>>>>>>>>\n"); } @@ -57,7 +64,7 @@ public static void main(String[] args) throws Exception { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", buildConfig()); // 4 + source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } /**CORS跨域配置 @@ -65,9 +72,10 @@ public CorsFilter corsFilter() { */ private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.addAllowedOrigin("*"); - corsConfiguration.addAllowedHeader("*"); - corsConfiguration.addAllowedMethod("*"); + corsConfiguration.addAllowedOrigin("*"); //允许的域名或IP地址 + corsConfiguration.addAllowedHeader("*"); //允许的请求头 + corsConfiguration.addAllowedMethod("*"); //允许的HTTP请求方法 + corsConfiguration.setAllowCredentials(true); //允许发送跨域凭据,前端Axios存取JSESSIONID必须要 return corsConfiguration; } //支持JavaScript跨域请求 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Controller.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Controller.java new file mode 100755 index 000000000..7d5d22047 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Controller.java @@ -0,0 +1,878 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server; + +import static zuo.biao.apijson.RequestMethod.DELETE; +import static zuo.biao.apijson.RequestMethod.GET; +import static zuo.biao.apijson.RequestMethod.GETS; +import static zuo.biao.apijson.RequestMethod.HEAD; +import static zuo.biao.apijson.RequestMethod.HEADS; +import static zuo.biao.apijson.RequestMethod.POST; +import static zuo.biao.apijson.RequestMethod.PUT; + +import java.net.URLDecoder; +import java.util.Random; +import java.util.concurrent.TimeoutException; + +import javax.servlet.http.HttpSession; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; + +import apijson.demo.server.model.BaseModel; +import apijson.demo.server.model.Comment; +import apijson.demo.server.model.Moment; +import apijson.demo.server.model.Privacy; +import apijson.demo.server.model.User; +import apijson.demo.server.model.Verify; +import zuo.biao.apijson.JSON; +import zuo.biao.apijson.JSONResponse; +import zuo.biao.apijson.Log; +import zuo.biao.apijson.RequestMethod; +import zuo.biao.apijson.StringUtil; +import zuo.biao.apijson.server.JSONRequest; +import zuo.biao.apijson.server.Parser; +import zuo.biao.apijson.server.exception.ConditionErrorException; +import zuo.biao.apijson.server.exception.ConflictException; +import zuo.biao.apijson.server.exception.NotExistException; +import zuo.biao.apijson.server.exception.OutOfRangeException; + +/**request controller + *
建议全通过HTTP POST来请求: + *
1.减少代码 - 客户端无需写HTTP GET,PUT等各种方式的请求代码 + *
2.提高性能 - 无需URL encode和decode + *
3.调试方便 - 建议使用 APIJSON在线测试工具 或 Postman + * @author Lemon + */ +@RestController +@RequestMapping("") +public class Controller { + private static final String TAG = "Controller"; + + //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + /**获取 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#GET} + */ + @PostMapping(value = "get") + public String get(@RequestBody String request, HttpSession session) { + return new Parser(GET).setSession(session).parse(request); + } + + /**计数 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#HEAD} + */ + @PostMapping("head") + public String head(@RequestBody String request, HttpSession session) { + return new Parser(HEAD).setSession(session).parse(request); + } + + /**限制性GET,request和response都非明文,浏览器看不到,用于对安全性要求高的GET请求 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#GETS} + */ + @PostMapping("gets") + public String gets(@RequestBody String request, HttpSession session) { + return new Parser(GETS).setSession(session).parse(request); + } + + /**限制性HEAD,request和response都非明文,浏览器看不到,用于对安全性要求高的HEAD请求 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#HEADS} + */ + @PostMapping("heads") + public String heads(@RequestBody String request, HttpSession session) { + return new Parser(HEADS).setSession(session).parse(request); + } + + /**新增 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#POST} + */ + @PostMapping("post") + public String post(@RequestBody String request, HttpSession session) { + return new Parser(POST).setSession(session).parse(request); + } + + /**修改 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#PUT} + */ + @PostMapping("put") + public String put(@RequestBody String request, HttpSession session) { + return new Parser(PUT).setSession(session).parse(request); + } + + /**删除 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#DELETE} + */ + @PostMapping("delete") + public String delete(@RequestBody String request, HttpSession session) { + return new Parser(DELETE).setSession(session).parse(request); + } + + + + + + /**获取 + * 只为兼容HTTP GET请求,推荐用HTTP POST,可删除 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#GET} + */ + @RequestMapping("get/{request}") + public String open_get(@PathVariable String request, HttpSession session) { + try { + request = URLDecoder.decode(request, StringUtil.UTF_8); + } catch (Exception e) { + // Parser会报错 + } + return get(request, session); + } + + /**计数 + * 只为兼容HTTP GET请求,推荐用HTTP POST,可删除 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#HEAD} + */ + @RequestMapping("head/{request}") + public String open_head(@PathVariable String request, HttpSession session) { + try { + request = URLDecoder.decode(request, StringUtil.UTF_8); + } catch (Exception e) { + // Parser会报错 + } + return head(request, session); + } + + + //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + + + + + + + + public static final String USER_; + public static final String PRIVACY_; + public static final String MOMENT_; + public static final String COMMENT_; + public static final String VERIFY_; //加下划线后缀是为了避免 Verify 和 verify 都叫VERIFY,分不清 + static { + USER_ = User.class.getSimpleName(); + PRIVACY_ = Privacy.class.getSimpleName(); + MOMENT_ = Moment.class.getSimpleName(); + COMMENT_ = Comment.class.getSimpleName(); + VERIFY_ = Verify.class.getSimpleName(); + } + + public static final String VERSION = JSONRequest.KEY_VERSION; + public static final String COUNT = JSONResponse.KEY_COUNT; + public static final String TOTAL = JSONResponse.KEY_TOTAL; + + public static final String RANGE = "range"; + + public static final String ID = "id"; + public static final String USER_ID = "userId"; + public static final String CURRENT_USER_ID = "currentUserId"; + + public static final String NAME = "name"; + public static final String PHONE = "phone"; + public static final String PASSWORD = "password"; + public static final String _PASSWORD = "_password"; + public static final String _PAY_PASSWORD = "_payPassword"; + public static final String OLD_PASSWORD = "oldPassword"; + public static final String VERIFY = "verify"; + + public static final String SEX = "sex"; + public static final String TYPE = "type"; + public static final String WAY = "way"; + public static final String CONTENT = "content"; + + + + + + public static final String DATE_UP = "date+";//同 "date ASC" + public static final String DATE_DOWN = "date-";//同 "date DESC" + + public static final String ID_AT = ID + "@"; + public static final String USER_ID_AT = USER_ID + "@"; + public static final String MOMENT_ID_AT = "momentId@"; + public static final String COMMENT_ID_AT = "commentId@"; + + public static final String ID_IN = ID + "{}"; + public static final String USER_ID_IN = USER_ID + "{}"; + public static final String MOMENT_ID_IN = "momentId{}"; + public static final String COMMENT_ID_IN = "commentId{}"; + + public static final String NAME_SEARCH = NAME + "$"; + public static final String PHONE_SEARCH = PHONE + "$"; + public static final String CONTENT_SEARCH = CONTENT + "$"; + + + + public static final String COLUMNS_USER_SIMPLE = "id,name"; + public static final String COLUMNS_USER = "id,sex,name,head"; + + + + + /**生成验证码,修改为post请求 + * @param request + * @return + */ + @PostMapping("post/verify") + public JSONObject postVerify(@RequestBody String request) { + JSONObject requestObject = null; + int type; + String phone; + try { + requestObject = Parser.parseRequest(request, POST); + type = requestObject.getIntValue(TYPE); + phone = requestObject.getString(PHONE); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + new Parser(DELETE, true).parse(newVerifyRequest(type, phone, null)); + + JSONObject response = new Parser(POST, true).parseResponse( + newVerifyRequest(type, phone, "" + (new Random().nextInt(9999) + 1000))); + + JSONObject verify = null; + try { + verify = response.getJSONObject(VERIFY_); + } catch (Exception e) { + // TODO: handle exception + } + if (verify == null || JSONResponse.isSuccess(verify.getIntValue(JSONResponse.KEY_CODE)) == false) { + new Parser(DELETE, true).parseResponse(new JSONRequest(new Verify(type, phone))); + return response; + } + + //TODO 这里直接返回验证码,方便测试。实际上应该只返回成功信息,验证码通过短信发送 + JSONObject object = new JSONObject(); + object.put(TYPE, type); + object.put(PHONE, phone); + return getVerify(JSON.toJSONString(object)); + } + + /**获取验证码 + * @param request + * @return + */ + @PostMapping("gets/verify") + public JSONObject getVerify(@RequestBody String request) { + JSONObject requestObject = null; + int type; + String phone; + try { + requestObject = Parser.parseRequest(request, GETS); + type = requestObject.getIntValue(TYPE); + phone = requestObject.getString(PHONE); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + return new Parser(GETS, true).parseResponse(newVerifyRequest(type, phone, null)); + } + + /**校验验证码 + * @param request + * @return + */ + @PostMapping("heads/verify") + public JSONObject headVerify(@RequestBody String request) { + JSONObject requestObject = null; + int type; + String phone; + String verify; + try { + requestObject = Parser.parseRequest(request, HEADS); + type = requestObject.getIntValue(TYPE); + phone = requestObject.getString(PHONE); + verify = requestObject.getString(VERIFY); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + return headVerify(type, phone, verify); + } + + /**校验验证码 + * @author Lemon + * @param type + * @param phone + * @param code + * @return + */ + public JSONObject headVerify(int type, String phone, String code) { + JSONResponse response = new JSONResponse( + new Parser(GETS, true).parseResponse( + new JSONRequest( + new Verify(type, phone) + .setVerify(code) + ).setTag(VERIFY_) + ) + ); + Verify verify = response.getObject(Verify.class); + if (verify == null) { + return Parser.newErrorResult(StringUtil.isEmpty(code, true) + ? new NotExistException("验证码不存在!") : new ConditionErrorException("手机号或验证码错误!")); + } + + //验证码过期 + if (System.currentTimeMillis() > (60*1000 + BaseModel.getTimeMillis(verify.getDate()))) { + new Parser(DELETE, true).parseResponse( + new JSONRequest(new Verify(type, phone)).setTag(VERIFY_) + ); + return Parser.newErrorResult(new TimeoutException("验证码已过期!")); + } + + return new JSONResponse( + new Parser(HEADS, true).parseResponse( + new JSONRequest(new Verify(type, phone).setVerify(code)) + ) + ); + } + + + + /**新建一个验证码请求 + * @param phone + * @param verify + * @return + */ + private JSONObject newVerifyRequest(int type, String phone, String verify) { + return new JSONRequest(new Verify(type, phone).setVerify(verify)).setTag(VERIFY_); + } + + + public static final String LOGIN = "login"; + + public static final int LOGIN_TYPE_PASSWORD = 0;//密码登录 + public static final int LOGIN_TYPE_VERIFY = 1;//验证码登录 + /**用户登录 + * @param request 只用String,避免encode后未decode + * @return + * @see + *
+		{
+			"type": 0,  //登录方式,非必须  0-密码 2-验证码
+			"phone": "13000082001",
+			"password": "1234567",
+			"version": 1 //全局版本号,非必须
+		}
+	 * 
+ */ + @PostMapping("login") + public JSONObject login(@RequestBody String request, HttpSession session) { + JSONObject requestObject = null; + boolean isPassword; + String phone; + String password; + int version; + try { + requestObject = Parser.parseRequest(request, POST); + + isPassword = requestObject.getIntValue(TYPE) == LOGIN_TYPE_PASSWORD;//登录方式 + phone = requestObject.getString(PHONE);//手机 + password = requestObject.getString(PASSWORD);//密码 + + if (StringUtil.isPhone(phone) == false) { + throw new IllegalArgumentException("手机号不合法!"); + } + + if (isPassword) { + if (StringUtil.isPassword(password) == false) { + throw new IllegalArgumentException("密码不合法!"); + } + } else { + if (StringUtil.isVerify(password) == false) { + throw new IllegalArgumentException("验证码不合法!"); + } + } + + //全局版本号 + version = requestObject.getIntValue(VERSION); + requestObject.remove(VERSION); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + + + //手机号是否已注册 + JSONObject phoneResponse = new Parser(HEADS, true).parseResponse( + new JSONRequest( + new Privacy().setPhone(phone) + ) + ); + JSONResponse response = new JSONResponse(phoneResponse).getJSONResponse(PRIVACY_); + if (JSONResponse.isSuccess(response) == false) { + return response; + } + if(JSONResponse.isExist(response) == false) { + return Parser.newErrorResult(new NotExistException("手机号未注册")); + } + + //根据phone获取User + JSONObject privacyResponse = new Parser(GETS, true).parseResponse( + new JSONRequest( + new Privacy().setPhone(phone) + ) + ); + response = new JSONResponse(privacyResponse); + + Privacy privacy = response == null ? null : response.getObject(Privacy.class); + long userId = privacy == null ? 0 : BaseModel.value(privacy.getId()); + if (userId <= 0) { + return privacyResponse; + } + + //校验凭证 + if (isPassword) {//password密码登录 + response = new JSONResponse( + new Parser(HEADS, true).parseResponse( + new JSONRequest(new Privacy(userId).setPassword(password)) + ) + ); + } else {//verify手机验证码登录 + response = new JSONResponse(headVerify(Verify.TYPE_LOGIN, phone, password)); + } + if (JSONResponse.isSuccess(response) == false) { + return response; + } + response = response.getJSONResponse(isPassword ? PRIVACY_ : VERIFY_); + if (JSONResponse.isExist(response) == false) { + return Parser.newErrorResult(new ConditionErrorException("账号或密码错误")); + } + + response = new JSONResponse( + new Parser(GETS, true).parseResponse( + new JSONRequest(new User(userId)) + ) + ); + User user = response.getObject(User.class); + if (user == null || BaseModel.value(user.getId()) != userId) { + return Parser.newErrorResult(new NullPointerException("服务器内部错误")); + } + + //登录状态保存至session + session.setAttribute(USER_ID, userId);//用户id + session.setAttribute(TYPE, isPassword ? LOGIN_TYPE_PASSWORD : LOGIN_TYPE_VERIFY);//登录方式 + session.setAttribute(USER_, user);//用户 + session.setAttribute(PRIVACY_, privacy);//用户隐私信息 + session.setAttribute(VERSION, version);//用户隐私信息 + // session.setMaxInactiveInterval(1*60);//设置session过期时间 + + return response; + } + + /**退出登录,清空session + * @param session + * @return + */ + @PostMapping("logout") + public JSONObject logout(HttpSession session) { + long userId; + try { + userId = Verifier.getUserId(session);//必须在session.invalidate();前! + Log.d(TAG, "logout userId = " + userId + "; session.getId() = " + (session == null ? null : session.getId())); + session.invalidate(); + } catch (Exception e) { + return Parser.newErrorResult(e); + } + + JSONObject result = Parser.newSuccessResult(); + JSONObject user = Parser.newSuccessResult(); + user.put(ID, userId); + user.put(COUNT, 1); + result.put(USER_, user); + + return result; + } + + + private static final String REGISTER = "register"; + /**注册 + * @param request 只用String,避免encode后未decode + * @return + * @see + *
+		{
+			"Privacy": {
+				"phone": "13000082222",
+				"_password": "123456"
+			},
+			"User": {
+				"name": "APIJSONUser"
+			},
+			"verify": "1234"
+		}
+	 * 
+ */ + @PostMapping(REGISTER) + public JSONObject register(@RequestBody String request) { + JSONObject requestObject = null; + + JSONObject privacyObj; + + String phone; + String verify; + String password; + try { + requestObject = Parser.parseRequest(request, POST); + privacyObj = requestObject.getJSONObject(PRIVACY_); + + phone = StringUtil.getString(privacyObj.getString(PHONE)); + verify = requestObject.getString(VERIFY); + password = privacyObj.getString(_PASSWORD); + + if (StringUtil.isPhone(phone) == false) { + return newIllegalArgumentResult(requestObject, PRIVACY_ + "/" + PHONE); + } + if (StringUtil.isPassword(password) == false) { + return newIllegalArgumentResult(requestObject, PRIVACY_ + "/" + _PASSWORD); + } + if (StringUtil.isVerify(verify) == false) { + return newIllegalArgumentResult(requestObject, VERIFY); + } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + + JSONResponse response = new JSONResponse(headVerify(Verify.TYPE_REGISTER, phone, verify)); + if (JSONResponse.isSuccess(response) == false) { + return response; + } + //手机号或验证码错误 + if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { + return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); + } + + + + //生成User和Privacy + if (StringUtil.isEmpty(requestObject.getString(JSONRequest.KEY_TAG), true)) { + requestObject.put(JSONRequest.KEY_TAG, REGISTER); + } + response = new JSONResponse( + new Parser(POST).setNoVerifyLogin(true).parseResponse(requestObject) + ); + + //验证User和Privacy + User user = response.getObject(User.class); + long userId = user == null ? 0 : BaseModel.value(user.getId()); + Privacy privacy = response.getObject(Privacy.class); + long userId2 = privacy == null ? 0 : BaseModel.value(privacy.getId()); + Exception e = null; + if (userId <= 0 || userId != userId2) { //id不同 + e = new Exception("服务器内部错误!写入User或Privacy失败!"); + } + + if (e != null) { //出现错误,回退 + new Parser(DELETE, true).parseResponse( + new JSONRequest(new User(userId)) + ); + new Parser(DELETE, true).parseResponse( + new JSONRequest(new Privacy(userId2)) + ); + } + + return response; + } + + + /** + * @param requestObject + * @param key + * @return + */ + public static JSONObject newIllegalArgumentResult(JSONObject requestObject, String key) { + return newIllegalArgumentResult(requestObject, key, null); + } + /** + * @param requestObject + * @param key + * @param msg 详细说明 + * @return + */ + public static JSONObject newIllegalArgumentResult(JSONObject requestObject, String key, String msg) { + return Parser.extendErrorResult(requestObject + , new IllegalArgumentException(key + ":value 中value不合法!" + StringUtil.getString(msg))); + } + + + /**设置密码 + * @param request 只用String,避免encode后未decode + * @return + * @see + *
+	    使用旧密码修改
+		{
+			"oldPassword": 123456,
+			"Privacy":{
+			  "id": 13000082001,
+			  "_password": "1234567"
+			}
+		}
+		或使用手机号+验证码修改
+		{
+			"verify": "1234",
+			"Privacy":{
+			  "phone": "13000082001",
+			  "_password": "1234567"
+			}
+		}
+	 * 
+ */ + @PostMapping("put/password") + public JSONObject putPassword(@RequestBody String request){ + JSONObject requestObject = null; + String old_password; + String verify; + + int type = Verify.TYPE_PASSWORD; + + JSONObject privacyObj; + long userId; + String phone; + String password; + try { + requestObject = Parser.parseRequest(request, PUT); + old_password = StringUtil.getString(requestObject.getString(OLD_PASSWORD)); + verify = StringUtil.getString(requestObject.getString(VERIFY)); + + requestObject.remove(OLD_PASSWORD); + requestObject.remove(VERIFY); + + privacyObj = requestObject.getJSONObject(PRIVACY_); + if (privacyObj == null) { + throw new IllegalArgumentException(PRIVACY_ + " 不能为空!"); + } + userId = privacyObj.getLongValue(ID); + phone = privacyObj.getString(PHONE); + password = privacyObj.getString(_PASSWORD); + + if (StringUtil.isEmpty(password, true)) { //支付密码 + type = Verify.TYPE_PAY_PASSWORD; + password = privacyObj.getString(_PAY_PASSWORD); + if (StringUtil.isNumberPassword(password) == false) { + throw new IllegalArgumentException(PRIVACY_ + "/" + _PAY_PASSWORD + ":value 中value不合法!"); + } + } else { //登录密码 + if (StringUtil.isPassword(password) == false) { + throw new IllegalArgumentException(PRIVACY_ + "/" + _PASSWORD + ":value 中value不合法!"); + } + } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + + if (StringUtil.isPassword(old_password)) { + if (userId <= 0) { //手机号+验证码不需要userId + return Parser.extendErrorResult(requestObject, new IllegalArgumentException(ID + ":value 中value不合法!")); + } + if (old_password.equals(password)) { + return Parser.extendErrorResult(requestObject, new ConflictException("新旧密码不能一样!")); + } + + //验证旧密码 + Privacy privacy = new Privacy(userId); + if (type == Verify.TYPE_PASSWORD) { + privacy.setPassword(old_password); + } else { + privacy.setPayPassword(old_password); + } + JSONResponse response = new JSONResponse( + new Parser(HEAD, true).parseResponse( + new JSONRequest(privacy) + ) + ); + if (JSONResponse.isExist(response.getJSONResponse(PRIVACY_)) == false) { + return Parser.extendErrorResult(requestObject, new ConditionErrorException("账号或原密码错误,请重新输入!")); + } + } + else if (StringUtil.isPhone(phone) && StringUtil.isVerify(verify)) { + JSONResponse response = new JSONResponse(headVerify(type, phone, verify)); + if (JSONResponse.isSuccess(response) == false) { + return response; + } + if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { + return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); + } + response = new JSONResponse( + new Parser(GET, true).parseResponse( + new JSONRequest( + new Privacy().setPhone(phone) + ) + ) + ); + Privacy privacy = response.getObject(Privacy.class); + long id = privacy == null ? 0 : BaseModel.value(privacy.getId()); + privacyObj.remove(PHONE); + privacyObj.put(ID, id); + + requestObject.put(PRIVACY_, privacyObj); + } else { + return Parser.extendErrorResult(requestObject, new IllegalArgumentException("请输入合法的 旧密码 或 手机号+验证码 !")); + } + //TODO 上线版加上 password = MD5Util.MD5(password); + + + // requestObject.put(JSONRequest.KEY_TAG, "Password"); + //修改密码 + return new Parser(PUT, true).parseResponse(requestObject); + } + + + + /**充值/提现 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see + *
+		{
+			"Privacy": {
+				"id": 82001,
+				"balance+": 100,
+				"_payPassword": "123456"
+			}
+		}
+	 * 
+ */ + @PostMapping("put/balance") + public JSONObject putBalance(@RequestBody String request, HttpSession session) { + JSONObject requestObject = null; + JSONObject privacyObj; + long userId; + String payPassword; + double change; + try { + Verifier.verifyLogin(session); + requestObject = Parser.getCorrectRequest(PUT, Parser.parseRequest(request, PUT)); + + privacyObj = requestObject.getJSONObject(PRIVACY_); + if (privacyObj == null) { + throw new NullPointerException("请设置 " + PRIVACY_ + "!"); + } + userId = privacyObj.getLongValue(ID); + payPassword = privacyObj.getString(_PAY_PASSWORD); + change = privacyObj.getDoubleValue("balance+"); + + if (userId <= 0) { + throw new IllegalArgumentException(PRIVACY_ + "." + ID + ":value 中value不合法!"); + } + if (StringUtil.isPassword(payPassword) == false) { + throw new IllegalArgumentException(PRIVACY_ + "." + _PAY_PASSWORD + ":value 中value不合法!"); + } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + //验证密码<<<<<<<<<<<<<<<<<<<<<<< + + privacyObj.remove("balance+"); + JSONResponse response = new JSONResponse( + new Parser(HEADS, true).setSession(session).parseResponse( + new JSONRequest(PRIVACY_, privacyObj) + ) + ); + response = response.getJSONResponse(PRIVACY_); + if (JSONResponse.isExist(response) == false) { + return Parser.extendErrorResult(requestObject, new ConditionErrorException("支付密码错误!")); + } + + //验证密码>>>>>>>>>>>>>>>>>>>>>>>> + + + //验证金额范围<<<<<<<<<<<<<<<<<<<<<<< + + if (change == 0) { + return Parser.extendErrorResult(requestObject, new OutOfRangeException("balance+的值不能为0!")); + } + if (Math.abs(change) > 10000) { + return Parser.extendErrorResult(requestObject, new OutOfRangeException("单次 充值/提现 的金额不能超过10000元!")); + } + + //验证金额范围>>>>>>>>>>>>>>>>>>>>>>>> + + if (change < 0) {//提现 + response = new JSONResponse( + new Parser(GETS, true).parseResponse( + new JSONRequest( + new Privacy(userId) + ) + ) + ); + Privacy privacy = response == null ? null : response.getObject(Privacy.class); + long id = privacy == null ? 0 : BaseModel.value(privacy.getId()); + if (id != userId) { + return Parser.extendErrorResult(requestObject, new Exception("服务器内部错误!")); + } + + if (BaseModel.value(privacy.getBalance()) < -change) { + return Parser.extendErrorResult(requestObject, new OutOfRangeException("余额不足!")); + } + } + + + privacyObj.remove(_PAY_PASSWORD); + privacyObj.put("balance+", change); + requestObject.put(PRIVACY_, privacyObj); + requestObject.put(JSONRequest.KEY_TAG, PRIVACY_); + //不免验证,里面会验证身份 + return new Parser(PUT).setSession(session).parseResponse(requestObject); + } + + +} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/Function.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Function.java similarity index 91% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/Function.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Function.java index 2abccfc52..2995482cf 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/Function.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Function.java @@ -60,12 +60,12 @@ public static void test() throws Exception { jsonMap.put("map", map); - Log.i(TAG, "plus = " + invoke(jsonMap, "plus(long:i0,long:i1)")); - Log.i(TAG, "count = " + invoke(jsonMap, "count(Collection:collection)")); - Log.i(TAG, "isContain = " + invoke(jsonMap, "isContain(Collection:collection,Object:id)")); - Log.i(TAG, "get(Map:map,key) = " + invoke(jsonMap, "get(Map:map,key)")); - Log.i(TAG, "get(Collection:collection,int:@position) = " + invoke(jsonMap, "get(Collection:collection,int:@position)")); - Log.i(TAG, "Integer:get(Map:map,key) = " + invoke(jsonMap, "Integer:get(Map:map,key)")); + Log.i(TAG, "plus(1, -2) = " + invoke(jsonMap, "plus(long:i0,long:i1)")); + Log.i(TAG, "count([1,2,4,10]) = " + invoke(jsonMap, "count(Collection:collection)")); + Log.i(TAG, "isContain([1,2,4,10], 10) = " + invoke(jsonMap, "isContain(Collection:collection,Object:id)")); + Log.i(TAG, "get({key:true}, key) = " + invoke(jsonMap, "get(Map:map,key)")); + Log.i(TAG, "get([1,2,4,10], 0) = " + invoke(jsonMap, "get(Collection:collection,int:@position)")); + Log.i(TAG, "Integer:get({key:true}, key) = " + invoke(jsonMap, "Integer:get(Map:map,key)")); } /**反射调用 @@ -126,10 +126,6 @@ public long plus(long i0, long i1) { return i0 + i1; } - public JSONObject newVerify(String phone) { - return new Controller().postVerify(phone); - } - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**判断collection是否为空 diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/FunctionList.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/FunctionList.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/FunctionList.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/FunctionList.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/AccessVerifier.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Verifier.java similarity index 65% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/AccessVerifier.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Verifier.java index 8026da8f3..2cdc02754 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/AccessVerifier.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/Verifier.java @@ -14,6 +14,14 @@ package apijson.demo.server; +import static zuo.biao.apijson.RequestMethod.DELETE; +import static zuo.biao.apijson.RequestMethod.GET; +import static zuo.biao.apijson.RequestMethod.HEAD; +import static zuo.biao.apijson.RequestMethod.POST; +import static zuo.biao.apijson.RequestMethod.GETS; +import static zuo.biao.apijson.RequestMethod.HEADS; +import static zuo.biao.apijson.RequestMethod.PUT; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -29,46 +37,57 @@ import apijson.demo.server.model.Comment; import apijson.demo.server.model.Login; import apijson.demo.server.model.Moment; -import apijson.demo.server.model.Password; +import apijson.demo.server.model.Privacy; import apijson.demo.server.model.User; -import apijson.demo.server.model.UserPrivacy; import apijson.demo.server.model.Verify; -import apijson.demo.server.model.Wallet; import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONRequest; +import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.MethodAccess; import zuo.biao.apijson.RequestMethod; import zuo.biao.apijson.RequestRole; +import zuo.biao.apijson.model.Column; +import zuo.biao.apijson.model.Request; +import zuo.biao.apijson.model.Response; +import zuo.biao.apijson.model.Table; +import zuo.biao.apijson.model.Test; +import zuo.biao.apijson.server.JSONRequest; +import zuo.biao.apijson.server.Parser; +import zuo.biao.apijson.server.exception.ConflictException; import zuo.biao.apijson.server.exception.NotLoggedInException; import zuo.biao.apijson.server.sql.SQLConfig; /**权限验证类 * @author Lemon */ -public class AccessVerifier { - private static final String TAG = "AccessVerifier"; +public class Verifier { + private static final String TAG = "Verifier"; public static final String KEY_PASSWORD = "password"; public static final String KEY_LOGIN_PASSWORD = "loginPassword"; public static final String KEY_PAY_PASSWORD = "payPassword"; + public static final String KEY_OLD_PASSWORD = "oldPassword"; // > // > - public static final Map> accessMap; + public static final Map> ACCESS_MAP; static { - accessMap = new HashMap>(); - - accessMap.put(User.class.getSimpleName(), getAccessMap(User.class.getAnnotation(MethodAccess.class))); - accessMap.put(UserPrivacy.class.getSimpleName(), getAccessMap(UserPrivacy.class.getAnnotation(MethodAccess.class))); - accessMap.put(Moment.class.getSimpleName(), getAccessMap(Moment.class.getAnnotation(MethodAccess.class))); - accessMap.put(Comment.class.getSimpleName(), getAccessMap(Comment.class.getAnnotation(MethodAccess.class))); - accessMap.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class))); - accessMap.put(Login.class.getSimpleName(), getAccessMap(Login.class.getAnnotation(MethodAccess.class))); - accessMap.put(Password.class.getSimpleName(), getAccessMap(Password.class.getAnnotation(MethodAccess.class))); - accessMap.put(Wallet.class.getSimpleName(), getAccessMap(Wallet.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP = new HashMap>(); + + ACCESS_MAP.put(Table.class.getSimpleName(), getAccessMap(Table.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Column.class.getSimpleName(), getAccessMap(Column.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Test.class.getSimpleName(), getAccessMap(Test.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Request.class.getSimpleName(), getAccessMap(Request.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Response.class.getSimpleName(), getAccessMap(Response.class.getAnnotation(MethodAccess.class))); + + ACCESS_MAP.put(User.class.getSimpleName(), getAccessMap(User.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Privacy.class.getSimpleName(), getAccessMap(Privacy.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Moment.class.getSimpleName(), getAccessMap(Moment.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Comment.class.getSimpleName(), getAccessMap(Comment.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Login.class.getSimpleName(), getAccessMap(Login.class.getAnnotation(MethodAccess.class))); } /**获取权限Map,每种操作都只允许对应的角色 @@ -81,13 +100,13 @@ private static HashMap getAccessMap(MethodAccess a } HashMap map = new HashMap<>(); - map.put(RequestMethod.GET, access.GET()); - map.put(RequestMethod.HEAD, access.HEAD()); - map.put(RequestMethod.POST_GET, access.POST_GET()); - map.put(RequestMethod.POST_HEAD, access.POST_HEAD()); - map.put(RequestMethod.POST, access.POST()); - map.put(RequestMethod.PUT, access.PUT()); - map.put(RequestMethod.DELETE, access.DELETE()); + map.put(GET, access.GET()); + map.put(HEAD, access.HEAD()); + map.put(GETS, access.GETS()); + map.put(HEADS, access.HEADS()); + map.put(POST, access.POST()); + map.put(PUT, access.PUT()); + map.put(DELETE, access.DELETE()); return map; } @@ -119,7 +138,7 @@ public static boolean verify(SQLConfig config, User visitor) throws Exception { //验证角色,假定真实强制匹配<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - String userIdkey = Controller.USER_.equals(config.getTable()) || Controller.USER_PRIVACY_.equals(config.getTable()) + String userIdkey = Controller.USER_.equals(config.getTable()) || Controller.PRIVACY_.equals(config.getTable()) ? Controller.ID : Controller.USER_ID; if (role == null) { @@ -161,7 +180,7 @@ public static boolean verify(SQLConfig config, User visitor) throws Exception { } if (list.contains(new Long("" + id)) == false) {//Integer等转为Long才能正确判断。强转崩溃 if (method == null) { - method = RequestMethod.GET; + method = GET; } throw new IllegalAccessException(userIdkey + " = " + id + " 的 " + table + " 不允许 " + role.name() + " 用户的 " + method.name() + " 请求!"); @@ -197,12 +216,12 @@ public static void verifyRole(String table, RequestMethod method, RequestRole ro Log.d(TAG, "verifyRole table = " + table + "; method = " + method + "; role = " + role); if (table != null) { if (method == null) { - method = RequestMethod.GET; + method = GET; } if (role == null) { role = RequestRole.UNKNOWN; } - Map map = accessMap.get(table); + Map map = ACCESS_MAP.get(table); if (map == null || BaseModel.isContain(map.get(method), role) == false) { throw new IllegalAccessException(table + " 不允许 " + role.name() + " 用户的 " + method.name() + " 请求!"); @@ -218,6 +237,7 @@ public static void verifyRole(String table, RequestMethod method, RequestRole ro * @throws Exception */ public static void verifyLogin(HttpSession session) throws Exception { + Log.d(TAG, "verifyLogin session.getId() = " + (session == null ? null : session.getId())); verifyLogin(getUserId(session)); } /**登录校验 @@ -231,6 +251,50 @@ public static void verifyLogin(Long userId) throws Exception { throw new NotLoggedInException("未登录,请登录后再操作!"); } } + + + + /**验证是否重复 + * @param table + * @param key + * @param value + * @throws Exception + */ + public static void verifyRepeat(String table, String key, Object value) throws Exception { + verifyRepeat(table, key, value, 0); + } + /**验证是否重复 + * @param table + * @param key + * @param value + * @param exceptId 不包含id + * @throws Exception + */ + public static void verifyRepeat(String table, String key, Object value, long exceptId) throws Exception { + if (key == null || value == null) { + Log.e(TAG, "verifyRepeat key == null || value == null >> return;"); + return; + } + if (value instanceof JSON) { + throw new UnsupportedDataTypeException(key + ":value 中value的类型不能为JSON!"); + } + + JSONRequest request = new JSONRequest(key, value); + if (exceptId > 0) {//允许修改自己的属性为该属性原来的值 + request.put(JSONRequest.KEY_ID + "!", exceptId); + } + JSONObject repeat = new Parser(HEAD, true).parseResponse( + new JSONRequest(table, request) + ); + repeat = repeat == null ? null : repeat.getJSONObject(table); + if (repeat == null) { + throw new Exception("服务器内部错误 verifyRepeat repeat == null"); + } + if (repeat.getIntValue(JSONResponse.KEY_COUNT) > 0) { + throw new ConflictException(key + ": " + value + " 已经存在,不能重复!"); + } + } + /**获取来访用户的id * @author Lemon @@ -267,6 +331,7 @@ public static JSONObject removeAccessInfo(JSONObject requestObject) { requestObject.remove(KEY_PASSWORD); requestObject.remove(KEY_LOGIN_PASSWORD); requestObject.remove(KEY_PAY_PASSWORD); + requestObject.remove(KEY_OLD_PASSWORD); } return requestObject; } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/BaseModel.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/BaseModel.java similarity index 60% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/BaseModel.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/BaseModel.java index fd6eb9c21..8dec7d729 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/BaseModel.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/BaseModel.java @@ -12,21 +12,29 @@ See the License for the specific language governing permissions and limitations under the License.*/ -package zuo.biao.apijson; +package apijson.demo.server.model; import java.io.Serializable; +import java.sql.Timestamp; +import java.util.Arrays; import java.util.Collection; +import java.util.Date; import java.util.Map; +import com.alibaba.fastjson.JSON; + +import zuo.biao.apijson.StringUtil; + /**base model for reduce model codes * @author Lemon * @use extends BaseModel */ -@SuppressWarnings("serial") public abstract class BaseModel implements Serializable { - - private Long id; - private Long date; + private static final long serialVersionUID = 1L; + + private Long id; //主键,唯一标识 + private Long userId; //对应User表中的id,外键 + private String date; //创建时间,JSON没有Date,TimeStamp类型,都会被转成Long,不能用! public Long getId() { return id; @@ -35,15 +43,58 @@ public BaseModel setId(Long id) { this.id = id; return this; } - public Long getDate() { + public Long getUserId() { + return userId; + } + public BaseModel setUserId(Long userId) { + this.userId = userId; + return this; + } + public String getDate() { return date; } - public BaseModel setDate(Long date) { + public BaseModel setDate(String date) { this.date = date; return this; } - + + + @Override + public String toString() { + return JSON.toJSONString(this); + } + + + /**获取当前时间戳 + * @return + */ + public static Timestamp currentTimeStamp() { + return new Timestamp(new Date().getTime()); + } + /**获取时间戳 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static Timestamp getTimeStamp(String time) { + return Timestamp.valueOf(time); + } + /**获取时间毫秒值 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static long getTimeMillis(String time) { + return StringUtil.isEmpty(time, true) ? 0 : getTimeStamp(time).getTime(); + } + + //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**判断array是否为空 + * @param array + * @return + */ + public static boolean isEmpty(T[] array) { + return array == null || array.length <= 0; + } /**判断collection是否为空 * @param collection * @return @@ -63,6 +114,14 @@ public static boolean isEmpty(Map map) { //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> //判断是否包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**判断array是否包含a + * @param array + * @param a + * @return + */ + public static boolean isContain(T[] array, T a) { + return array == null ? false : Arrays.asList(array).contains(a); + } /**判断collection是否包含object * @param collection * @param object @@ -139,7 +198,7 @@ public static T get(T[] array, int position) { */ @SuppressWarnings("unchecked") public static T get(Collection collection, int position) { - return (T) (collection == null ? null : get(collection.toArray(), position)); + return collection == null ? null : (T) get(collection.toArray(), position); } /**获取 * @param @@ -193,4 +252,53 @@ public static double value(Double value) { } //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + /**index是否在arr长度范围内 + * @param index + * @param array + * @return + */ + public static boolean isIndexInRange(Integer index, Object[] array) { + return index != null && index >= 0 && index < count(array); + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param index + * @param array + * @return + */ + public static int getIndexInRange(Integer index, Object[] array) { + return getIndexInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static int getIndexInRange(Integer index, Object[] array, int defaultIndex) { + return isIndexInRange(index, array) ? index : defaultIndex; + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param + * @param index + * @param array + * @return + */ + public static T getInRange(Integer index, T[] array) { + return getInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static T getInRange(Integer index, T[] array, int defaultIndex) { + return get(array, getIndexInRange(index, array, defaultIndex)); + } + } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/client/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Comment.java similarity index 73% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/client/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Comment.java index 84599fa4a..5bbdb50fc 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/client/package-info.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Comment.java @@ -1,4 +1,4 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,11 +12,13 @@ See the License for the specific language governing permissions and limitations under the License.*/ -/** - * files for client projects - */ -/** +package apijson.demo.server.model; + +import zuo.biao.apijson.MethodAccess; + +/**评论类 * @author Lemon - * */ -package zuo.biao.apijson.client; \ No newline at end of file +@MethodAccess +public class Comment { +} \ No newline at end of file diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Login.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Login.java similarity index 62% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Login.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Login.java index b123f241e..6a0973bf0 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/Login.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Login.java @@ -22,52 +22,24 @@ import zuo.biao.apijson.MethodAccess; -/**登录类,已用session替代 +/**登录日志表 * @author Lemon - * @see - *
POST_HEAD:
-{
- "Login":{
-     "disallow":"!",
-     "necessary":"userId,type"
- }
-}
- * 
-*
POST:login
-{
-    "Login":{
-        "necessary":"phone"
-    },
-    "Password":{
-        "disallow":"!",
-        "necessary":"password"
-    }
-}
- * 
-*
POST:login
-{
-    "Login":{
-        "disallow":"!",
-        "necessary":"userId"
-    }
-}
- * 
*/ -@Deprecated @SuppressWarnings("serial") @MethodAccess( - POST_GET = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, - POST_HEAD = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, - POST = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, - PUT = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, - DELETE = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN} + GET = {}, + HEAD = {}, + GETS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, + HEADS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, + POST = {ADMIN}, + PUT = {ADMIN}, + DELETE = {ADMIN} ) public class Login extends BaseModel { public static final int TYPE_PASSWORD = 0;//密码登录 public static final int TYPE_VERIFY = 1;//验证码登录 - private Long userId; private Integer type; public Login() { @@ -78,13 +50,6 @@ public Login(long userId) { setUserId(userId); } - public Long getUserId() { - return userId; - } - public Login setUserId(Long userId) { - this.userId = userId; - return this; - } public Integer getType() { return type; diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Moment.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Moment.java new file mode 100644 index 000000000..8fc89e5ed --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Moment.java @@ -0,0 +1,32 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CIRCLE; +import static zuo.biao.apijson.RequestRole.CONTACT; +import static zuo.biao.apijson.RequestRole.LOGIN; +import static zuo.biao.apijson.RequestRole.OWNER; + +import zuo.biao.apijson.MethodAccess; + +/**动态类 + * @author Lemon + */ +@MethodAccess( + PUT = {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}//TODO 还要细分,LOGIN,CONTACT只允许修改praiseUserIdList。数据库加role没用,应该将praiseUserIdList移到Praise表 + ) +public class Moment { +} \ No newline at end of file diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Privacy.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Privacy.java new file mode 100644 index 000000000..48516110e --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Privacy.java @@ -0,0 +1,99 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CIRCLE; +import static zuo.biao.apijson.RequestRole.OWNER; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import zuo.biao.apijson.MethodAccess; + +/**用户隐私信息 + * @author Lemon + */ +@MethodAccess( + GET = {}, + GETS = {CIRCLE, OWNER, ADMIN}, + POST = {UNKNOWN, ADMIN}, + DELETE = {ADMIN} + ) +public class Privacy extends BaseModel { + private static final long serialVersionUID = 1L; + + public static final int PASSWORD_TYPE_LOGIN = 0; + public static final int PASSWORD_TYPE_PAY = 1; + + private String phone; //手机 + private String password; //登录密码,隐藏字段 + private String payPassword; //支付密码,隐藏字段 + private Double balance; //余额 + + public Privacy() { + super(); + } + + public Privacy(long id) { + this(); + setId(id); + } + + public Privacy(String phone, String password) { + this(); + setPhone(phone); + setPassword(password); + } + + + + public String getPhone() { + return phone; + } + public Privacy setPhone(String phone) { + this.phone = phone; + return this; + } + + /**get_password会转为password + * @return + */ + public String get__password() { + return password; + } + public Privacy setPassword(String password) { + this.password = password; + return this; + } + + /**get_PayPassword会转为PayPassword + * @return + */ + public String get__payPassword() { + return payPassword; + } + public Privacy setPayPassword(String payPassword) { + this.payPassword = payPassword; + return this; + } + + public Double getBalance() { + return balance; + } + public Privacy setBalance(Double balance) { + this.balance = balance; + return this; + } + +} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/User.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/User.java similarity index 60% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/User.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/User.java index b8e7d6a63..75f0c7682 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/app/src/main/java/apijson/demo/model/User.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/User.java @@ -1,4 +1,4 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,24 +12,25 @@ See the License for the specific language governing permissions and limitations under the License.*/ -package apijson.demo.model; +package apijson.demo.server.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.UNKNOWN; import java.util.List; -import zuo.biao.apijson.APIJSONRequest; -import zuo.biao.apijson.RequestMethod; +import zuo.biao.apijson.MethodAccess; /**用户类 * @author Lemon */ -@APIJSONRequest( - method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.PUT, RequestMethod.DELETE}, - PUT = "{disallowColumns:phone, necessaryColumns:id}", - DELETE = "{necessaryColumns:id}" +@MethodAccess( + POST = {UNKNOWN, ADMIN}, + DELETE = {ADMIN} ) public class User extends BaseModel { - private static final long serialVersionUID = -1635551656020732611L; - + private static final long serialVersionUID = 1L; + public static final int SEX_MAIL = 0; public static final int SEX_FEMALE = 1; public static final int SEX_UNKNOWN = 2; @@ -38,12 +39,9 @@ public class User extends BaseModel { private Integer sex; //性别 private String head; //头像url private String name; //姓名 - private String phone; //手机 - private String picture; //照片列表 - private List pictureList; //照片列表 private String tag; //标签 - private Integer starred; //星标 - private List friendIdList; //照片列表 + private List pictureList; //照片列表 + private List contactIdList; //朋友列表 /**默认构造方法,JSON等解析时必须要有 */ @@ -76,20 +74,6 @@ public User setName(String name) { this.name = name; return this; } - public String getPhone() { - return phone; - } - public User setPhone(String phone) { - this.phone = phone; - return this; - } - public String getPicture() { - return picture; - } - public User setPicture(String picture) { - this.picture = picture; - return this; - } public List getPictureList() { return pictureList; } @@ -105,19 +89,12 @@ public User setTag(String tag) { this.tag = tag; return this; } - public Integer getStarred() { - return starred; - } - public User setStarred(Integer starred) { - this.starred = starred; - return this; - } - public List getFriendIdList() { - return friendIdList; + public List getContactIdList() { + return contactIdList; } - public User setFriendIdList(List friendIdList) { - this.friendIdList = friendIdList; + public User setContactIdList(List contactIdList) { + this.contactIdList = contactIdList; return this; } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Verify.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Verify.java similarity index 61% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Verify.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Verify.java index 7bc8be59b..b88cd2a98 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/Verify.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/Verify.java @@ -22,32 +22,15 @@ import static zuo.biao.apijson.RequestRole.UNKNOWN; import zuo.biao.apijson.MethodAccess; -import zuo.biao.apijson.StringUtil; -/**验证码类 +/**验证码 * @author Lemon - * @see - *
POST_GET:post_get/authCode
-{
-    "Verify":{
-        "disallow":"id"
-    }
-}
- * 
- *
POST:post/authCode
-{
-    "Verify":{
-        "disallow":"!",
-        "necessary":"id"
-    }
-}
- * 
*/ @MethodAccess( GET = {}, HEAD = {}, - POST_GET = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, - POST_HEAD = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + GETS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + HEADS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, POST = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, PUT = {ADMIN}, DELETE = {ADMIN} @@ -55,42 +38,51 @@ public class Verify extends BaseModel { private static final long serialVersionUID = 1L; - private String verify; + public static final int TYPE_LOGIN = 0; //登录 + public static final int TYPE_REGISTER = 1; //注册 + public static final int TYPE_PASSWORD = 2; //登录密码 + public static final int TYPE_PAY_PASSWORD = 3; //支付密码 + + private String phone; //手机 + private String verify; //验证码 + private Integer type; //验证类型 public Verify() { super(); } - public Verify(String phone) { + /**type和phone为联合主键,必传 + * @param type + * @param phone + */ + public Verify(int type, String phone) { this(); + setType(type); setPhone(phone); } - public Verify(Long phone) { - this(); - setId(phone); - } - public Verify(Long phone, Integer verify) { - this(phone); - setVerify(verify == null ? null : ("" + verify)); - } - public Verify(String phone, String verify) { - this(phone); - setVerify(verify); - } public String getVerify() { return verify; } - public void setVerify(String verify) { + public Verify setVerify(String verify) { this.verify = verify; + return this; } - //phone is not column - // public String getPhone() { - // return StringUtil.getString(getId()); - // } + public String getPhone() { + return phone; + } public Verify setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); + this.phone = phone; return this; } + + public Integer getType() { + return type; + } + public Verify setType(Integer type) { + this.type = type; + return this; + } + } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/model/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/model/package-info.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/apijson/demo/server/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/apijson/demo/server/package-info.java diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSON.java old mode 100644 new mode 100755 similarity index 82% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSON.java index e52532d6a..7bd24b97d --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/JSON.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSON.java @@ -60,21 +60,24 @@ public static String getCorrectJson(String s) { public static String getCorrectJson(String s, boolean isArray) { s = StringUtil.getTrimedString(s); // if (isArray) { - // if (s.startsWith("\"")) { + // while (s.startsWith("\"")) { // s = s.substring(1); // } - // if (s.endsWith("\"")) { + // while (s.endsWith("\"")) { // s = s.substring(0, s.length() - 1); // } // } return s;//isJsonCorrect(s) ? s : null; } - /**json转JSONObject + /**obj转JSONObject * @param json * @return */ public static JSONObject parseObject(Object obj) { + if (obj instanceof JSONObject) { + return (JSONObject) obj; + } return parseObject(toJSONString(obj)); } /**json转JSONObject @@ -114,16 +117,37 @@ public static T parseObject(JSONObject object, Class clazz) { * @return */ public static T parseObject(String json, Class clazz) { - try { - int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; - features |= Feature.OrderedField.getMask(); - return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); - } catch (Exception e) { - Log.i(TAG, "parseObject catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseObject clazz == null >> return null;"); + } else { + try { + int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; + features |= Feature.OrderedField.getMask(); + return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); + } catch (Exception e) { + Log.i(TAG, "parseObject catch \n" + e.getMessage()); + } } return null; } + /**list转JSONArray + * @param list + * @return + */ + public static JSONArray parseArray(List list) { + return new JSONArray(list); + } + /**obj转JSONArray + * @param json + * @return + */ + public static JSONArray parseArray(Object obj) { + if (obj instanceof JSONArray) { + return (JSONArray) obj; + } + return parseArray(toJSONString(obj)); + } /**json转JSONArray * @param json * @return @@ -150,10 +174,14 @@ public static List parseArray(JSONArray array, Class clazz) { * @return */ public static List parseArray(String json, Class clazz) { - try { - return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); - } catch (Exception e) { - Log.i(TAG, "parseArray catch \n" + e.getMessage()); + if (clazz == null) { + Log.e(TAG, "parseArray clazz == null >> return null;"); + } else { + try { + return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); + } catch (Exception e) { + Log.i(TAG, "parseArray catch \n" + e.getMessage()); + } } return null; } diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONObject.java new file mode 100644 index 000000000..3c9e0d1cf --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONObject.java @@ -0,0 +1,374 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Map; + +/**use this class instead of com.alibaba.fastjson.JSONObject + * @author Lemon + * @see #put + * @see #puts + * @see #putsAll + */ +public class JSONObject extends com.alibaba.fastjson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONObject"; + + + /**ordered + */ + public JSONObject() { + super(true); + } + /**transfer Object to JSONObject + * @param object + * @see {@link #JSONObject(Object, boolean)} + */ + public JSONObject(Object object) { + this(toJSONString(object)); + } + /**parse JSONObject with JSON String + * @param json + * @see {@link #JSONObject(String, boolean)} + */ + public JSONObject(String json) { + this(parseObject(json)); + } + /**transfer com.alibaba.fastjson.JSONObject to JSONObject + * @param object + * @see {@link #putsAll(com.alibaba.fastjson.JSONObject)} + */ + public JSONObject(com.alibaba.fastjson.JSONObject object) { + this(); + putsAll(object); + } + + + + + //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ARRAY = "[]"; + + /**判断是否为Array的key + * @param key + * @return + */ + public static boolean isArrayKey(String key) { + return key != null && key.endsWith(KEY_ARRAY); + } + /**判断是否为对应Table的key + * @param key + * @return + */ + public static boolean isTableKey(String key) { + return StringUtil.isBigName(key); + } + //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + + /**set "id":id in Table layer + * @param id + * @return + */ + public JSONObject setId(Long id) { + return puts(KEY_ID, id); + } + /**set id{}:[] in Table layer + * @param list + * @return + */ + public JSONObject setIdIn(List list) { + return puts(KEY_ID_IN, list); + } + + + //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ROLE = "@role"; //角色,拥有对某些数据的某些操作的权限 + public static final String KEY_CONDITION = "@condition"; //条件 TODO 用 @where& @where| @where! 替代? + public static final String KEY_TRY = "@try"; //尝试,忽略异常 + public static final String KEY_DROP = "@drop"; //丢弃,不返回 + public static final String KEY_CORRECT = "@correct"; //字段校正 + + public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明 + public static final String KEY_ABOUT = "@about"; //关于,返回数据库表的信息,包括表说明和字段说明 + public static final String KEY_COLUMN = "@column"; //查询的Table字段或SQL函数 + public static final String KEY_GROUP = "@group"; //分组方式 + public static final String KEY_HAVING = "@having"; //聚合函数条件,一般和@group一起用 + public static final String KEY_ORDER = "@order"; //排序方式 + //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> + + + /**set role of request sender + * @param role + * @return this + */ + public JSONObject setRole(String role) { + return puts(KEY_ROLE, role); + } + + /**set try, ignore exceptions + * @param tri + * @return this + */ + public JSONObject setTry(boolean tri) { + return puts(KEY_TRY, tri); + } + + /**set drop, data dropped will not return + * @param drop + * @return this + */ + public JSONObject setDrop(boolean drop) { + return puts(KEY_DROP, drop); + } + + /**set correct, correct keys to target ones + * @param correct Map{originKey, [posibleKeys]}, posibleKey之间用 , 隔开 + * @return this + */ + public JSONObject setCorrect(Map correct) { + return puts(KEY_CORRECT, correct); + } + + + + /**set schema where table was puts + * @param schema + * @return this + */ + public JSONObject setSchema(String schema) { + return puts(KEY_SCHEMA, schema); + } + + /**set about + * @param about + * @return this + */ + public JSONObject setAbout(boolean about) { + return puts(KEY_ABOUT, about); + } + + /**set keys need to be returned + * @param keys key0, key1, key2 ... + * @return {@link #setColumn(String)} + */ + public JSONObject setColumn(String... keys) { + return setColumn(StringUtil.getString(keys, true)); + } + /**set keys need to be returned + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setColumn(String keys) { + return puts(KEY_COLUMN, keys); + } + + /**set keys for group by + * @param keys key0, key1, key2 ... + * @return {@link #setGroup(String)} + */ + public JSONObject setGroup(String... keys) { + return setGroup(StringUtil.getString(keys, true)); + } + /**set keys for group by + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setGroup(String keys) { + return puts(KEY_GROUP, keys); + } + + /**set keys for having + * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... + * @return {@link #setHaving(String)} + */ + public JSONObject setHaving(String... keys) { + return setHaving(StringUtil.getString(keys, true)); + } + /**set keys for having + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setHaving(String keys) { + return puts(KEY_HAVING, keys); + } + + /**set keys for order by + * @param keys key0, key1+, key2- ... + * @return {@link #setOrder(String)} + */ + public JSONObject setOrder(String... keys) { + return setOrder(StringUtil.getString(keys, true)); + } + /**set keys for order by + * @param keys "key0,key1+,key2-..." + * @return + */ + public JSONObject setOrder(String keys) { + return puts(KEY_ORDER, keys); + } + + + //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //Request <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + /** + * @param key + * @param keys path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsPath(String key, String... keys) { + return puts(key+"@", StringUtil.getString(keys, "/")); + } + + /** + * @param key + * @param isNull + * @return {@link #puts(String, Object)} + */ + public JSONObject putsNull(String key, boolean isNull) { + return puts(key+"{}", SQL.isNull(isNull)); + } + /** + * trim = false + * @param key + * @param isEmpty + * @return {@link #putsEmpty(String, boolean, boolean)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty) { + return putsEmpty(key, isEmpty, false); + } + /** + * @param key + * @param isEmpty + * @return {@link #puts(String, Object)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty, boolean trim) { + return puts(key+"{}", SQL.isEmpty(key, isEmpty, trim)); + } + /** + * @param key + * @param compare <=0, >5 ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsLength(String key, String compare) { + return puts(key+"{}", SQL.length(key) + compare); + } + + /**设置搜索 + * type = SEARCH_TYPE_CONTAIN_FULL + * @param key + * @param value + * @return {@link #putsSearch(String, String, int)} + */ + public JSONObject putsSearch(String key, String value) { + return putsSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); + } + /**设置搜索 + * @param key + * @param value + * @param type + * @return {@link #puts(String, Object)} + */ + public JSONObject putsSearch(String key, String value, int type) { + return puts(key+"$", SQL.search(value, type)); + } + + //Request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + /**puts key-value in object into this + * @param object + * @return this + */ + public JSONObject putsAll(Map map) { + putAll(map); + return this; + } + @Override + public void putAll(Map map) { + if (map != null && map.isEmpty() == false) { + super.putAll(map); + } + } + + + + /**put and return this + * @param value must be annotated by {@link MethodAccess} + * @return {@link #puts(String, boolean)} + */ + public JSONObject puts(Object value) { + return puts(null, value); + } + /**put and return this + * @param key + * @param value + * @return this + * @see {@link #put(String, Object)} + */ + public JSONObject puts(String key, Object value) { + put(key, value); + return this; + } + + /**put and return value + * @param value must be annotated by {@link MethodAccess} + * @return {@link #put(String, boolean)} + */ + public Object put(Object value) { + return put(null, value); + } + /**put and return value + * @param key StringUtil.isEmpty(key, true) ? key = value.getClass().getSimpleName(); + * @param value + * @return value + */ + @Override + public Object put(String key, Object value) { + if (value == null) { + Log.e(TAG, "put value == null >> return null;"); + return null; + } + if (StringUtil.isEmpty(key, true)) { + Class clazz = value.getClass(); + if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { + throw new IllegalArgumentException("puts StringUtil.isNotEmpty(key, true) == false" + + " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + + " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + + " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + + " \n 如果是类似 key[]:{} 结构的请求,建议用 putsAll(...) !"); + } + key = value.getClass().getSimpleName(); + } + return super.put(key, value); + } + + + +} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONRequest.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONRequest.java similarity index 52% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONRequest.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONRequest.java index 78b935560..51d064731 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/JSONRequest.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONRequest.java @@ -14,11 +14,14 @@ package zuo.biao.apijson; -/**encapsulator for request JSONObject, encode in default cases +import java.util.Map; + +/**wrapper for request * @author Lemon + * @see #puts * @see #toArray * @use JSONRequest request = new JSONRequest(...); - *
request.put(...);//not a must + *
request.puts(...);//not a must *
request.toArray(...);//not a must */ public class JSONRequest extends JSONObject { @@ -28,51 +31,43 @@ public JSONRequest() { super(); } /** - * encode = true - * @param object must be annotated by {@link APIJSONRequest} + * @param object must be annotated by {@link MethodAccess} * @see {@link #JSONRequest(String, Object)} */ public JSONRequest(Object object) { this(null, object); } /** - * encode = true * @param name * @param object - * @see {@link #JSONRequest(String, Object, boolean)} + * @see {@link #puts(String, Object)} */ public JSONRequest(String name, Object object) { - this(name, object, true); - } - /** - * @param object must be annotated by {@link APIJSONRequest} - * @param encode - * @see {@link #JSONRequest(String, Object, boolean)} - */ - public JSONRequest(Object object, boolean encode) { - this(null, object, encode); - } - /** - * @param name - * @param object - * @param encode - * @see {@link #put(String, Object, boolean)} - */ - public JSONRequest(String name, Object object, boolean encode) { this(); - put(name, object, encode); + puts(name, object); } - - - + public static final String KEY_TAG = "tag";//只在最外层,最外层用JSONRequest - - public JSONObject setTag(String tag) { - put(KEY_TAG, tag); - return this; + public static final String KEY_VERSION = "version";//只在最外层,最外层用JSONRequest + + /**set "tag":tag in outermost layer + * for write operations + * @param tag + * @return + */ + public JSONRequest setTag(String tag) { + return puts(KEY_TAG, tag); + } + /**set "version":version in outermost layer + * for target version of request + * @param version + * @return + */ + public JSONRequest setVersion(String version) { + return puts(KEY_VERSION, version); } @@ -86,104 +81,67 @@ public JSONObject setTag(String tag) { public static final String KEY_COUNT = "count"; public static final String KEY_PAGE = "page"; - /** + /**set what to query in Array layer * @param query what need to query, Table,total,ALL? * @return + * @see {@link #QUERY_TABLE} + * @see {@link #QUERY_TOTAL} + * @see {@link #QUERY_ALL} */ public JSONRequest setQuery(int query) { - put(KEY_QUERY, query); - return this; + return puts(KEY_QUERY, query); } - /** - * @param count + /**set maximum count of Tables to query in Array layer + * @param count <= 0 || >= max ? max : count * @return */ public JSONRequest setCount(int count) { - put(KEY_COUNT, count); - return this; + return puts(KEY_COUNT, count); } - /** - * @param page + /**set page of Tables to query in Array layer + * @param page <= 0 ? 0 : page * @return */ public JSONRequest setPage(int page) { - put(KEY_PAGE, page); - return this; + return puts(KEY_PAGE, page); } //array object >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - // 导致JSONObject add >> get = null - // /** - // * decode = true - // * @param key - // * return {@link #get(Object, boolean)} - // */ - // @Override - // public Object get(Object key) { - // return get(key, true); - // } - - /** - * encode = true - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - @Override - public Object put(Object value) { - return put(value, true); - } - /** - * encode = true - * @param key - * @param value - * return {@link #put(String, Object, boolean)} - */ - @Override - public Object put(String key, Object value) { - return put(key, value, true); - } - - /**create a parent JSONObject named KEY_ARRAY - * encode = true; * @param count * @param page * @return {@link #toArray(int, int, boolean)} */ public JSONRequest toArray(int count, int page) { - return toArray(count, page, true); - } - /**create a parent JSONObject named KEY_ARRAY - * encode = true; - * @param count - * @param page - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, boolean encode) { - return toArray(count, page, null, encode); - } - /**create a parent JSONObject named name+KEY_ARRAY - * encode = true; - * @param count - * @param page - * @param name - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, String name) { - return toArray(count, page, name, true); + return toArray(count, page, null); } /**create a parent JSONObject named name+KEY_ARRAY. * @param count * @param page * @param name - * @param encode * @return {name+KEY_ARRAY : this}. if needs to be put, use {@link #add(com.alibaba.fastjson.JSONObject)} instead */ - public JSONRequest toArray(int count, int page, String name, boolean encode) { - return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page), encode); + public JSONRequest toArray(int count, int page, String name) { + return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page)); + } + + + @Override + public JSONObject putsAll(Map map) { + super.putsAll(map); + return this; + } + + @Override + public JSONRequest puts(Object value) { + return puts(null, value); + } + @Override + public JSONRequest puts(String key, Object value) { + super.puts(key, value); + return this; } } diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONResponse.java new file mode 100644 index 000000000..f9b6d3fc9 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/JSONResponse.java @@ -0,0 +1,400 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Set; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/**parser for response + * @author Lemon + * @see #getObject + * @see #getList + * @use JSONResponse response = new JSONResponse(json); + *
User user = response.getObject(User.class);//not a must + *
List commenntList = response.getList("Comment[]", Comment.class);//not a must + */ +public class JSONResponse extends zuo.biao.apijson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONResponse"; + + public JSONResponse() { + super(); + } + public JSONResponse(String json) { + this(parseObject(json)); + } + public JSONResponse(JSONObject object) { + super(format(object)); + } + + //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int CODE_SUCCESS = 200; //成功 + public static final int CODE_UNSUPPORTED_ENCODING = 400; //编码错误 + public static final int CODE_ILLEGAL_ACCESS = 401; //权限错误 + public static final int CODE_UNSUPPORTED_OPERATION = 403; //禁止操作 + public static final int CODE_NOT_FOUND = 404; //未找到 + public static final int CODE_ILLEGAL_ARGUMENT = 406; //参数错误 + public static final int CODE_NOT_LOGGED_IN = 407; //未登录 + public static final int CODE_TIME_OUT = 408; //超时 + public static final int CODE_CONFLICT = 409; //重复,已存在 + public static final int CODE_CONDITION_ERROR = 412; //条件错误,如密码错误 + public static final int CODE_UNSUPPORTED_TYPE = 415; //类型错误 + public static final int CODE_OUT_OF_RANGE = 416; //超出范围 + public static final int CODE_NULL_POINTER = 417; //对象为空 + public static final int CODE_SERVER_ERROR = 500; //服务器内部错误 + + + public static final String MSG_SUCCEED = "success"; //成功 + public static final String MSG_SERVER_ERROR = "Internal Server Error!"; //服务器内部错误 + + + public static final String KEY_CODE = "code"; + public static final String KEY_MSG = "msg"; + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + public static final String KEY_COUNT = "count"; + public static final String KEY_TOTAL = "total"; + + /**获取状态 + * @return + */ + public int getCode() { + try { + return getIntValue(KEY_CODE); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取信息 + * @return + */ + public String getMsg() { + return getString(KEY_MSG); + } + /**获取id + * @return + */ + public long getId() { + try { + return getLongValue(KEY_ID); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取数量 + * @return + */ + public int getCount() { + try { + return getIntValue(KEY_COUNT); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取总数 + * @return + */ + public int getTotal() { + try { + return getIntValue(KEY_TOTAL); + } catch (Exception e) { + //empty + } + return 0; + } + + + /**是否成功 + * @return + */ + public boolean isSuccess() { + return isSuccess(getCode()); + } + /**是否成功 + * @param code + * @return + */ + public static boolean isSuccess(int code) { + return code == CODE_SUCCESS; + } + /**是否成功 + * @param response + * @return + */ + public static boolean isSuccess(JSONResponse response) { + return response != null && response.isSuccess(); + } + + /**校验服务端是否存在table + * @return + */ + public boolean isExist() { + return isExist(getCount()); + } + /**校验服务端是否存在table + * @param count + * @return + */ + public static boolean isExist(int count) { + return count > 0; + } + /**校验服务端是否存在table + * @param response + * @return + */ + public static boolean isExist(JSONResponse response) { + return response != null && response.isExist(); + } + + /**获取内部的JSONResponse + * @param key + * @return + */ + public JSONResponse getJSONResponse(String key) { + return getObject(key, JSONResponse.class); + } + //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + /** + * key = clazz.getSimpleName() + * @param clazz + * @return + */ + public T getObject(Class clazz) { + return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); + } + /** + * @param key + * @param clazz + * @return + */ + public T getObject(String key, Class clazz) { + return getObject(this, key, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static T getObject(JSONObject object, String key, Class clazz) { + return toObject(object == null ? null : object.getJSONObject(key), clazz); + } + + /** + * @param clazz + * @return + */ + public T toObject(Class clazz) { + return toObject(this, clazz); + } + /** + * @param object + * @param clazz + * @return + */ + public static T toObject(JSONObject object, Class clazz) { + return JSON.parseObject(JSON.toJSONString(object), clazz); + } + + + + + /** + * key = KEY_ARRAY + * @param clazz + * @return + */ + public List getList(Class clazz) { + return getList(KEY_ARRAY, clazz); + } + /** + * arrayObject = this + * @param key + * @param clazz + * @return + */ + public List getList(String key, Class clazz) { + return getList(this, key, clazz); + } + + /** + * key = KEY_ARRAY + * @param object + * @param clazz + * @return + */ + public static List getList(JSONObject object, Class clazz) { + return getList(object, KEY_ARRAY, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static List getList(JSONObject object, String key, Class clazz) { + return object == null ? null : JSON.parseArray(object.getString(replaceArray(key)), clazz); + } + + /** + * key = KEY_ARRAY + * @return + */ + public JSONArray getArray() { + return getArray(KEY_ARRAY); + } + /** + * @param key + * @return + */ + public JSONArray getArray(String key) { + return getArray(this, key); + } + /** + * @param object + * @return + */ + public static JSONArray getArray(JSONObject object) { + return getArray(object, KEY_ARRAY); + } + /** + * key = KEY_ARRAY + * @param object + * @param key + * @return + */ + public static JSONArray getArray(JSONObject object, String key) { + return object == null ? null : object.getJSONArray(replaceArray(key)); + } + + + // /** + // * @return + // */ + // public JSONObject format() { + // return format(this); + // } + /**格式化key名称 + * @param object + * @return + */ + public static JSONObject format(final JSONObject object) { + //太长查看不方便,不如debug Log.i(TAG, "format object = \n" + JSON.toJSONString(object)); + if (object == null || object.isEmpty()) { + Log.i(TAG, "format object == null || object.isEmpty() >> return object;"); + return object; + } + JSONObject formatedObject = new JSONObject(true); + + Set set = object.keySet(); + if (set != null) { + + Object value; + for (String key : set) { + value = object.get(key); + + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedObject.put(replaceArray(key), format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedObject.put(getSimpleName(key), format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedObject.put(getSimpleName(key), value); + } + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedObject = " + JSON.toJSONString(formatedObject)); + return formatedObject; + } + + /**格式化key名称 + * @param array + * @return + */ + public static JSONArray format(final JSONArray array) { + //太长查看不方便,不如debug Log.i(TAG, "format array = \n" + JSON.toJSONString(array)); + if (array == null || array.isEmpty()) { + Log.i(TAG, "format array == null || array.isEmpty() >> return array;"); + return array; + } + JSONArray formatedArray = new JSONArray(); + + Object value; + for (int i = 0; i < array.size(); i++) { + value = array.get(i); + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedArray.add(format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedArray.add(format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedArray.add(value); + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedArray = " + JSON.toJSONString(formatedArray)); + return formatedArray; + } + + /**替换key+KEY_ARRAY为keyList + * @param key + * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} + */ + public static String replaceArray(String key) { + if (isArrayKey(key)) { + key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); + } + return getSimpleName(key); + } + /**获取列表变量名 + * @param key => StringUtil.getNoBlankString(key) + * @return empty ? "list" : key + "List" 且首字母小写 + */ + public static String getArrayKey(String key) { + return StringUtil.addSuffix(key, "list"); + } + + /**获取简单名称 + * @param fullName name 或 name:alias + * @return name => name; name:alias => alias + */ + public static String getSimpleName(String fullName) { + //key:alias -> alias; key:alias[] -> alias[] + int index = fullName == null ? -1 : fullName.indexOf(":"); + if (index >= 0) { + fullName = fullName.substring(index + 1); + } + return fullName; + } + + +} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/Log.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/Log.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/Log.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/Log.java diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/MethodAccess.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/MethodAccess.java new file mode 100644 index 000000000..939571625 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/MethodAccess.java @@ -0,0 +1,73 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CIRCLE; +import static zuo.biao.apijson.RequestRole.CONTACT; +import static zuo.biao.apijson.RequestRole.LOGIN; +import static zuo.biao.apijson.RequestRole.OWNER; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/**请求方法权限,只允许某些角色通过对应方法访问 + * @author Lemon + */ +@Documented +@Retention(RUNTIME) +@Target(TYPE) +public @interface MethodAccess { + + /**@see {@link RequestMethod#GET} + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] GET() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#HEAD} + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] HEAD() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#GETS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] GETS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#HEADS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] HEADS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#POST} + * @return 该请求方法允许的角色 default {LOGIN, ADMIN}; + */ + RequestRole[] POST() default {LOGIN, ADMIN}; + + /**@see {@link RequestMethod#PUT} + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; + */ + RequestRole[] PUT() default {OWNER, ADMIN}; + + /**@see {@link RequestMethod#DELETE} + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; + */ + RequestRole[] DELETE() default {OWNER, ADMIN}; + +} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/APIJSONRequest.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/MethodStructure.java similarity index 72% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/APIJSONRequest.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/MethodStructure.java index 86c912561..27c30c96d 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/APIJSONRequest.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/MethodStructure.java @@ -14,35 +14,31 @@ package zuo.biao.apijson; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -/**请求方法对应的JSON结构 +/**对应方法的请求结构。 + * 仅测试和基本的校验用,实际用Request表里的配置 * @author Lemon */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) @Documented -public @interface APIJSONRequest { +@Retention(RUNTIME) +@Target(TYPE) +public @interface MethodStructure { - /** - * @return 允许的请求方法 - */ - RequestMethod[] method() default {}; - - - /**@see {@link RequestMethod#POST_HEAD} + /**@see {@link RequestMethod#HEADS} * @return 该请求方法允许的结构 */ - String POST_HEAD() default ""; + String HEADS() default ""; - /**@see {@link RequestMethod#POST_GET} + /**@see {@link RequestMethod#GETS} * @return 该请求方法允许的结构 */ - String POST_GET() default ""; + String GETS() default ""; /**@see {@link RequestMethod#POST} * @return 该请求方法允许的结构 @@ -58,4 +54,5 @@ * @return 该请求方法允许的结构 */ String DELETE() default ""; + } diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/RequestMethod.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/RequestMethod.java new file mode 100644 index 000000000..a450baad8 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/RequestMethod.java @@ -0,0 +1,94 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出GETS,HEADS方法 + * @author Lemon + */ +public enum RequestMethod { + + /** + * 常规获取数据方式 + */ + GET, + + /** + * 检查,默认是非空检查,返回数据总数 + */ + HEAD, + + /**Safe, Single, Simple + *
限制性GET,通过POST来GET数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 + */ + GETS, + + /**Safe, Single, Simple + *
限制性HEAD,通过POST来HEAD数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 + */ + HEADS, + + /** + * 新增(或者说插入)数据 + */ + POST, + + /** + * 修改数据,只修改传入字段对应的值 + */ + PUT, + + /** + * 删除数据 + */ + DELETE; + + + /**是否为GET请求方法 + * @param method + * @param containPrivate 包含私密(非明文)获取方法GETS + * @return + */ + public static boolean isGetMethod(RequestMethod method, boolean containPrivate) { + boolean is = method == null || method == GET; + return containPrivate == false ? is : is || method == GETS; + } + + /**是否为HEAD请求方法 + * @param method + * @param containPrivate 包含私密(非明文)获取方法HEADS + * @return + */ + public static boolean isHeadMethod(RequestMethod method, boolean containPrivate) { + boolean is = method == HEAD; + return containPrivate == false ? is : is || method == HEADS; + } + + /**是否为查询的请求方法 + * @param method + * @return 读操作(GET型或HEAD型) - true, 写操作(POST,PUT,DELETE) - false + */ + public static boolean isQueryMethod(RequestMethod method) { + return isGetMethod(method, true) || isHeadMethod(method, true); + } + + /**是否为开放(不限制请求的结构或内容;明文,浏览器能直接访问及查看)的请求方法 + * @param method + * @return + */ + public static boolean isPublicMethod(RequestMethod method) { + return method == null || method == GET || method == HEAD; + } + +} diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/RequestRole.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/RequestRole.java new file mode 100644 index 000000000..f3a777d67 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/RequestRole.java @@ -0,0 +1,63 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +/**来访的用户角色 + * @author Lemon + */ +public enum RequestRole { + + /**未登录,不明身份的用户 + */ + UNKNOWN, + + /**已登录的用户 + */ + LOGIN, + + /**联系人,必须已登录 + */ + CONTACT, + + /**圈子成员(CONTACT + OWNER),必须已登录 + */ + CIRCLE, + + /**拥有者,必须已登录 + */ + OWNER, + + /**管理员,必须已登录 + */ + ADMIN; + + //似乎不管怎么做,外部引用后都是空值。并且如果在注解内的位置不是最前的,还会导致被注解的类在其它类中import报错。 + //虽然直接打印显示正常,但被@MethodAccess内RequestRole[] GET()等方法引用后获取的是空值 + // public static final RequestRole[] ALL = {RequestRole.UNKNOWN};//values();//所有 + // public static final RequestRole[] HIGHS;//高级 + // static { + // HIGHS = new RequestRole[] {OWNER, ADMIN}; + // } + + public static RequestRole get(String name) { + try {//Enum.valueOf只要找不到对应的值就会抛异常 + return RequestRole.valueOf(StringUtil.toUpperCase(name)); + } catch (Exception e) { + //empty + } + return null; + } + +} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/SQL.java similarity index 67% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/SQL.java index 63f532b52..a9da023e5 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/APIJSONLibrary/src/main/java/zuo/biao/apijson/SQL.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/SQL.java @@ -22,8 +22,16 @@ public class SQL { public static final String OR = " OR "; public static final String AND = " AND "; public static final String NOT = " NOT "; + public static final String AS = " AS "; public static final String IS = " is "; public static final String NULL = " null "; + + //括号必须紧跟函数名! count (...) 报错! + public static final String COUNT = "count"; + public static final String SUM = "sum"; + public static final String MAX = "max"; + public static final String MIN = "min"; + public static final String AVG = "avg"; /** * isNull = true @@ -34,7 +42,7 @@ public static String isNull() { } /** * @param isNull - * @return IS + (isNull ? "" : NOT) + NULL; + * @return {@link #IS} + (isNull ? "" : {@link #NOT}) + {@link #NULL}; */ public static String isNull(boolean isNull) { return IS + (isNull ? "" : NOT) + NULL; @@ -87,7 +95,7 @@ public static String isEmpty(String s, boolean isEmpty, boolean trim) { * @param s * @param isEmpty <=0 * @param trim s = trim(s); - * @param nullable isNull(s, true) + OR + + * @param nullable isNull(s, true) + {@link #OR} + * @return {@link #lengthCompare(String, String)} */ public static String isEmpty(String s, boolean isEmpty, boolean trim, boolean nullable) { @@ -171,30 +179,30 @@ public static String subString(String s, int start, int end) { /** * @param s - * @param c - * @return "instr(" + s + "," + c + ")" + * @param c -> 'c' + * @return "instr(" + s + ", '" + c + "')" */ public static String indexOf(String s, String c) { - return "instr(" + s + "," + c + ")"; + return "instr(" + s + ", '" + c + "')"; } /** * @param s - * @param c1 - * @param c2 - * @return + * @param c1 -> 'c1' + * @param c2 -> 'c2' + * @return "replace(" + s + ", '" + c1 + "', '" + c2 + "')" */ public static String replace(String s, String c1, String c2) { - return "replace(" + s + "," + c1 + "," + c2 + ")"; + return "replace(" + s + ", '" + c1 + "', '" + c2 + "')"; } /** * @param s1 - * @param s2 - * @return "strcmp(" + s1 + "," + s2 + ")" + * @param s2 -> 's2' + * @return "strcmp(" + s1 + ", '" + s2 + "')" */ public static String equals(String s1, String s2) { - return "strcmp(" + s1 + "," + s2 + ")"; + return "strcmp(" + s1 + ", '" + s2 + "')"; } /** @@ -212,9 +220,98 @@ public static String toLowerCase(String s) { return "lower(" + s + ")"; } + + + //column and function<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**字段 + * @param column + * @return column.isEmpty() ? "*" : column; + */ + public static String column(String column) { + column = StringUtil.getTrimedString(column); + return column.isEmpty() ? "*" : column; + } + /**有别名的字段 + * @param column + * @return {@link #count(String)} + {@link #AS}; + */ + public static String columnAs(String column) { + return count(column) + AS; + } + + /**函数 + * @param column if (StringUtil.isEmpty(column, true) || column.contains(",")) -> column = null; + * @return " " + fun + "(" + {@link #column(String)} + ") "; + */ + public static String function(String fun, String column) { + if (StringUtil.isEmpty(column, true) || column.contains(",")) { + column = null; //解决 count(id,name) 这种多个字段导致的SQL异常 + } + return " " + fun + "(" + column(column) + ") "; + } + /**有别名的函数 + * @param column + * @return {@link #function(String, String)} + {@link #AS} + fun; + */ + public static String functionAs(String fun, String column) { + return function(fun, column) + AS + fun + " "; + } + + /**计数 + * column = null + * @return {@link #count(String)} + */ + public static String count() { + return count(null); + } + /**计数 + * fun = {@link #COUNT} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String count(String column) { + return functionAs(COUNT, column); + } + /**求和 + * fun = {@link #SUM} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String sum(String column) { + return functionAs(SUM, column); + } + /**最大值 + * fun = {@link #MAX} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String max(String column) { + return functionAs(MAX, column); + } + /**最小值 + * fun = {@link #MIN} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String min(String column) { + return functionAs(MIN, column); + } + /**平均值 + * fun = {@link #AVG} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String avg(String column) { + return functionAs(AVG, column); + } - + //column and function>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //search<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static final int SEARCH_TYPE_CONTAIN_FULL = 0; public static final int SEARCH_TYPE_CONTAIN_ORDER = 1; @@ -286,5 +383,7 @@ public static String search(String s, int type, boolean ignoreCase) { return "%" + s + "%"; } } + + //search>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/StringUtil.java old mode 100644 new mode 100755 similarity index 78% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/StringUtil.java index ac779ec2e..b219b430a --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/StringUtil.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/StringUtil.java @@ -17,7 +17,6 @@ import java.io.File; import java.math.BigDecimal; import java.text.DecimalFormat; -import java.util.regex.Matcher; import java.util.regex.Pattern; /**通用字符串(String)相关类,为null时返回"" @@ -100,7 +99,7 @@ public static String getString(String s) { * @param array * @return {@link #getString(String[], boolean)} */ - public static String getString(String[] array) { + public static String getString(Object[] array) { return getString(array, false); } /**获取string,为null则返回"" @@ -109,7 +108,7 @@ public static String getString(String[] array) { * @param ignoreEmptyItem * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, boolean ignoreEmptyItem) { + public static String getString(Object[] array, boolean ignoreEmptyItem) { return getString(array, null, ignoreEmptyItem); } /**获取string,为null则返回"" @@ -118,7 +117,7 @@ public static String getString(String[] array, boolean ignoreEmptyItem) { * @param split * @return {@link #getString(String[], String, boolean)} */ - public static String getString(String[] array, String split) { + public static String getString(Object[] array, String split) { return getString(array, split, false); } /**获取string,为null则返回"" @@ -127,7 +126,7 @@ public static String getString(String[] array, String split) { * @param ignoreEmptyItem * @return */ - public static String getString(String[] array, String split, boolean ignoreEmptyItem) { + public static String getString(Object[] array, String split, boolean ignoreEmptyItem) { String s = ""; if (array != null) { if (split == null) { @@ -271,9 +270,9 @@ public static boolean isEmpty(String s, boolean trim) { } //判断字符是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - + //判断字符是否非空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - + /**判断字符是否非空 * @param object * @param trim @@ -298,49 +297,80 @@ public static boolean isNotEmpty(CharSequence cs, boolean trim) { public static boolean isNotEmpty(String s, boolean trim) { return ! isEmpty(s, trim); } - + //判断字符是否非空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static final Pattern alphaPattern; - public static final Pattern bigAlphaPattern; - public static final Pattern namePattern; - public static final Pattern smallAlphaPattern; + public static final Pattern PATTERN_NUMBER; + public static final Pattern PATTERN_PHONE; + public static final Pattern PATTERN_EMAIL; + public static final Pattern PATTERN_ID_CARD; + public static final Pattern PATTERN_ALPHA; + public static final Pattern PATTERN_PASSWORD; //TODO + public static final Pattern PATTERN_NAME; + public static final Pattern PATTERN_ALPHA_BIG; + public static final Pattern PATTERN_ALPHA_SMALL; static { - alphaPattern = Pattern.compile("[a-zA-Z]"); - bigAlphaPattern = Pattern.compile("[A-Z]"); - namePattern = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 - smallAlphaPattern = Pattern.compile("[a-z]"); - } - - //判断手机格式是否正确 + PATTERN_NUMBER = Pattern.compile("^[0-9]+$"); + PATTERN_ALPHA = Pattern.compile("^[a-zA-Z]+$"); + PATTERN_ALPHA_BIG = Pattern.compile("^[A-Z]+$"); + PATTERN_ALPHA_SMALL = Pattern.compile("^[a-z]+$"); + PATTERN_NAME = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 + PATTERN_PHONE = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); + PATTERN_EMAIL = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); + PATTERN_ID_CARD = Pattern.compile("(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)"); + PATTERN_PASSWORD = Pattern.compile("^[0-9a-zA-Z]+$"); + } + + /**判断手机格式是否正确 + * @param phone + * @return + */ public static boolean isPhone(String phone) { if (isNotEmpty(phone, true) == false) { return false; } - Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); - currentString = phone; - - return p.matcher(phone).matches(); + return PATTERN_PHONE.matcher(phone).matches(); } - //判断email格式是否正确 + /**判断手机格式是否正确 + * @param s + * @return + */ + public static boolean isPassword(String s) { + return getLength(s, false) >= 6 && PATTERN_PASSWORD.matcher(s).matches(); + } + /**判断是否全是数字密码 + * @param s + * @return + */ + public static boolean isNumberPassword(String s) { + return getLength(s, false) == 6 && isNumer(s); + } + /**判断email格式是否正确 + * @param email + * @return + */ public static boolean isEmail(String email) { if (isNotEmpty(email, true) == false) { return false; } - String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; - Pattern p = Pattern.compile(str); - currentString = email; - - return p.matcher(email).matches(); + return PATTERN_EMAIL.matcher(email).matches(); } + + /**判断是否全是验证码 + * @param s + * @return + */ + public static boolean isVerify(String s) { + return getLength(s, false) >= 4 && isNumer(s); + } /**判断是否全是数字 * @param s * @return @@ -350,39 +380,20 @@ public static boolean isNumer(String s) { return false; } - Pattern pattern = Pattern.compile("[0-9]"); - Matcher matcher; - for (int i = 0; i < s.length(); i++) { - matcher = pattern.matcher(s.substring(i, i+1)); - if(! matcher.matches()){ - return false; - } - } - currentString = s; - - return true; + return PATTERN_NUMBER.matcher(s).matches(); } /**判断是否全是字母 * @param s * @return */ public static boolean isAlpha(String s) { - if (s == null) { - Log.i(TAG, "isNumberOrAlpha inputed == null >> return false;"); + if (isEmpty(s, true)) { return false; } - Pattern pAlpha = Pattern.compile("[a-zA-Z]"); - Matcher mAlpha; - for (int i = 0; i < s.length(); i++) { - mAlpha = pAlpha.matcher(s.substring(i, i+1)); - if(! mAlpha.matches()){ - return false; - } - } currentString = s; - return true; + return PATTERN_ALPHA.matcher(s).matches(); } /**判断是否全是数字或字母 * @param s @@ -392,22 +403,53 @@ public static boolean isNumberOrAlpha(String s) { return isNumer(s) || isAlpha(s); } + /**判断是否为代码名称,只能包含字母,数字或下划线 + * @param s + * @return + */ + public static boolean isName(String s) { + return s != null && PATTERN_NAME.matcher(s).matches(); + } + /**判断是否为首字母大写的代码名称 + * @param key + * @return + */ + public static boolean isBigName(String s) { + s = getString(s); + if (s.isEmpty() || PATTERN_ALPHA_BIG.matcher(s.substring(0, 1)).matches() == false) { + return false; + } + return s.length() <= 1 ? true : isName(s.substring(1)); + } + /**判断是否为首字母小写的代码名称 + * @param key + * @return + */ + public static boolean isSmallName(String s) { + s = getString(s); + if (s.isEmpty() || PATTERN_ALPHA_SMALL.matcher(s.substring(0, 1)).matches() == false) { + return false; + } + return s.length() <= 1 ? true : isName(s.substring(1)); + } + + /**判断字符类型是否是身份证号 - * @param idCard + * @param number * @return */ - public static boolean isIDCard(String idCard) { - if (isNumberOrAlpha(idCard) == false) { + public static boolean isIDCard(String number) { + if (isNumberOrAlpha(number) == false) { return false; } - idCard = getString(idCard); - if (idCard.length() == 15) { - Log.i(TAG, "isIDCard idCard.length() == 15 old IDCard"); - currentString = idCard; + number = getString(number); + if (number.length() == 15) { + Log.i(TAG, "isIDCard number.length() == 15 old IDCard"); + currentString = number; return true; } - if (idCard.length() == 18) { - currentString = idCard; + if (number.length() == 18) { + currentString = number; return true; } @@ -589,7 +631,7 @@ public static String getCorrectEmail(String email) { public static final int PRICE_FORMAT_PREFIX_WITH_BLANK = 3; public static final int PRICE_FORMAT_SUFFIX_WITH_BLANK = 4; public static final String[] PRICE_FORMATS = { - "", "¥", "元", "¥ ", " 元" + "", "¥", "元", "¥ ", " 元" }; /**获取价格,保留两位小数 @@ -676,7 +718,7 @@ public static String getPrice(double price, int formatType) { } } - + /**分割路径 * @param path * @return @@ -695,11 +737,21 @@ public static String[] split(String s) { return split(s, null); } /**将s用split分割成String[] + * trim = true; * @param s * @param split * @return */ public static String[] split(String s, String split) { + return split(s, split, true); + } + /**将s用split分割成String[] + * @param s + * @param split + * @param trim 去掉前后两端的split + * @return + */ + public static String[] split(String s, String split, boolean trim) { s = getString(s); if (s.isEmpty()) { return null; @@ -707,11 +759,13 @@ public static String[] split(String s, String split) { if (isNotEmpty(split, false) == false) { split = ","; } - while (s.startsWith(split)) { - s = s.substring(split.length()); - } - while (s.endsWith(split)) { - s = s.substring(0, s.length() - split.length()); + if (trim) { + while (s.startsWith(split)) { + s = s.substring(split.length()); + } + while (s.endsWith(split)) { + s = s.substring(0, s.length() - split.length()); + } } return s.contains(split) ? s.split(split) : new String[]{s}; } @@ -722,11 +776,10 @@ public static String[] split(String s, String split) { * @return key + suffix,第一个字母小写 */ public static String addSuffix(String key, String suffix) { - key = StringUtil.getNoBlankString(key); + key = getNoBlankString(key); if (key.isEmpty()) { return firstCase(suffix); } - return firstCase(key) + firstCase(suffix, true); } /** @@ -741,7 +794,7 @@ public static String firstCase(String key) { * @return */ public static String firstCase(String key, boolean upper) { - key = StringUtil.getString(key); + key = getString(key); if (key.isEmpty()) { return ""; } @@ -752,7 +805,38 @@ public static String firstCase(String key, boolean upper) { return key; } - + /**全部大写 + * @param s + * @return + */ + public static String toUpperCase(String s) { + return toUpperCase(s, false); + } + /**全部大写 + * @param s + * @param trim + * @return + */ + public static String toUpperCase(String s, boolean trim) { + s = trim ? getTrimedString(s) : getString(s); + return s.toUpperCase(); + } + /**全部小写 + * @param s + * @return + */ + public static String toLowerCase(String s) { + return toLowerCase(s, false); + } + /**全部小写 + * @param s + * @return + */ + public static String toLowerCase(String s, boolean trim) { + s = trim ? getTrimedString(s) : getString(s); + return s.toLowerCase(); + } + //校正(自动补全等)字符串>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/OnHttpResponseListener.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Column.java similarity index 60% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/OnHttpResponseListener.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Column.java index 397b986f5..ed68fc497 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONApp/app/src/main/java/apijson/demo/client/interfaces/OnHttpResponseListener.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Column.java @@ -1,4 +1,4 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,19 +12,15 @@ See the License for the specific language governing permissions and limitations under the License.*/ -package apijson.demo.client.interfaces; +package zuo.biao.apijson.model; -import zuo.biao.apijson.JSONResponse; +import zuo.biao.apijson.MethodAccess; -/**网络请求回调接口 +/**字段(列名) * @author Lemon - * @param */ -public interface OnHttpResponseListener { - /** - * @param requestCode - * @param response - * @param e - */ - void onHttpResponse(int requestCode, JSONResponse response, Exception e); -} \ No newline at end of file +@MethodAccess +public class Column { + public static final String TAG = "`columns`"; + +} diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Request.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Request.java new file mode 100644 index 000000000..09a6d4254 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Request.java @@ -0,0 +1,28 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**请求类 + * @author Lemon + */ +@MethodAccess( + POST = {}, + PUT = {}, + DELETE = {} + ) +public class Request { +} diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Response.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Response.java new file mode 100644 index 000000000..e46dc8479 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Response.java @@ -0,0 +1,28 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**结果类 + * @author Lemon + */ +@MethodAccess( + POST = {}, + PUT = {}, + DELETE = {} + ) +public class Response { +} diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Table.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Table.java new file mode 100644 index 000000000..eeb3e9571 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Table.java @@ -0,0 +1,26 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**数据库表 + * @author Lemon + */ +@MethodAccess +public class Table { + public static final String TAG = "`tables`"; + +} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/client/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Test.java similarity index 73% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/client/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Test.java index 84599fa4a..8f2840d4f 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/client/package-info.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/Test.java @@ -1,4 +1,4 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,11 +12,13 @@ See the License for the specific language governing permissions and limitations under the License.*/ -/** - * files for client projects - */ -/** +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**输入条件测试类 * @author Lemon - * */ -package zuo.biao.apijson.client; \ No newline at end of file +@MethodAccess +public class Test { +} diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/package-info.java new file mode 100644 index 000000000..356cf4e4a --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/model/package-info.java @@ -0,0 +1,8 @@ +/** + * models for special tables + */ +/** + * @author Lemon + * + */ +package zuo.biao.apijson.model; \ No newline at end of file diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/package-info.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Entry.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Entry.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Entry.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Entry.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/JSONRequest.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/JSONRequest.java similarity index 53% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/JSONRequest.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/JSONRequest.java index 3216f2a06..0a357656c 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/JSONRequest.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/JSONRequest.java @@ -14,8 +14,10 @@ package zuo.biao.apijson.server; +import java.util.Map; + import zuo.biao.apijson.JSON; -import zuo.biao.apijson.SQL; +import zuo.biao.apijson.JSONObject; import zuo.biao.apijson.StringUtil; /**JSONRequest for Server to replace zuo.biao.apijson.JSONRequest, @@ -35,111 +37,66 @@ public JSONRequest() { * @param object */ public JSONRequest(Object object) { - this(null, object); + super(object); } /** - * encode = false - * {@link #JSONRequest(String, Object, boolean)} * @param name * @param object */ public JSONRequest(String name, Object object) { - this(name, object, false); - } - /** - * {@link #JSONRequest(String, Object, boolean)} - * @param object - * @param encode - */ - public JSONRequest(Object object, boolean encode) { - super(object, encode); + super(name, object); } - /** - * {@link #put(String, Object, boolean)} - * @param name - * @param object - * @param encode - */ - public JSONRequest(String name, Object object, boolean encode) { - super(name, object, encode); - } - - - /** - * decode = true - * @param key - * return {@link #get(Object, boolean)} - */ + + @Override - public Object get(Object key) { - return get(key, false); + public JSONObject putsAll(Map map) { + super.putsAll(map); + return this; } /** - * encode = false * @param value - * @return {@link #put(String, boolean)} + * @return {@link #puts(String, Object)} */ @Override - public Object put(Object value) { - return put(value, false); + public JSONRequest puts(Object value) { + return puts(null, value); } /** + * @param key * @param value - * @param encode - * @return {@link #put(String, Object, boolean)} + * @return this + * @see {@link #put(String, Object)} */ @Override - public Object put(Object value, boolean encode) { - return put(null, value, encode); + public JSONRequest puts(String key, Object value) { + put(key, value); + return this; } + /** - * encode = false - * @param key * @param value - * return {@link #put(String, Object, boolean)} + * @return {@link #put(String, Object)} */ @Override - public Object put(String key, Object value) { - return put(key, value, false); + public Object put(Object value) { + return put(null, value); } /**自定义类型必须转为JSONObject或JSONArray,否则RequestParser解析不了 */ @Override - public Object put(String key, Object value, boolean encode) { + public Object put(String key, Object value) { if (value == null) {// || key == null return null; } - + com.alibaba.fastjson.JSONObject target = JSON.parseObject(value); - if (target == null) { - return null; - } + // if (target == null) { // "tag":"User" 报错 + // return null; + // } return super.put(StringUtil.isNotEmpty(key, true) ? key : value.getClass().getSimpleName() //must handle key here - , target, encode); - } - - /**设置搜索 - * @param key - * @param value - * @return - * @see {@link #putSearch(String, String, int)} - */ - @Override - public JSONRequest putSearch(String key, String value) { - return putSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); - } - /**设置搜索 - * @param key - * @param value - * @param type - * @see {@link #putSearch(String, String, int, boolean)} - */ - @Override - public JSONRequest putSearch(String key, String value, int type) { - putSearch(key, value, type, false); - return this; + , target == null ? value : target); } } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Logic.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Logic.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Logic.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Logic.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/ObjectParser.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/ObjectParser.java similarity index 65% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/ObjectParser.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/ObjectParser.java index 75ca1b1e9..9f16ea895 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/ObjectParser.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/ObjectParser.java @@ -14,13 +14,23 @@ package zuo.biao.apijson.server; +import static zuo.biao.apijson.JSONObject.KEY_CORRECT; +import static zuo.biao.apijson.JSONObject.KEY_DROP; +import static zuo.biao.apijson.JSONObject.KEY_TRY; import static zuo.biao.apijson.RequestMethod.PUT; +import static zuo.biao.apijson.JSONObject.KEY_CONDITION; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.regex.Pattern; import javax.validation.constraints.NotNull; @@ -29,8 +39,10 @@ import com.alibaba.fastjson.JSONObject; import apijson.demo.server.Function; +import apijson.demo.server.model.BaseModel; import zuo.biao.apijson.Log; import zuo.biao.apijson.RequestMethod; +import zuo.biao.apijson.StringUtil; import zuo.biao.apijson.server.exception.ConflictException; import zuo.biao.apijson.server.exception.NotExistException; import zuo.biao.apijson.server.sql.SQLConfig; @@ -63,24 +75,35 @@ public ParserAdapter getAdapter() { * name = null * @param parentPath * @param request + * @throws Exception */ - public ObjectParser(@NotNull JSONObject request, String parentPath, int type) { + public ObjectParser(@NotNull JSONObject request, String parentPath, int type) throws Exception { this(request, parentPath, type, null); } protected JSONObject request;//不用final是为了recycle protected String parentPath;//不用final是为了recycle + protected final boolean isEmpty;//empty有效 User:{} protected final int type; protected String path;//不用final是为了recycle protected String table;//不用final是为了recycle protected final boolean isTableKey; + + protected final boolean tri; + /** + * TODO Parser内要不因为 非 TYPE_ITEM_CHILD_0 的Table 为空导致后续中断。 + */ + protected final boolean drop; + protected JSONObject correct; + /**for single object * @param parentPath * @param request * @param name + * @throws Exception */ - public ObjectParser(@NotNull JSONObject request, String parentPath, int type, String name) { + public ObjectParser(@NotNull JSONObject request, String parentPath, int type, String name) throws Exception { if (request == null) { throw new IllegalArgumentException(TAG + ".ObjectParser request == null!!!"); } @@ -91,7 +114,84 @@ public ObjectParser(@NotNull JSONObject request, String parentPath, int type, St this.path = Parser.getAbsPath(parentPath, name); this.table = Pair.parseEntry(name, true).getKey(); this.isTableKey = zuo.biao.apijson.JSONObject.isTableKey(table); + + this.isEmpty = request.isEmpty(); + if (isEmpty) { + this.tri = false; + this.drop = false; + } else { + this.tri = request.getBooleanValue(KEY_TRY); + this.drop = request.getBooleanValue(KEY_DROP); + this.correct = request.getJSONObject(KEY_CORRECT); + + request.remove(KEY_TRY); + request.remove(KEY_DROP); + request.remove(KEY_CORRECT); + + try { + parseCorrect(); + } catch (Exception e) { + if (tri == false) { + throw e; + } + invalidate(); + } + } + + Log.d(TAG, "ObjectParser table = " + table + "; isTableKey = " + isTableKey); + Log.d(TAG, "ObjectParser isEmpty = " + isEmpty + "; tri = " + tri + "; drop = " + drop); + } + + public static final Map COMPILE_MAP; + static { + COMPILE_MAP = new HashMap(); + COMPILE_MAP.put("phone", StringUtil.PATTERN_PHONE); + COMPILE_MAP.put("email", StringUtil.PATTERN_EMAIL); + COMPILE_MAP.put("id_number", StringUtil.PATTERN_ID_CARD); + } + + protected Map corrected; + /**解析 @correct 校正 + * @throws Exception + */ + protected ObjectParser parseCorrect() throws Exception { + Set set = correct == null ? null : new HashSet<>(correct.keySet()); + + if (set != null && set.isEmpty() == false) {//对每个需要校正的key进行正则表达式匹配校正 + corrected = new HashMap<>();//TODO 返回全部correct内的内容,包括未校正的? correct); + + String value; //13000082001 + String v; // phone,id_number,card_number + String[] posibleKeys; //[phone,email,id_number,card_number] + + for (String k : set) {// k = cert + v = k == null ? null : correct.getString(k); + value = v == null ? null : request.getString(k); + posibleKeys = value == null ? null : StringUtil.split(v); + + if (posibleKeys != null && posibleKeys.length > 0) { + String rk = null; + Pattern p; + for (String pk : posibleKeys) { + p = pk == null ? null : COMPILE_MAP.get(pk); + if (p != null && p.matcher(value).matches()) { + rk = pk; + break; + } + } + + if (rk == null) { + throw new IllegalArgumentException( + "格式错误!找不到 " + k + ":" + value + " 对应[" + v + "]内的任何一项!"); + } + request.put(rk, request.remove(k)); + corrected.put(k, rk); + } + } + } + + return this; } @@ -127,53 +227,78 @@ public boolean isBreakParse() { * @throws Exception */ public ObjectParser parse() throws Exception { - breakParse = false; - - response = new JSONObject(true);//must init + if (isInvalidate() == false) { + breakParse = false; + + response = new JSONObject(true);//must init + + sqlRequest = new JSONObject(true);//must init + sqlReponse = null;//must init + customMap = null;//must init + functionMap = null;//must init + childMap = null;//must init + + Set> set = new LinkedHashSet>(request.entrySet()); + if (set != null && set.isEmpty() == false) {//判断换取少几个变量的初始化是否值得? + if (isTableKey) {//非Table下不必分离出去再添加进来 + customMap = new LinkedHashMap(); + childMap = new LinkedHashMap(); + } + functionMap = new LinkedHashMap();//必须执行 - sqlRequest = new JSONObject(true);//must init - sqlReponse = null;//must init - customMap = null;//must init - functionMap = null;//must init - childMap = null;//must init - Set> set = new LinkedHashSet>(request.entrySet()); - if (set != null && set.isEmpty() == false) {//判断换取少几个变量的初始化是否值得? - if (isTableKey) {//非Table下不必分离出去再添加进来 - customMap = new LinkedHashMap(); - childMap = new LinkedHashMap(); - } - functionMap = new LinkedHashMap();//必须执行 - - String key; - Object value; - for (Entry entry : set) { - value = entry.getValue(); - if (value == null) { - continue; + //条件<<<<<<<<<<<<<<<<<<< + List conditionList = null; + if (method == PUT) { //这里只有PUTArray需要处理 || method == DELETE) { + String[] conditions = StringUtil.split(request.getString(KEY_CONDITION)); + //Arrays.asList()返回值不支持add方法! + conditionList = new ArrayList(Arrays.asList(conditions != null ? conditions : new String[]{})); + conditionList.add(zuo.biao.apijson.JSONRequest.KEY_ID); + conditionList.add(zuo.biao.apijson.JSONRequest.KEY_ID_IN); } - key = entry.getKey(); - - if (value instanceof JSONObject) {//JSONObject,往下一级提取 - putChild(key, (JSON) value); - } else if (method == PUT && value instanceof JSONArray) {//PUT JSONArray - onPUTArrayParse(key, (JSONArray) value); - } else {//JSONArray或其它Object,直接填充 - if (onParse(key, value) == false) { - invalidate(); + //条件>>>>>>>>>>>>>>>>>>> + + String key; + Object value; + for (Entry entry : set) { + if (isBreakParse()) { + break; } - } - if (isInvalidate()) { - recycle(); - return null; - } - if (isBreakParse()) { - break; + value = entry.getValue(); + if (value == null) { + continue; + } + key = entry.getKey(); + + try { + if (value instanceof JSONObject && key.startsWith("@") == false) {//JSONObject,往下一级提取 + putChild(key, (JSON) value); + } + else if (method == PUT && value instanceof JSONArray + && BaseModel.isContain(conditionList, key) == false) {//PUT JSONArray + onPUTArrayParse(key, (JSONArray) value); + } + else {//JSONArray或其它Object,直接填充 + if (onParse(key, value) == false) { + invalidate(); + } + } + } catch (Exception e) { + if (tri == false) { + throw e;//不忽略错误,抛异常 + } + invalidate();//忽略错误,还原request + } } } } + if (isInvalidate()) { + recycle(); + return null; + } + return this; } @@ -273,6 +398,7 @@ protected boolean onParse(@NotNull String key, @NotNull Object value) throws Exc } + //TODO 需要锁表来保证获取到的 [] 不会在写入前被修改 /**PUT key:[] * @param key * @param array @@ -290,16 +416,16 @@ protected void onPUTArrayParse(@NotNull String key, @NotNull JSONArray array) th } else if (key.endsWith("-")) {//remove putType = 2; } else {//replace - throw new IllegalAccessException("PUT " + path + ", PUT Array不允许 " + key + - " 这种没有 + 或 - 结尾的key!不允许整个替换掉原来的Array!"); + // throw new IllegalAccessException("PUT " + path + ", PUT Array不允许 " + key + + // " 这种没有 + 或 - 结尾的key!不允许整个替换掉原来的Array!"); } - String realKey = Parser.getRealKey(method, key, false, false); + String realKey = SQLConfig.getRealKey(method, key, false, false); //GET > add all 或 remove all > PUT > remove key //GET <<<<<<<<<<<<<<<<<<<<<<<<< JSONObject rq = new JSONObject(); - rq.put(SQLConfig.ID, request.get(SQLConfig.ID)); + rq.put(JSONRequest.KEY_ID, request.get(JSONRequest.KEY_ID)); rq.put(JSONRequest.KEY_COLUMN, realKey); JSONObject rp = parseResponse(new JSONRequest(table, rq)); //GET >>>>>>>>>>>>>>>>>>>>>>>>> @@ -360,12 +486,12 @@ public ObjectParser executeSQL(int count, int page, int position) throws Excepti if (isTableKey == false) {//提高性能 sqlReponse = new JSONObject(sqlRequest); } else { - if (config == null) { - config = newQueryConfig(); - } - config.setCount(count).setPage(page).setPosition(position); try { + if (config == null) { + config = newSQLConfig(); + } + config.setCount(count).setPage(page).setPosition(position); sqlReponse = onSQLExecute(); } catch (Exception e) { Log.e(TAG, "getObject try { response = getSQLObject(config2); } catch (Exception e) {"); @@ -380,6 +506,10 @@ public ObjectParser executeSQL(int count, int page, int position) throws Excepti throw e; } } + + if (drop) {//丢弃Table,只为了向下提供条件 + sqlReponse = null; + } } return this; @@ -398,17 +528,25 @@ public JSONObject response() throws Exception { response.putAll(sqlReponse); } + + //把已校正的字段键值对corrected添加进来,还是correct直接改? + if (corrected != null) { + response.put(KEY_CORRECT, corrected); + } + //把isTableKey时取出去的custom重新添加回来 if (customMap != null) { response.putAll(customMap); } + + //解析函数function if (functionMap != null) { Set> functionSet = functionMap == null ? null : functionMap.entrySet(); if (functionSet != null && functionSet.isEmpty() == false) { for (Entry entry : functionSet) { - response.put(Parser.getRealKey(method, entry.getKey(), false, false) + response.put(SQLConfig.getRealKey(method, entry.getKey(), false, false) , Function.invoke(response, entry.getValue())); } } @@ -429,8 +567,8 @@ public JSONObject response() throws Exception { return response; } - protected SQLConfig newQueryConfig() { - return SQLConfig.newQueryConfig(method, table, sqlRequest); + protected SQLConfig newSQLConfig() throws Exception { + return SQLConfig.newSQLConfig(method, table, sqlRequest); } /** * response has the final value after parse (and query if isTableKey) @@ -442,6 +580,20 @@ protected void onComplete() { /**回收内存 */ public void recycle() { + //后面还可能用到,要还原 + if (tri) {//避免返回未传的字段 + request.put(KEY_TRY, tri); + } + if (drop) { + request.put(KEY_DROP, drop); + } + if (correct != null) { + request.put(KEY_CORRECT, correct); + } + + + correct = null; + corrected = null; method = null; parentPath = null; path = null; diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/OnParseCallback.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/OnParseCallback.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/OnParseCallback.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/OnParseCallback.java diff --git a/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Operation.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Operation.java new file mode 100644 index 000000000..b5678a670 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Operation.java @@ -0,0 +1,68 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.server; + +import zuo.biao.apijson.StringUtil; + +/**对请求JSON的操作 + * @author Lemon + */ +public enum Operation { + + /** + * 不允许传的字段 + */ + DISALLOW, + /** + * 必须传的字段 + */ + NECESSARY, + + /** + * 验证是否符合预设的条件 + */ + VERIFY, + /** + * 验证是否不存在,除了本身的记录 + */ + UNIQUE, + + /** + * 添加,当要被添加的对象不存在时 + */ + ADD, + /** + * 强行放入,不存在时就添加,存在时就修改 + */ + PUT, + /** + * 替换,当要被替换的对象存在时 + */ + REPLACE, + /** + * 移除,当要被移除的对象存在时 + */ + REMOVE; + + public static Operation get(String name) { + try {//Enum.valueOf只要找不到对应的值就会抛异常 + return Operation.valueOf(StringUtil.toUpperCase(name)); + } catch (Exception e) { + //empty + } + return null; + } + +} diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Pair.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Pair.java similarity index 94% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Pair.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Pair.java index ce0fc3a08..a19c8e447 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Pair.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Pair.java @@ -18,6 +18,9 @@ import java.util.HashMap; import java.util.Map; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + import zuo.biao.apijson.StringUtil; /**key:value @@ -43,6 +46,8 @@ public class Pair extends Entry { classMap.put(String.class.getSimpleName(), String.class); classMap.put(Collection.class.getSimpleName(), Collection.class);//不允许指定 classMap.put(Map.class.getSimpleName(), Map.class);//不允许指定 + classMap.put(JSONObject.class.getSimpleName(), JSONObject.class);//必须有,Map中没有getLongValue等方法 + classMap.put(JSONArray.class.getSimpleName(), JSONArray.class);//必须有,Collection中没有?等方法 } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Parser.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Parser.java similarity index 81% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Parser.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Parser.java index fd9b35085..de8dd8118 100755 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Parser.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Parser.java @@ -15,11 +15,8 @@ package zuo.biao.apijson.server; import static zuo.biao.apijson.RequestMethod.GET; -import static zuo.biao.apijson.RequestMethod.PUT; -import static zuo.biao.apijson.StringUtil.UTF_8; import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -32,7 +29,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import apijson.demo.server.AccessVerifier; +import apijson.demo.server.Verifier; +import apijson.demo.server.model.BaseModel; import apijson.demo.server.model.User; import zuo.biao.apijson.JSON; import zuo.biao.apijson.JSONResponse; @@ -42,6 +40,7 @@ import zuo.biao.apijson.StringUtil; import zuo.biao.apijson.server.exception.ConditionErrorException; import zuo.biao.apijson.server.exception.ConflictException; +import zuo.biao.apijson.server.exception.NotExistException; import zuo.biao.apijson.server.exception.NotLoggedInException; import zuo.biao.apijson.server.exception.OutOfRangeException; import zuo.biao.apijson.server.sql.SQLConfig; @@ -68,7 +67,6 @@ public Parser(RequestMethod method) { } private final RequestMethod requestMethod; - private final boolean noVerify;//方法免验证。但内容还是需要验证,避免服务端写错代码导致产生脏数据甚至清空Table /** * @param requestMethod null ? requestMethod = GET * @param noVerify 仅限于为服务端提供方法免验证特权,普通请求不要设置为true! 如果对应Table有权限也建议用默认值false,保持和客户端权限一致 @@ -76,7 +74,9 @@ public Parser(RequestMethod method) { public Parser(RequestMethod method, boolean noVerify) { super(); this.requestMethod = method == null ? GET : method; - this.noVerify = noVerify; + setNoVerifyRequest(noVerify); + setNoVerifyLogin(noVerify); + setNoVerifyRole(noVerify); } private HttpSession session;//可能比较大,占内存。而且不是所有地方都用 @@ -84,8 +84,8 @@ public Parser(RequestMethod method, boolean noVerify) { private long visitorId;//来访用户id public Parser setSession(@NotNull HttpSession session) { this.session = session; - this.visitor = AccessVerifier.getUser(session); - this.visitorId = AccessVerifier.getUserId(session); + this.visitor = Verifier.getUser(session); + this.visitorId = Verifier.getUserId(session); return this; } private RequestRole globleRole;//全局角色,对未指明角色的Table自动加上这个角色 @@ -94,9 +94,30 @@ public Parser setGlobleRole(RequestRole globleRole) { return this; } + //一定要验证结构!对管理员也要验证! + private boolean noVerifyRequest = false; + private boolean noVerifyLogin = false; + private boolean noVerifyRole = false; + public Parser setNoVerifyRequest(boolean noVerifyRequest) { + this.noVerifyRequest = noVerifyRequest; + return this; + } + public Parser setNoVerifyLogin(boolean noVerifyLogin) { + this.noVerifyLogin = noVerifyLogin; + return this; + } + public Parser setNoVerifyRole(boolean noVerifyRole) { + this.noVerifyRole = noVerifyRole; + return this; + } + + + + + private JSONObject requestObject; - private SQLExecutor sQLExecutor; + private SQLExecutor sqlExecutor; private Map queryResultMap;//path-result @@ -111,6 +132,7 @@ public String parse(String request) { * @param request * @return */ + @NotNull public String parse(JSONObject request) { return JSON.toJSONString(parseResponse(request)); } @@ -119,12 +141,13 @@ public String parse(JSONObject request) { * @param request 先parseRequest中URLDecoder.decode(request, UTF_8);再parseResponse(getCorrectRequest(...)) * @return parseResponse(requestObject); */ + @NotNull public JSONObject parseResponse(String request) { Log.d(TAG, "\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" + requestMethod + "/parseResponse request = \n" + request + "\n\n"); try { - requestObject = getCorrectRequest(requestMethod, parseRequest(request, requestMethod)); + requestObject = parseRequest(request, requestMethod); } catch (Exception e) { return newErrorResult(e); } @@ -136,24 +159,34 @@ public JSONObject parseResponse(String request) { * @param request * @return requestObject */ + @NotNull public JSONObject parseResponse(JSONObject request) { long startTime = System.currentTimeMillis(); Log.d(TAG, "parseResponse startTime = " + startTime + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n\n "); - if (noVerify == false) { - //TODO 暂时去掉,方便测试 - if (RequestMethod.isPublicMethod(requestMethod) == false) { - try { - AccessVerifier.verifyLogin(session); - } catch (Exception e) { - return Parser.newErrorResult(e); + requestObject = request; + if (RequestMethod.isPublicMethod(requestMethod) == false) { + try { + //TODO + // if (noVerifyLogin == false) { + // Verifier.verifyLogin(session); + // } + if (noVerifyRequest == false) { + //补充全局缺省版本号 + if (session != null && requestObject.getIntValue(JSONRequest.KEY_VERSION) <= 0) { + requestObject.put(JSONRequest.KEY_VERSION, session.getAttribute(JSONRequest.KEY_VERSION)); + } + + requestObject = getCorrectRequest(requestMethod, requestObject); } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); } + } - if (globleRole == null) { - setGlobleRole(RequestRole.get(request.getString(JSONRequest.KEY_ROLE))); - } + if (noVerifyRole == false && globleRole == null) { + setGlobleRole(RequestRole.get(requestObject.getString(JSONRequest.KEY_ROLE))); } final String requestString = JSON.toJSONString(request);//request传进去解析后已经变了 @@ -162,22 +195,19 @@ public JSONObject parseResponse(JSONObject request) { queryResultMap = new HashMap(); Exception error = null; - sQLExecutor = new SQLExecutor(); + sqlExecutor = new SQLExecutor(); try { requestObject = getObject(null, null, request); } catch (Exception e) { e.printStackTrace(); error = e; } - sQLExecutor.close(); - sQLExecutor = null; + sqlExecutor.close(); + sqlExecutor = null; - if (noVerify == false) { - requestObject = AccessVerifier.removeAccessInfo(requestObject); - } - requestObject = error == null ? extendSuccessResult(requestObject) - : extendResult(requestObject, JSONResponse.CODE_PARTIAL_SUCCEED, "未完成全部请求:\n " + error.getMessage()); + requestObject = Verifier.removeAccessInfo(requestObject); + requestObject = error == null ? extendSuccessResult(requestObject) : extendErrorResult(requestObject, error); queryResultMap.clear(); @@ -203,14 +233,22 @@ public JSONObject parseResponse(JSONObject request) { * @return * @throws Exception */ + @NotNull public static JSONObject parseRequest(String request, RequestMethod method) throws Exception { - request = URLDecoder.decode(request, UTF_8); + //全走HTTP POST,不用encode和decode + // if (RequestMethod.isPublicMethod(method)) { + // request = URLDecoder.decode(request, UTF_8); + // Log.d(TAG, "\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n " + method + // + "/parseRequest request = \n" + request + "\n\n"); + // } if (method == null) { method = GET; } - Log.d(TAG, "\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n " + method - + "/parseResponse request = \n" + request + "\n\n"); - return JSON.parseObject(request); + JSONObject obj = JSON.parseObject(request); + if (obj == null) { + throw new UnsupportedEncodingException("JSON格式不合法!"); + } + return obj; } @@ -235,7 +273,13 @@ public static JSONObject extendResult(JSONObject object, int code, String msg) { if (object == null) { object = new JSONObject(true); } - object.put(JSONResponse.KEY_CODE, code); + if (object.containsKey(JSONResponse.KEY_CODE) == false) { + object.put(JSONResponse.KEY_CODE, code); + } + String m = StringUtil.getString(object.getString(JSONResponse.KEY_MSG)); + if (m.isEmpty() == false) { + msg = m + " \n " + StringUtil.getString(msg); + } object.put(JSONResponse.KEY_MSG, msg); return object; } @@ -246,13 +290,13 @@ public static JSONObject extendResult(JSONObject object, int code, String msg) { * @return */ public static JSONObject extendSuccessResult(JSONObject object) { - return extendResult(object, 200, "success"); + return extendResult(object, JSONResponse.CODE_SUCCESS, JSONResponse.MSG_SUCCEED); } /**获取请求成功的状态内容 * @return */ public static JSONObject newSuccessResult() { - return newResult(200, "success"); + return newResult(JSONResponse.CODE_SUCCESS, JSONResponse.MSG_SUCCEED); } /**添加请求成功的状态内容 * @param object @@ -270,7 +314,7 @@ public static JSONObject newErrorResult(Exception e) { if (e != null) { e.printStackTrace(); - int code = JSONResponse.CODE_NOT_FOUND; + int code; if (e instanceof UnsupportedEncodingException) { code = JSONResponse.CODE_UNSUPPORTED_ENCODING; } @@ -280,6 +324,9 @@ else if (e instanceof IllegalAccessException) { else if (e instanceof UnsupportedOperationException) { code = JSONResponse.CODE_UNSUPPORTED_OPERATION; } + else if (e instanceof NotExistException) { + code = JSONResponse.CODE_NOT_FOUND; + } else if (e instanceof IllegalArgumentException) { code = JSONResponse.CODE_ILLEGAL_ARGUMENT; } @@ -304,11 +351,14 @@ else if (e instanceof OutOfRangeException) { else if (e instanceof NullPointerException) { code = JSONResponse.CODE_NULL_POINTER; } + else { + code = JSONResponse.CODE_SERVER_ERROR; + } return newResult(code, e.getMessage()); } - return newResult(500, "服务器内部错误"); + return newResult(JSONResponse.CODE_SERVER_ERROR, JSONResponse.MSG_SERVER_ERROR); } @@ -321,20 +371,21 @@ else if (e instanceof NullPointerException) { * @return * @throws Exception */ - public static JSONObject getCorrectRequest(RequestMethod method, JSONObject request) throws Exception { + public static JSONObject getCorrectRequest(@NotNull RequestMethod method, JSONObject request) throws Exception { if (RequestMethod.isPublicMethod(method)) { return request;//需要指定JSON结构的get请求可以改为post请求。一般只有对安全性要求高的才会指定,而这种情况用明文的GET方式几乎肯定不安全 } String tag = request.getString(JSONRequest.KEY_TAG); if (StringUtil.isNotEmpty(tag, true) == false) { - throw new IllegalArgumentException("请指定tag!一般是table名称"); + throw new IllegalArgumentException("请设置tag!一般是Table名"); } + int version = request.getIntValue(JSONRequest.KEY_VERSION); JSONObject object = null; String error = ""; try { - object = getStructure(method, "Request", JSONRequest.KEY_TAG, tag); + object = getStructure(method, "Request", JSONRequest.KEY_TAG, tag, version); } catch (Exception e) { error = e.getMessage(); } @@ -352,6 +403,7 @@ public static JSONObject getCorrectRequest(RequestMethod method, JSONObject requ //获取指定的JSON结构 >>>>>>>>>>>>>> request.remove(JSONRequest.KEY_TAG); + request.remove(JSONRequest.KEY_VERSION); return Structure.parseRequest(method, "", (JSONObject) target.clone(), request); } @@ -362,7 +414,7 @@ public static JSONObject getCorrectRequest(RequestMethod method, JSONObject requ * @return * @throws Exception */ - public static JSONObject getCorrectResponse(final RequestMethod method + public static JSONObject getCorrectResponse(@NotNull final RequestMethod method , String table, JSONObject response) throws Exception { // Log.d(TAG, "getCorrectResponse method = " + method + "; table = " + table); // if (response == null || response.isEmpty()) {//避免无效空result:{}添加内容后变有效 @@ -387,10 +439,12 @@ public static JSONObject getCorrectResponse(final RequestMethod method * @param table * @param key * @param value + * @param version * @return * @throws Exception */ - public static JSONObject getStructure(RequestMethod method, String table, String key, String value) throws Exception { + public static JSONObject getStructure(@NotNull final RequestMethod method, @NotNull String table, + String key, String value, int version) throws Exception { //获取指定的JSON结构 <<<<<<<<<<<<<< SQLConfig config = new SQLConfig(GET, table); config.setColumn("structure"); @@ -400,7 +454,12 @@ public static JSONObject getStructure(RequestMethod method, String table, String if (key != null) { where.put(key, value); } + if (version > 0) { + where.put(JSONRequest.KEY_VERSION + "{}", ">=" + version); + } config.setWhere(where); + config.setOrder(JSONRequest.KEY_VERSION + (version > 0 ? "+" : "-")); + config.setCount(1); SQLExecutor qh = new SQLExecutor(); @@ -487,7 +546,12 @@ public com.alibaba.fastjson.JSON parseChild(@NotNull String path, @NotNull Strin @Override public JSONObject parseResponse(JSONRequest request) throws Exception { - return new Parser(GET, noVerify).setSession(session).parseResponse(request); + return new Parser(GET) + .setSession(session) + // .setNoVerifyRequest(noVerifyRequest) + .setNoVerifyLogin(noVerifyLogin) + .setNoVerifyRole(noVerifyRole) + .parseResponse(request); } // @Override @@ -593,11 +657,13 @@ private JSONArray getArray(String parentPath, String name, final JSONObject requ //key[]:{Table:{}}中key equals Table时 提取Table - boolean isContainer = true; int index = name == null ? -1 : name.lastIndexOf("[]"); - String table = index <= 0 ? null : Pair.parseEntry(name.substring(0, index), true).getKey(); - if (JSONRequest.isTableKey(table) && request.containsKey(table)) { - isContainer = false; + String childPath = index <= 0 ? null : Pair.parseEntry(name.substring(0, index), true).getKey(); // Table-key1-key2... + + //判断第一个key,即Table是否存在,如果存在就提取 + String[] childKeys = StringUtil.split(childPath, "-", false); + if (childKeys == null || childKeys.length <= 0 || request.containsKey(childKeys[0]) == false) { + childKeys = null; } @@ -612,7 +678,7 @@ private JSONArray getArray(String parentPath, String name, final JSONObject requ break; } //key[]:{Table:{}}中key equals Table时 提取Table - response.add(isContainer ? parent : parent.getJSONObject(table) ); + response.add(getValue(parent, childKeys)); //null有意义 } //Table>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -626,6 +692,29 @@ private JSONArray getArray(String parentPath, String name, final JSONObject requ } + /**根据路径取值 + * @param parent + * @param pathKeys + * @return + */ + private static Object getValue(JSONObject parent, String[] pathKeys) { + if (parent == null || pathKeys == null || pathKeys.length <= 0) { + Log.w(TAG, "getChild parent == null || pathKeys == null || pathKeys.length <= 0 >> return parent;"); + return parent; + } + + //逐层到达child的直接容器JSONObject parent + final int last = pathKeys.length - 1; + for (int i = 0; i < last; i++) {//一步一步到达指定位置 + if (parent == null) {//不存在或路径错误(中间的key对应value不是JSONObject) + break; + } + parent = getJSONObject(parent, pathKeys[i]); + } + + return parent == null ? null : parent.get(pathKeys[last]); + } + /**获取被依赖引用的key的路径, 实时替换[] -> []/i * @param parentPath @@ -729,7 +818,7 @@ private Object getValueByPath(String valuePath) { JSONObject parent = null; String[] keys = null; for (String path : set) { - if (valuePath.startsWith(path)) { + if (valuePath.startsWith(path + "/")) { try { parent = (JSONObject) queryResultMap.get(path); } catch (Exception e) { @@ -781,7 +870,7 @@ public static JSONObject getJSONObject(JSONObject object, String key) { */ private synchronized JSONObject getSQLObject(SQLConfig config) throws Exception { Log.i(TAG, "getSQLObject config = " + JSON.toJSONString(config)); - if (noVerify == false) { + if (noVerifyRole == false) { if (config.getRole() == null) { if (globleRole != null) { config.setRole(globleRole); @@ -789,75 +878,9 @@ private synchronized JSONObject getSQLObject(SQLConfig config) throws Exception config.setRole(visitorId <= 0 ? RequestRole.UNKNOWN : RequestRole.LOGIN); } } - AccessVerifier.verify(config, visitor); - } - return getCorrectResponse(requestMethod, config.getTable(), sQLExecutor.execute(config)); - } - - - - /**获取客户端实际需要的key - * @param method - * @param originKey - * @param isTableKey - * @param saveLogic 保留逻辑运算符 & | ! - * @return - */ - public static String getRealKey(RequestMethod method, String originKey, boolean isTableKey, boolean saveLogic) - throws Exception { - Log.i(TAG, "getRealKey saveLogic = " + saveLogic + "; originKey = " + originKey); - if (originKey == null || zuo.biao.apijson.JSONObject.isArrayKey(originKey)) { - Log.w(TAG, "getRealKey originKey == null || isArrayKey(originKey) >> return originKey;"); - return originKey; - } - - String key = new String(originKey); - if (key.endsWith("$")) {//搜索,查询时处理 - key = key.substring(0, key.length() - 1); - } else if (key.endsWith("{}")) {//被包含,或者说key对应值处于value的范围内。查询时处理 - key = key.substring(0, key.length() - 2); - } else if (key.endsWith("<>")) {//包含,或者说value处于key对应值的范围内。查询时处理 - key = key.substring(0, key.length() - 2); - } else if (key.endsWith("()")) {//方法,查询完后处理,先用一个Map保存? - key = key.substring(0, key.length() - 2); - } else if (key.endsWith("@")) {//引用,引用对象查询完后处理。fillTarget中暂时不用处理,因为非GET请求都是由给定的id确定,不需要引用 - key = key.substring(0, key.length() - 1); - } else if (key.endsWith("+")) {//延长,PUT查询时处理 - if (method == PUT) {//不为PUT就抛异常 - key = key.substring(0, key.length() - 1); - } - } else if (key.endsWith("-")) {//缩减,PUT查询时处理 - if (method == PUT) {//不为PUT就抛异常 - key = key.substring(0, key.length() - 1); - } - } - - String last = null;//不用Logic优化代码,否则 key 可能变为 key| 导致 key=value 变成 key|=value 而出错 - if (RequestMethod.isQueryMethod(method)) {//逻辑运算符仅供GET,HEAD方法使用 - last = key.isEmpty() ? "" : key.substring(key.length() - 1); - if ("&".equals(last) || "|".equals(last) || "!".equals(last)) { - key = key.substring(0, key.length() - 1); - } else { - last = null;//避免key + StringUtil.getString(last)错误延长 - } - } - - //"User:toUser":User转换"toUser":User, User为查询同名Table得到的JSONObject。交给客户端处理更好 - if (isTableKey) {//不允许在column key中使用Type:key形式 - key = Pair.parseEntry(key, true).getKey();//table以左边为准 - } else { - key = Pair.parseEntry(key).getValue();//column以右边为准 - } - - if (StringUtil.isWord(key.startsWith("@") ? key.substring(1) : key) == false) { - throw new IllegalArgumentException(TAG + "/" + method + " getRealKey: 字符 " + originKey + " 不合法!"); - } - - if (saveLogic && last != null) { - key = key + last; + Verifier.verify(config, visitor); } - Log.i(TAG, "getRealKey return key = " + key); - return key; + return getCorrectResponse(requestMethod, config.getTable(), sqlExecutor.execute(config)); } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/ParserAdapter.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/ParserAdapter.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/ParserAdapter.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/ParserAdapter.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Structure.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Structure.java similarity index 51% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Structure.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Structure.java index 8a380d89c..1c836146d 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Structure.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/Structure.java @@ -14,8 +14,16 @@ package zuo.biao.apijson.server; -import static zuo.biao.apijson.JSONResponse.KEY_ID; -import static zuo.biao.apijson.RequestMethod.POST; +import static zuo.biao.apijson.JSONRequest.KEY_ID; +import static zuo.biao.apijson.JSONRequest.KEY_ID_IN; +import static zuo.biao.apijson.server.Operation.ADD; +import static zuo.biao.apijson.server.Operation.DISALLOW; +import static zuo.biao.apijson.server.Operation.NECESSARY; +import static zuo.biao.apijson.server.Operation.PUT; +import static zuo.biao.apijson.server.Operation.REMOVE; +import static zuo.biao.apijson.server.Operation.REPLACE; +import static zuo.biao.apijson.server.Operation.UNIQUE; +import static zuo.biao.apijson.server.Operation.VERIFY; import java.util.ArrayList; import java.util.Arrays; @@ -24,6 +32,7 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; +import java.util.regex.Pattern; import javax.activation.UnsupportedDataTypeException; import javax.validation.constraints.NotNull; @@ -31,46 +40,54 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import apijson.demo.server.Verifier; +import apijson.demo.server.model.BaseModel; import zuo.biao.apijson.JSON; +import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.RequestMethod; import zuo.biao.apijson.RequestRole; import zuo.biao.apijson.StringUtil; +import zuo.biao.apijson.model.Test; +import zuo.biao.apijson.server.sql.SQLConfig; +import zuo.biao.apijson.server.sql.SQLExecutor; //TODO 放到 zuo.biao.apijson 包内,供Android客户端校验请求结构 /**结构类 - * 增删改查: operation(add,replace,put,remove) operation:{key0:value0, key1:value1 ...} - * 对值校验: verify:{key0:value0, key1:value1 ...} (key{}:range,key$:"%m%"等) + * 增删改查: OPERATION(ADD,REPLACE,PUT,REMOVE) OPERATION:{key0:value0, key1:value1 ...} + * 对值校验: VERIFY:{key0:value0, key1:value1 ...} (key{}:range,key$:"%m%"等) + * 对值重复性校验: UNIQUE:"key0:, key1 ..." (UNIQUE:"phone,email" 等) * @author Lemon */ public class Structure { private static final String TAG = "Structure"; + private Structure() {} - static final String requestString = "{\"Comment\":{\"disallow\": \"id\", \"necessary\": \"userId,momentId,content\"}, \"add\":{\"Comment:to\":{}}}"; - static final String responseString = "{\"User\":{\"remove\": \"phone\", \"replace\":{\"sex\":2}, \"add\":{\"name\":\"api\"}}, \"put\":{\"Comment:to\":{}}}"; + static final String requestString = "{\"Comment\":{\"DISALLOW\": \"id\", \"NECESSARY\": \"userId,momentId,content\"}, \"ADD\":{\"Comment:to\":{}}}"; + static final String responseString = "{\"User\":{\"REMOVE\": \"phone\", \"REPLACE\":{\"sex\":2}, \"ADD\":{\"name\":\"api\"}}, \"PUT\":{\"Comment:to\":{}}}"; public static void test() throws Exception { JSONObject request; try { request = JSON.parseObject("{\"Comment\":{\"userId\":0}}"); - Log.d(TAG, "test parseRequest = " + parseRequest(POST, "", JSON.parseObject(requestString), request)); + Log.d(TAG, "test parseRequest = " + parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request)); } catch (Exception e) { e.printStackTrace(); } try { request = JSON.parseObject("{\"Comment\":{\"userId\":0, \"momentId\":0, \"content\":\"apijson\"}}"); - Log.d(TAG, "test parseRequest = " + parseRequest(POST, "", JSON.parseObject(requestString), request)); + Log.d(TAG, "test parseRequest = " + parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request)); } catch (Exception e) { e.printStackTrace(); } try { request = JSON.parseObject("{\"Comment\":{\"id\":0, \"userId\":0, \"momentId\":0, \"content\":\"apijson\"}}"); - Log.d(TAG, "test parseRequest = " + parseRequest(POST, "", JSON.parseObject(requestString), request)); + Log.d(TAG, "test parseRequest = " + parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request)); } catch (Exception e) { e.printStackTrace(); } @@ -104,26 +121,6 @@ public static void test() throws Exception { } - - //TODO 放在一个 enum StructureOperate - public static final int TYPE_DEFAULT = 0; - public static final int TYPE_VERIFY = 1; - public static final int TYPE_ADD = 2; - public static final int TYPE_PUT = 3; - public static final int TYPE_REPLACE = 4; - public static final int TYPE_REMOVE = 5; - - public static final String NAME_VERIFY = "verify"; - - public static final String NAME_ADD = "add"; - public static final String NAME_PUT = "put"; - public static final String NAME_REPLACE = "replace"; - public static final String NAME_REMOVE = "remove"; - - public static final String NAME_DISALLOW = "disallow"; - public static final String NAME_NECESSARY = "necessary"; - - /**从request提取target指定的内容 * @param method @@ -133,7 +130,7 @@ public static void test() throws Exception { * @return * @throws Exception */ - public static JSONObject parseRequest(final RequestMethod method, final String name + public static JSONObject parseRequest(@NotNull final RequestMethod method, final String name , final JSONObject target, final JSONObject request) throws Exception { Log.i(TAG, "parseRequest method = " + method + "; name = " + name + "; target = \n" + JSON.toJSONString(target) @@ -157,16 +154,38 @@ public JSONObject onParseJSONObject(String key, JSONObject tobj, JSONObject robj // Log.i(TAG, "parseRequest.parse.onParseJSONObject key = " + key + "; robj = " + robj); if (robj == null) { if (tobj != null) {//不允许不传Target中指定的Table - throw new IllegalArgumentException("请设置 " + key + " !"); + throw new IllegalArgumentException(method.name() + "请求,请设置 " + key + " !"); } } else if (zuo.biao.apijson.JSONObject.isTableKey(key)) { - if (method == POST) { + if (method == RequestMethod.POST) { if (robj.containsKey(KEY_ID)) { - throw new IllegalArgumentException("POST " + key + " 请求不能设置" + KEY_ID + "!"); + throw new IllegalArgumentException("POST请求, " + key + " 不能设置 " + KEY_ID + " !"); } } else { - if (RequestMethod.isQueryMethod(method) == false && robj.containsKey(KEY_ID) == false) { - throw new IllegalArgumentException("请设置 " + key + " 的 " + KEY_ID + "!"); + if (RequestMethod.isQueryMethod(method) == false) { + //单个修改或删除 + Object id = robj.get(KEY_ID); //如果必须传 id ,可在Request表中配置necessary + if (id != null) { + if (id instanceof Number == false) { + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面的 " + KEY_ID_IN + ":value 中value的类型只能是Long!"); + } + } else { + //批量修改或删除 + Object arr = robj.get(KEY_ID_IN); //如果必须传 id{} ,可在Request表中配置necessary + if (arr == null) { + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面 " + KEY_ID + " 和 " + KEY_ID_IN + " 必须传其中一个!"); + } + if (arr instanceof JSONArray == false) { + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面的 " + KEY_ID_IN + ":value 中value的类型只能是 [Long] !"); + } + if (((JSONArray)arr).size() > 10) { //不允许一次操作10条以上记录 + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面的 " + KEY_ID_IN + ":[] 中[]的长度不能超过10!"); + } + } } } } @@ -183,11 +202,11 @@ public JSONObject onParseJSONObject(String key, JSONObject tobj, JSONObject robj * @param name * @param target * @param response - * @param callback + * @param callback * @return * @throws Exception */ - public static JSONObject parseResponse(final RequestMethod method, final String name + public static JSONObject parseResponse(@NotNull final RequestMethod method, final String name , final JSONObject target, final JSONObject response, OnParseCallback callback) throws Exception { Log.i(TAG, "parseResponse method = " + method + "; name = " + name + "; target = \n" + JSON.toJSONString(target) @@ -217,24 +236,26 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real //获取配置<<<<<<<<<<<<<<<<<<<<<<<<<<<< - JSONObject verify = target.getJSONObject(NAME_VERIFY); - JSONObject add = target.getJSONObject(NAME_ADD); - JSONObject put = target.getJSONObject(NAME_PUT); - JSONObject replace = target.getJSONObject(NAME_REPLACE); + JSONObject verify = target.getJSONObject(VERIFY.name()); + JSONObject add = target.getJSONObject(ADD.name()); + JSONObject put = target.getJSONObject(PUT.name()); + JSONObject replace = target.getJSONObject(REPLACE.name()); - String remove = StringUtil.getNoBlankString(target.getString(NAME_REMOVE)); - String necessary = StringUtil.getNoBlankString(target.getString(NAME_NECESSARY)); - String disallow = StringUtil.getNoBlankString(target.getString(NAME_DISALLOW)); + String unique = StringUtil.getNoBlankString(target.getString(UNIQUE.name())); + String remove = StringUtil.getNoBlankString(target.getString(REMOVE.name())); + String necessary = StringUtil.getNoBlankString(target.getString(NECESSARY.name())); + String disallow = StringUtil.getNoBlankString(target.getString(DISALLOW.name())); //不还原,传进来的target不应该是原来的 - target.remove(NAME_VERIFY); - target.remove(NAME_ADD); - target.remove(NAME_PUT); - target.remove(NAME_REPLACE); - - target.remove(NAME_REMOVE); - target.remove(NAME_NECESSARY); - target.remove(NAME_DISALLOW); + target.remove(VERIFY.name()); + target.remove(ADD.name()); + target.remove(PUT.name()); + target.remove(REPLACE.name()); + + target.remove(UNIQUE.name()); + target.remove(REMOVE.name()); + target.remove(NECESSARY.name()); + target.remove(DISALLOW.name()); //获取配置>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -242,7 +263,7 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real //移除字段<<<<<<<<<<<<<<<<<<< - String[] removes = StringUtil.split(StringUtil.getNoBlankString(remove)); + String[] removes = StringUtil.split(remove); if (removes != null && removes.length > 0) { for (String r : removes) { real.remove(r); @@ -254,7 +275,7 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real String[] necessarys = StringUtil.split(necessary); List necessaryList = necessarys == null ? new ArrayList() : Arrays.asList(necessarys); for (String s : necessaryList) { - if (real.containsKey(s) == false) { + if (real.get(s) == null) {//可能传null进来,这里还会通过 real.containsKey(s) == false) { throw new IllegalArgumentException(name + "不能缺少 " + s + " 等[" + necessary + "]内的任何字段!"); } @@ -283,7 +304,7 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real for (String s : disallowList) { if (real.containsKey(s)) { throw new IllegalArgumentException(name - + "不允许传 " + s + " 等[" + disallow + "]内的任何字段!"); + + "不允许传 " + s + " 等" + StringUtil.getString(disallowList) + "内的任何字段!"); } } //判断是否都有不允许的字段>>>>>>>>>>>>>>>>>>> @@ -343,12 +364,23 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real //校验与修改Request<<<<<<<<<<<<<<<<< //在tableKeySet校验后操作,避免 导致put/add进去的Table 被当成原Request的内容 - real = operate(TYPE_VERIFY, verify, real); - real = operate(TYPE_ADD, add, real); - real = operate(TYPE_PUT, put, real); - real = operate(TYPE_REPLACE, replace, real); + real = operate(VERIFY, verify, real); + real = operate(ADD, add, real); + real = operate(PUT, put, real); + real = operate(REPLACE, replace, real); //校验与修改Request>>>>>>>>>>>>>>>>> + //TODO放在operate前?考虑性能、operate修改后再验证的值是否和原来一样 + //校验重复<<<<<<<<<<<<<<<<<<< + String[] uniques = StringUtil.split(unique); + if (BaseModel.isEmpty(uniques) == false) { + long exceptId = real.getLongValue(KEY_ID); + for (String u : uniques) { + Verifier.verifyRepeat(name, u, real.get(u), exceptId); + } + } + //校验重复>>>>>>>>>>>>>>>>>>> + Log.i(TAG, "parse return real = " + JSON.toJSONString(real)); return real; } @@ -356,13 +388,13 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real /**执行操作 - * @param type + * @param opt * @param targetChild * @param real * @return * @throws Exception */ - private static JSONObject operate(int type, JSONObject targetChild, JSONObject real) throws Exception { + private static JSONObject operate(Operation opt, JSONObject targetChild, JSONObject real) throws Exception { if (targetChild == null) { return real; } @@ -370,17 +402,11 @@ private static JSONObject operate(int type, JSONObject targetChild, JSONObject r throw new IllegalArgumentException("operate real == null!!!"); } - if (type <= TYPE_DEFAULT || type > TYPE_REMOVE) { - return real; - } - Set> set = new LinkedHashSet<>(targetChild.entrySet()); String tk; Object tv; - String rk; - Object rv; - Logic logic; + for (Entry e : set) { tk = e == null ? null : e.getKey(); if (tk == null) { @@ -388,87 +414,178 @@ private static JSONObject operate(int type, JSONObject targetChild, JSONObject r } tv = e.getValue(); - - if (type == TYPE_VERIFY) {//TODO {}, $, <> - if (tv == null) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY >> tv == null!!!"); + if (opt == VERIFY) { + verify(tk, tv, real); + } else if (opt == PUT) { + real.put(tk, tv); + } else { + if (real.containsKey(tk)) { + if (opt == REPLACE) { + real.put(tk, tv); + } + } else { + if (opt == ADD) { + real.put(tk, tv); + } } + } + } - if (tk.endsWith("{}")) {//rv符合tv条件或在tv内 - logic = new Logic(tk.substring(0, tk.length() - 2)); - rk = logic.getKey(); - rv = real.get(rk); - - if (tv instanceof String) {//TODO >= 0, < 10 - //TODO - } else if (tv instanceof JSONArray) { - if (((JSONArray) tv).contains(rv) == logic.isNot()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> ((JSONArray) tv).contains(rv) == logic.isNot()"); - } - } else { - throw new UnsupportedDataTypeException(""); - } - } else if (tk.endsWith("<>")) {//rv包含tv内的值 - logic = new Logic(tk.substring(0, tk.length() - 2)); - rk = logic.getKey(); - rv = real.get(rk); + return real; + } - if (rv instanceof JSONArray == false) { - throw new UnsupportedDataTypeException(""); - } - JSONArray array; - if (tv instanceof JSONArray) { - array = (JSONArray) tv; - } else { - array = new JSONArray(); - array.add(tv); - } + /**验证值 + * @param tk + * @param tv + * @param real + * @throws Exception + */ + private static void verify(@NotNull String tk, @NotNull Object tv, @NotNull JSONObject real) throws Exception { + if (tv == null) { + throw new IllegalArgumentException("operate operate == VERIFY " + tk + ":" + tv + " , >> tv == null!!!"); + } - boolean isOr = false; - for (Object o : array) { - if (((JSONArray) rv).contains(o)) { - if (logic.isNot()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> ((JSONArray) rv).contains(o) >> logic.isNot()"); - } - if (logic.isOr()) { - isOr = true; - break; - } - } else { - if (logic.isAnd()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> ((JSONArray) rv).contains(o) == false >> logic.isAnd()"); - } - } - } + String rk; + Object rv; + Logic logic; + if (tk.endsWith("$")) { //搜索 + sqlVerify("$", real, tk, tv); + } + else if (tk.endsWith("?")) { //正则表达式 + logic = new Logic(tk.substring(0, tk.length() - 1)); + rk = logic.getKey(); + rv = real.get(rk); + if (rv == null) { + return; + } - if (isOr == false && logic.isOr()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> isOr == false && logic.isOr()"); + JSONArray array = SQLConfig.newJSONArray(tv); + + boolean m; + boolean isOr = false; + Pattern reg; + for (Object r : array) { + if (r instanceof String == false) { + throw new UnsupportedDataTypeException(rk + ":" + rv + " 中value只支持 String 或 [String] 类型!"); + } + reg = ObjectParser.COMPILE_MAP.get(r); + if (reg == null) { + reg = Pattern.compile((String) r); + } + m = reg.matcher("" + rv).matches(); + if (m) { + if (logic.isNot()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + if (logic.isOr()) { + isOr = true; + break; + } + } else { + if (logic.isAnd()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); } - } else if (tk.endsWith("$")) {//TODO 正则表达式? + } + } + if (isOr == false && logic.isOr()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + } + else if (tk.endsWith("{}")) { //rv符合tv条件或在tv内 + if (tv instanceof String) {//TODO >= 0, < 10 + sqlVerify("{}", real, tk, tv); + } + else if (tv instanceof JSONArray) { + logic = new Logic(tk.substring(0, tk.length() - 2)); + rk = logic.getKey(); + rv = real.get(rk); + if (rv == null) { + return; } - } else if (type == TYPE_PUT) { - real.put(tk, tv); - } else { - if (real.containsKey(tk)) { - if (type == TYPE_REPLACE) { - real.put(tk, tv); + if (((JSONArray) tv).contains(rv) == logic.isNot()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + } + else { + throw new UnsupportedDataTypeException("服务器Request表verify配置错误!"); + } + } + else if (tk.endsWith("<>")) { //rv包含tv内的值 + logic = new Logic(tk.substring(0, tk.length() - 2)); + rk = logic.getKey(); + rv = real.get(rk); + if (rv == null) { + return; + } + + if (rv instanceof JSONArray == false) { + throw new UnsupportedDataTypeException("服务器Request表verify配置错误!"); + } + + JSONArray array = SQLConfig.newJSONArray(tv); + + boolean isOr = false; + for (Object o : array) { + if (((JSONArray) rv).contains(o)) { + if (logic.isNot()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + if (logic.isOr()) { + isOr = true; + break; } } else { - if (type == TYPE_ADD) { - real.put(tk, tv); + if (logic.isAnd()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); } } } + + if (isOr == false && logic.isOr()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } } + else { + throw new IllegalArgumentException("服务器Request表verify配置错误!"); + } + } - return real; + /**通过数据库执行SQL语句来验证条件 + * @param funChar + * @param real + * @param tk + * @param tv + * @throws Exception + */ + private static void sqlVerify(@NotNull String funChar, JSONObject real, String tk, Object tv) throws Exception { + //不能用Parser, 0 这种不符合 StringUtil.isName ! + Logic logic = new Logic(tk.substring(0, tk.length() - funChar.length())); + String rk = logic.getKey(); + Object rv = real.get(rk); + if (rv == null) { + return; + } + + SQLConfig config = new SQLConfig(RequestMethod.HEAD, 1, 0); + config.setTable(Test.class.getSimpleName()); + config.setTest(true); + config.addWhere("'" + rv + "'" + logic.getChar() + funChar, tv); + + SQLExecutor executor = new SQLExecutor(); + JSONObject result = null; + try { + result = executor.execute(config); + } catch (Exception e) { + throw e; + } finally { + executor.close(); + } + if (result != null && JSONResponse.isExist(result.getIntValue(JSONResponse.KEY_COUNT)) == false) { + throw new IllegalArgumentException(rk + ":" + rv + "中value不合法!必须匹配 " + logic.getChar() + tv + " !"); + } } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/exception/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/exception/package-info.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/package-info.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java similarity index 55% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java index d11b8b7bb..8e344c090 100755 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java @@ -14,15 +14,20 @@ package zuo.biao.apijson.server.sql; +import static zuo.biao.apijson.JSONObject.KEY_ABOUT; import static zuo.biao.apijson.JSONObject.KEY_COLUMN; +import static zuo.biao.apijson.JSONObject.KEY_CONDITION; import static zuo.biao.apijson.JSONObject.KEY_GROUP; import static zuo.biao.apijson.JSONObject.KEY_HAVING; +import static zuo.biao.apijson.JSONObject.KEY_ID; +import static zuo.biao.apijson.JSONObject.KEY_ID_IN; import static zuo.biao.apijson.JSONObject.KEY_ORDER; import static zuo.biao.apijson.JSONObject.KEY_ROLE; import static zuo.biao.apijson.JSONObject.KEY_SCHEMA; import static zuo.biao.apijson.JSONRequest.KEY_COUNT; import static zuo.biao.apijson.JSONRequest.KEY_PAGE; import static zuo.biao.apijson.JSONRequest.KEY_QUERY; +import static zuo.biao.apijson.RequestMethod.DELETE; import static zuo.biao.apijson.RequestMethod.GET; import static zuo.biao.apijson.RequestMethod.POST; import static zuo.biao.apijson.RequestMethod.PUT; @@ -31,27 +36,33 @@ import static zuo.biao.apijson.SQL.OR; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import javax.validation.constraints.NotNull; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; +import apijson.demo.server.model.BaseModel; +import apijson.demo.server.model.Privacy; import apijson.demo.server.model.User; -import apijson.demo.server.model.UserPrivacy; -import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.RequestMethod; import zuo.biao.apijson.RequestRole; import zuo.biao.apijson.SQL; import zuo.biao.apijson.StringUtil; +import zuo.biao.apijson.model.Column; +import zuo.biao.apijson.model.Table; import zuo.biao.apijson.server.Logic; -import zuo.biao.apijson.server.Parser; +import zuo.biao.apijson.server.Pair; import zuo.biao.apijson.server.exception.NotExistException; /**config sql for JSON Request @@ -63,10 +74,15 @@ public class SQLConfig { public static final String MYSQL_URI = "jdbc:mysql://localhost:3306";//TODO 改成你自己的 public static final String MYSQL_SCHEMA = "sys";//TODO 改成你自己的 public static final String MYSQL_ACCOUNT = "root";//TODO 改成你自己的 - public static final String MYSQL_PASSWORD = "root";//TODO 改成你自己的 + public static final String MYSQL_PASSWORD = "apijson";//TODO 改成你自己的 + + + public static final String SCHEMA_INFORMATION = "`information_schema`"; + public static final String TABLE_SCHEMA = "`table_schema`"; + public static final String TABLE_NAME = "`table_name`"; + - public static final String ID = JSONResponse.KEY_ID; public static final List ARRAY_KEY_LIST; static { @@ -79,7 +95,9 @@ public class SQLConfig { static { TABLE_KEY_LIST = new ArrayList(); TABLE_KEY_LIST.add(KEY_ROLE); + TABLE_KEY_LIST.add(KEY_CONDITION); TABLE_KEY_LIST.add(KEY_SCHEMA); + TABLE_KEY_LIST.add(KEY_ABOUT); TABLE_KEY_LIST.add(KEY_COLUMN); TABLE_KEY_LIST.add(KEY_GROUP); TABLE_KEY_LIST.add(KEY_HAVING); @@ -92,17 +110,24 @@ public class SQLConfig { public static final Map TABLE_KEY_MAP; static { TABLE_KEY_MAP = new HashMap(); + TABLE_KEY_MAP.put(Table.class.getSimpleName(), Table.TAG); + TABLE_KEY_MAP.put(Column.class.getSimpleName(), Column.TAG); + TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user"); - TABLE_KEY_MAP.put(UserPrivacy.class.getSimpleName(), "apijson_user_privacy"); + TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy"); } private long id; //Table的id private RequestMethod method; //操作方法 + /** + * TODO 被关联的表通过就忽略关联的表?(这个不行 User:{"sex@":"/Comment/toId"}) + */ private RequestRole role; //发送请求的用户的角色 private String schema; //Table所在的数据库 private String table; //Table名 + private boolean about; //关于,返回数据库表的信息,包括表说明和字段说明 private String group; //分组方式的字符串数组,','分隔 private String having; //聚合函数的字符串数组,','分隔 private String order; //排序方式的字符串数组,','分隔 @@ -119,6 +144,7 @@ public class SQLConfig { private int query; //JSONRequest.query private int type; //ObjectParser.type //array item >>>>>>>>>> + private boolean test; //测试 private boolean cacheStatic; //静态缓存 public SQLConfig(RequestMethod method) { @@ -167,6 +193,13 @@ public SQLConfig setRole(RequestRole role) { } public String getSchema() { + String sqlTable = getSQLTable(); + if (sqlTable != null && sqlTable.startsWith("`")) { + return SCHEMA_INFORMATION; + } + return getSchema(schema); + } + public static String getSchema(String schema) { if (StringUtil.isEmpty(schema, true)) { schema = MYSQL_SCHEMA; //非默认Schema必须要有 } @@ -200,6 +233,14 @@ public SQLConfig setTable(String table) { return this; } + public boolean isAbout() { + return about; + } + public SQLConfig setAbout(boolean about) { + this.about = about; + return this; + } + public String getGroup() { return group; } @@ -273,8 +314,8 @@ public SQLConfig setColumn(String column) { public String getColumnString() throws NotExistException { switch (getMethod()) { case HEAD: - case POST_HEAD: - return "count(0) AS count"; + case HEADS: + return SQL.count(column); case POST: if (StringUtil.isEmpty(column, true)) { throw new NotExistException(TAG + "getColumnString getMethod() = POST" @@ -298,12 +339,12 @@ public String getValues() { public String getValuesString() { return values; } - public SQLConfig setValues(String[][] values) { + public SQLConfig setValues(String[][] valuess) { String s = ""; - if (values != null && values.length > 0) { - String[] items = new String[values.length]; - for (int i = 0; i < values.length; i++) { - items[i] = "(" + StringUtil.getString(values[i]) + ")"; + if (BaseModel.isEmpty(valuess) == false) { + String[] items = new String[valuess.length]; + for (int i = 0; i < valuess.length; i++) { + items[i] = "(" + StringUtil.getString(valuess[i]) + ")"; } s = StringUtil.getString(items); } @@ -359,6 +400,13 @@ public SQLConfig setType(int type) { return this; } + public boolean isTest() { + return test; + } + public SQLConfig setTest(boolean test) { + this.test = test; + return this; + } public boolean isCacheStatic() { return cacheStatic; } @@ -429,11 +477,13 @@ public Object getWhere(String key, boolean exactMatch) { Set set = key == null || where == null ? null : where.keySet(); if (set != null) { synchronized (where) { - int index; - for (String k : set) { - index = k.indexOf(key); - if (index > 0 && StringUtil.isWord(k.substring(index)) == false) { - return where.get(k); + if (where != null) { + int index; + for (String k : set) { + index = k.indexOf(key); + if (index >= 0 && StringUtil.isName(k.substring(index)) == false) { + return where.get(k); + } } } } @@ -443,7 +493,7 @@ public Object getWhere(String key, boolean exactMatch) { public SQLConfig addWhere(String key, Object value) { if (key != null) { if (where == null) { - where = new HashMap(); + where = new LinkedHashMap(); } where.put(key, value); } @@ -456,7 +506,7 @@ public SQLConfig addWhere(String key, Object value) { */ @JSONField(serialize = false) public String getWhereString() throws Exception { - return getWhereString(getMethod(), getWhere()); + return getWhereString(getMethod(), getWhere(), ! isTest()); } /**获取WHERE * @param method @@ -464,67 +514,91 @@ public String getWhereString() throws Exception { * @return * @throws Exception */ - public static String getWhereString(RequestMethod method, Map where) throws Exception { + public static String getWhereString(RequestMethod method, Map where, boolean verifyName) throws Exception { Set set = where == null ? null : where.keySet(); - if (set != null && set.size() > 0) { - - String whereString = ""; - boolean isFirst = true; - int keyType = 0;// 0 - =; 1 - $, 2 - {} - Object value; - for (String key : set) { - Log.d(TAG, "getWhereString key = " + key); - //避免筛选到全部 value = key == null ? null : where.get(key); - if (key == null || key.startsWith("@") || key.endsWith("()")) {//关键字||方法, +或-直接报错 - Log.d(TAG, "getWhereString key == null || key.startsWith(@) || key.endsWith(()) >> continue;"); - continue; - } - if (key.endsWith("@")) {//引用 - key = key.substring(0, key.lastIndexOf("@")); - // throw new IllegalArgumentException(TAG + ".getWhereString: 字符 " + key + " 不合法!"); - } - if (key.endsWith("$")) { - keyType = 1; - } else if (key.endsWith("{}")) { - keyType = 2; - } else if (key.endsWith("<>")) { - keyType = 3; - } - value = where.get(key); - key = Parser.getRealKey(method, key, false, true); - - String condition = ""; - switch (keyType) { - case 1: - condition = getSearchString(key, value); - break; - case 2: - condition = getRangeString(key, value); - break; - case 3: - condition = getContainString(key, value); - break; - default: - condition = (key + "='" + value + "'"); - break; - } - if (StringUtil.isEmpty(condition, true)) {//避免SQL条件连接错误 - continue; - } + if (BaseModel.isEmpty(set)) { + return ""; + } + String whereString = ""; + boolean isFirst = true; - whereString += (isFirst ? "" : AND) + condition; + String condition; + for (String key : set) { + condition = getWhereItem(key, where.get(key), method, verifyName); - isFirst = false; + if (StringUtil.isEmpty(condition, true)) {//避免SQL条件连接错误 + continue; } - if (whereString.isEmpty() == false) { - return " WHERE " + whereString; - } + whereString += (isFirst ? "" : AND) + "(" + condition + ")"; + + isFirst = false; } - return ""; + String s = whereString.isEmpty() ? "" : " WHERE " + whereString; + + if (s.isEmpty() && RequestMethod.isQueryMethod(method) == false) { + throw new UnsupportedOperationException("写操作请求必须带条件!!!"); + } + + return s; } + /** + * @param key + * @param value + * @param method + * @param verifyName + * @return + * @throws Exception + */ + private static String getWhereItem(String key, Object value + , RequestMethod method, boolean verifyName) throws Exception { + Log.d(TAG, "getWhereItem key = " + key); + //避免筛选到全部 value = key == null ? null : where.get(key); + if (key == null || value == null || key.startsWith("@") || key.endsWith("()")) {//关键字||方法, +或-直接报错 + Log.d(TAG, "getWhereItem key == null || value == null" + + " || key.startsWith(@) || key.endsWith(()) >> continue;"); + return null; + } + if (key.endsWith("@")) {//引用 + // key = key.substring(0, key.lastIndexOf("@")); + throw new IllegalArgumentException(TAG + ".getWhereItem: 字符 " + key + " 不合法!"); + } + + int keyType; + if (key.endsWith("$")) { + keyType = 1; + } + else if (key.endsWith("?")) { + keyType = 2; + } + else if (key.endsWith("{}")) { + keyType = 3; + } + else if (key.endsWith("<>")) { + keyType = 4; + } + else { //else绝对不能省,避免再次踩坑! keyType = 0; 写在for循环外面都没注意! + keyType = 0; + } + key = getRealKey(method, key, false, true, verifyName); + + switch (keyType) { + case 1: + return getSearchString(key, value); + case 2: + return getRegExpString(key, value); + case 3: + return getRangeString(key, value); + case 4: + return getContainString(key, value); + default: + return (key + "='" + value + "'"); + } + } + + //$ search <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**search key match value * @param in @@ -540,15 +614,11 @@ public static String getSearchString(String key, Object value) throws IllegalArg key = logic.getKey(); Log.i(TAG, "getRangeString key = " + key); - if (value instanceof JSONArray == false) {//TODO 直接掉Like性能最好! - JSONArray array = new JSONArray(); - array.add(value); - value = array; - } - if (((JSONArray) value).isEmpty()) { + JSONArray arr = newJSONArray(value); + if (arr.isEmpty()) { return ""; } - return getSearchString(key, ((JSONArray) value).toArray(), logic.getType()); + return getSearchString(key, arr.toArray(), logic.getType()); } /**search key match values * @param in @@ -568,7 +638,7 @@ public static String getSearchString(String key, Object[] values, int type) thro condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) + getLikeString(key, values[i]); } - return (Logic.isNot(type) ? NOT : "") + "(" + condition + ")"; + return getCondition(Logic.isNot(type), condition); } /**WHERE key LIKE 'value' @@ -582,6 +652,61 @@ public static String getLikeString(String key, Object value) { //$ search >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + //$ search <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**search key match RegExps value + * @param in + * @return {@link #getRegExpString(String, Object[], int)} + * @throws IllegalArgumentException + */ + public static String getRegExpString(String key, Object value) throws IllegalArgumentException { + if (value == null) { + return ""; + } + + Logic logic = new Logic(key); + key = logic.getKey(); + Log.i(TAG, "getRangeString key = " + key); + + JSONArray arr = newJSONArray(value); + if (arr.isEmpty()) { + return ""; + } + return getRegExpString(key, arr.toArray(), logic.getType()); + } + /**search key match RegExp values + * @param in + * @return LOGIC [ key REGEXP 'values[i]' ] + * @throws IllegalArgumentException + */ + public static String getRegExpString(String key, Object[] values, int type) throws IllegalArgumentException { + if (values == null || values.length <= 0) { + return ""; + } + + String condition = ""; + for (int i = 0; i < values.length; i++) { + if (values[i] instanceof String == false) { + throw new IllegalArgumentException(key + "$\":value 中value只能为String或JSONArray!"); + } + condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) + getRegExpString(key, (String) values[i]); + } + + return getCondition(Logic.isNot(type), condition); + } + + /**WHERE key REGEXP 'value' + * @param key + * @param value + * @return key REGEXP 'value' + */ + public static String getRegExpString(String key, String value) { + return key + " REGEXP '" + value + "'"; + } + //$ search >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //{} range <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**WHERE key > 'key0' AND key <= 'key1' AND ... * @param key @@ -600,9 +725,9 @@ public static String getRangeString(String key, Object range) throws Exception { key = logic.getKey(); Log.i(TAG, "getRangeString key = " + key); - if (range instanceof JSONArray) { + if (range instanceof List) { if (logic.isOr() || logic.isNot()) { - return key + getInString(key, ((JSONArray) range).toArray(), logic.isNot()); + return key + getInString(key, ((List) range).toArray(), logic.isNot()); } throw new IllegalArgumentException(key + "{}\":[] 中key末尾的逻辑运算符只能用'|','!'中的一种 !"); } @@ -621,8 +746,7 @@ public static String getRangeString(String key, Object range) throws Exception { if (condition.isEmpty()) { return ""; } - condition = "(" + condition + ")"; - return logic.isNot() ? NOT + condition : condition; + return getCondition(logic.isNot(), condition); } throw new IllegalArgumentException(key + "{}:range 类型为" + range.getClass().getSimpleName() @@ -644,7 +768,7 @@ public static String getInString(String key, Object[] in, boolean not) throws No throw new NotExistException(TAG + ".getInString(" + key + ", [], " + not + ") >> condition.isEmpty() >> IN()"); } - return (not ? NOT : "") + " IN " + "(" + condition + ")"; + return (not ? NOT : "") + " IN (" + condition + ")"; } //{} range >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -665,12 +789,8 @@ public static String getContainString(String key, Object value) throws NotExistE key = logic.getKey(); Log.i(TAG, "getRangeString key = " + key); - if (value instanceof JSONArray == false) {//TODO 直接调Like性能最好! - JSONArray array = new JSONArray(); - array.add(value); - value = array; - } - return getContainString(key, ((JSONArray) value).toArray(), logic.getType()); + //TODO 直接调Like性能最好! + return getContainString(key, newJSONArray(value).toArray(), logic.getType()); } /**WHERE key contains childs * @param key @@ -692,7 +812,7 @@ public static String getContainString(String key, Object[] childs, int type) thr childs[i] = "\"" + childs[i] + "\""; } condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) - + getSearchString( + + "(" + getSearchString( key , new String[]{ "[" + childs[i] + "]", //全等 @@ -701,7 +821,7 @@ public static String getContainString(String key, Object[] childs, int type) thr "%, " + childs[i] + "]" //末尾 } , Logic.TYPE_OR - ); + ) + ")"; } } if (condition.isEmpty()) { @@ -711,14 +831,38 @@ public static String getContainString(String key, Object[] childs, int type) thr if (condition.isEmpty()) { return ""; } - return (Logic.isNot(type) ? NOT : "") + "(" + condition + ")"; + return getCondition(Logic.isNot(type), condition); } //<> contain >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + /**拼接条件 + * @param not + * @param condition + * @return + */ + private static String getCondition(boolean not, String condition) { + return not ? NOT + "(" + condition + ")" : condition; + } + - //WHERE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - + /**转为JSONArray + * @param tv + * @return + */ + @NotNull + public static JSONArray newJSONArray(Object obj) { + JSONArray array = new JSONArray(); + if (obj != null) { + if (obj instanceof Collection) { + array.addAll((Collection) obj); + } else { + array.add(obj); + } + } + return array; + } + //WHERE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //SET <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -728,7 +872,7 @@ public static String getContainString(String key, Object[] childs, int type) thr */ @JSONField(serialize = false) public String getSetString() throws Exception { - return getSetString(getMethod(), getContent()); + return getSetString(getMethod(), getContent(), ! isTest()); } /**获取SET * @param method @@ -736,7 +880,7 @@ public String getSetString() throws Exception { * @return * @throws Exception */ - public static String getSetString(RequestMethod method, Map content) throws Exception { + public static String getSetString(RequestMethod method, Map content, boolean verifyName) throws Exception { Set set = content == null ? null : content.keySet(); if (set != null && set.size() > 0) { String setString = ""; @@ -745,7 +889,7 @@ public static String getSetString(RequestMethod method, Map cont Object value; for (String key : set) { //避免筛选到全部 value = key == null ? null : content.get(key); - if (key == null || ID.equals(key)) { + if (key == null || KEY_ID.equals(key)) { continue; } @@ -755,7 +899,7 @@ public static String getSetString(RequestMethod method, Map cont keyType = 2; } value = content.get(key); - key = Parser.getRealKey(method, key, false, true); + key = getRealKey(method, key, false, true, verifyName); setString += (isFirst ? "" : ", ") + (key + "=" + (keyType == 1 ? getAddString(key, value) : (keyType == 2 ? getRemoveString(key, value) : "'" + value + "'") ) ); @@ -785,7 +929,7 @@ public static String getAddString(String key, Object value) throws IllegalArgume } throw new IllegalArgumentException(key + "+ 对应的值 " + value + " 不是Number,String,Array中的任何一种!"); } - /**SET key = REPLACE (key, 'value', '') + /**SET key = replace(key, 'value', '') * @param key * @param value * @return REPLACE (key, 'value', '') @@ -796,7 +940,7 @@ public static String getRemoveString(String key, Object value) throws IllegalArg return key + " - " + value; } if (value instanceof String) { - return " REPLACE (" + key + ", '" + value + "', '') "; + return SQL.replace(key, (String) value, "");// " replace(" + key + ", '" + value + "', '') "; } throw new IllegalArgumentException(key + "- 对应的值 " + value + " 不是Number,String,Array中的任何一种!"); } @@ -822,6 +966,7 @@ public static String getSQL(SQLConfig config) throws Exception { Log.i(TAG, "getSQL StringUtil.isNotEmpty(tablePath, true) == false >> return null;"); return null; } + switch (config.getMethod()) { case POST: return "INSERT INTO " + tablePath + config.getColumnString() + " VALUES" + config.getValuesString(); @@ -880,7 +1025,8 @@ private static String getConditionString(String column, String table, SQLConfig // //order: id+ -> id >= idOfStartIndex; id- -> id <= idOfStartIndex >>>>>>>>>>>>>>>>>> // // - // //结果错误!SELECT * FROM sys.User AS t0 INNER JOIN (SELECT id FROM sys.User ORDER BY date ASC LIMIT 20, 10) AS t1 ON t0.id = t1.id + // //结果错误!SELECT * FROM linking_member.mes_member_user_test AS t0 INNER JOIN + // (SELECT id FROM linking_member.mes_member_user_test ORDER BY date ASC LIMIT 20, 10) AS t1 ON t0.id = t1.id // //common case, inner join // condition += config.getLimitString(); // return table + " AS t0 INNER JOIN (SELECT id FROM " + condition + ") AS t1 ON t0.id = t1.id"; @@ -890,92 +1036,291 @@ private static String getConditionString(String column, String table, SQLConfig * @param table * @param request * @return + * @throws Exception */ - public static synchronized SQLConfig newQueryConfig(RequestMethod method, String table, JSONObject request) { + public static SQLConfig newSQLConfig(RequestMethod method, String table, JSONObject request) throws Exception { + if (request == null) { // User:{} 这种空内容在查询时也有效 + throw new NullPointerException(TAG + ": newSQLConfig request == null!"); + } SQLConfig config = new SQLConfig(method, table); - if (method == POST && request != null && request.get(ID) == null) { - request.put(ID, System.currentTimeMillis()); + boolean isEmpty = request.isEmpty(); + if (isEmpty) { // User:{} 这种空内容在查询时也有效 + return config; //request.remove(key); 前都可以直接return,之后必须保证 put 回去 } - Set set = request == null ? null : request.keySet(); - if (set != null) { - String role = request.getString(KEY_ROLE); - String schema = request.getString(KEY_SCHEMA); - String column = request.getString(KEY_COLUMN); - String group = request.getString(KEY_GROUP); - String having = request.getString(KEY_HAVING); - String order = request.getString(KEY_ORDER); - request.remove(KEY_ROLE); - request.remove(KEY_SCHEMA); - request.remove(KEY_COLUMN); - request.remove(KEY_GROUP); - request.remove(KEY_HAVING); - request.remove(KEY_ORDER); - - if (method == POST) { - config.setColumn(StringUtil.getString(set.toArray(new String[]{}))); - - String valuesString = ""; - Collection valueCollection = request.values(); - Object[] values = valueCollection == null || valueCollection.isEmpty() ? null : valueCollection.toArray(); - if (values != null) { - for (int i = 0; i < values.length; i++) { - valuesString += ((i > 0 ? "," : "") + "'" + values[i] + "'"); + + Object idIn = request.get(KEY_ID_IN); //可能是 id{}:">0" + + if (method == POST) { + if (idIn != null) { //不能在这里确定[]的长度,只能在外面传进来 + if ((idIn instanceof List == false) || ((List)idIn).isEmpty()) { // id{}:[] 表示同时插入多条记录 + throw new IllegalArgumentException("POST请求,生成多条记录请用 id{}:[] ! [] 类型为JSONArray且不能为空!"); + } + } else if (request.get(KEY_ID) == null) { + request.put(KEY_ID, System.currentTimeMillis()); + } + } + + //对id和id{}处理,这两个一定会作为条件 + Long id = request.getLong(KEY_ID); + if (id != null) { //null无效 + if (id <= 0) { //一定没有值 + throw new NotExistException(TAG + ": newSQLConfig " + table + ".id <= 0"); + } + + if (idIn != null && idIn instanceof List) { //共用idArr场景少性能差 + if (idIn != null && ((List) idIn).contains(id) == false) {//empty有效 BaseModel.isEmpty(idArr) == false) { + Log.w(TAG, "newSQLConfig id > 0 >> idInObj != null && idInObj.contains(id) == false >> return null;"); + throw new NotExistException(TAG + ": newSQLConfig idIn != null && ((JSONArray) idIn).contains(id) == false"); + } + } + } + + + String role = request.getString(KEY_ROLE); + String schema = request.getString(KEY_SCHEMA); + boolean about = request.getBooleanValue(KEY_ABOUT); + String condition = request.getString(KEY_CONDITION); + String column = request.getString(KEY_COLUMN); + String group = request.getString(KEY_GROUP); + String having = request.getString(KEY_HAVING); + String order = request.getString(KEY_ORDER); + + //强制作为条件且放在最前面优化性能 + request.remove(KEY_ID); + request.remove(KEY_ID_IN); + //关键词 + request.remove(KEY_ROLE); + request.remove(KEY_SCHEMA); + request.remove(KEY_ABOUT); + request.remove(KEY_CONDITION); + request.remove(KEY_COLUMN); + request.remove(KEY_GROUP); + request.remove(KEY_HAVING); + request.remove(KEY_ORDER); + + + Map tableWhere = new LinkedHashMap();//保证顺序好优化 WHERE id > 1 AND name LIKE... + if (about) { //查询字段属性 + if (RequestMethod.isQueryMethod(method) == false) { + throw new UnsupportedOperationException(config.getTable() + + " 被 " + KEY_ABOUT + " 标注,只能进行 GET,HEAD 等查询操作!"); + } + + tableWhere.put(TABLE_SCHEMA, SQLConfig.getSchema(schema)); + tableWhere.put(TABLE_NAME, config.getSQLTable()); + config.setTable(Column.class.getSimpleName()); + + schema = SCHEMA_INFORMATION; + + column = StringUtil.getString(column); + if (column.isEmpty() && RequestMethod.isHeadMethod(method, true) == false) { + column = "column_name,column_type,is_nullable,column_default,column_comment"; + } + } + + + //已经remove了id和id{},以及@key + Set set = request.keySet(); //前面已经判断request是否为空 + if (method == POST) {//POST操作 + if (BaseModel.isEmpty(set) == false) { //不能直接return,要走完下面的流程 + List idList; + if (id != null) { //单条记录 + if (idIn != null) { + throw new IllegalArgumentException("POST请求中 id 和 id{} 不能同时存在!"); } + + idList = new ArrayList(1); + idList.add(id); + } else { //多条记录 + idList = new ArrayList((JSONArray) idIn); } - config.setValues("(" + valuesString + ")"); - } else { - config.setColumn(column); - - final boolean isWhere = method != PUT;//除了POST,PUT,其它全是条件!!! - - Map tableContent = new HashMap(); - Map tableWhere = new HashMap(); - Object value; - for (String key : set) { - value = request.get(key); - if (value instanceof JSONObject == false) {//只允许常规Object - //解决AccessVerifier新增userId没有作为条件,而是作为内容,导致PUT,DELETE出错 - if (isWhere || ID.equals(key)) { - tableWhere.put(key, value); - } else { - tableContent.put(key, value);//一样 instanceof JSONArray ? JSON.toJSONString(value) : value); - } + + //idIn不为空时,valuesString有多条,唯一的区别就是id + String[] columns = set.toArray(new String[]{}); + + Collection valueCollection = request.values(); + Object[] values = valueCollection == null ? null : valueCollection.toArray(); + + if (values == null || values.length != columns.length) { + throw new Exception("服务器内部错误:\n" + TAG + + " newSQLConfig values == null || values.length != columns.length !"); + } + column = KEY_ID + "," + StringUtil.getString(columns); //set已经判断过不为空 + final int size = columns.length + 1; //以key数量为准 + + String[][] valuess = new String[idList.size()][]; // [idList.size()][] + String[] items; //(item0, item1, ...) + for (int i = 0; i < idList.size(); i++) { + items = new String[size]; + items[0] = "'" + idList.get(i) + "'"; //第0个就是id。所有的值都加 '' 避免SQL注入风险 + for (int j = 1; j < size; j++) { + items[j] = "'" + values[j-1] + "'"; //从第1个开始,允许"null" } + valuess[i] = items; + } + config.setValues(valuess); + } + } + else { //非POST操作 + final boolean isWhere = method != PUT;//除了POST,PUT,其它全是条件!!! + + //条件<<<<<<<<<<<<<<<<<<< + List conditionList = null; + if (isWhere == false) { //减少不必要的步骤 + if (method == PUT || method == DELETE) { + String[] conditions = StringUtil.split(condition); + //Arrays.asList()返回值不支持add方法! + conditionList = BaseModel.isEmpty(conditions) ? null : Arrays.asList(conditions); } + } + //条件>>>>>>>>>>>>>>>>>>> - config.setContent(tableContent); - config.setWhere(tableWhere); + //强制作为条件且放在最前面优化性能 + if (id != null) { + tableWhere.put(KEY_ID, id); + } + if (idIn != null) { + tableWhere.put(KEY_ID_IN, idIn); } - config.setRole(role); - config.setSchema(schema); - config.setGroup(group); - config.setHaving(having); - config.setOrder(order); + Map tableContent = new HashMap(); + Object value; + for (String key : set) { + value = request.get(key); + if (value instanceof JSONObject == false) {//只允许常规Object + //解决AccessVerifier新增userId没有作为条件,而是作为内容,导致PUT,DELETE出错 + if (isWhere || BaseModel.isContain(conditionList, key)) { + tableWhere.put(key, value); + } else { + tableContent.put(key, value);//一样 instanceof JSONArray ? JSON.toJSONString(value) : value); + } + } + } - //后面还可能用到,要还原 - request.put(KEY_ROLE, role); - request.put(KEY_SCHEMA, schema); - request.put(KEY_COLUMN, column); - request.put(KEY_GROUP, group); - request.put(KEY_HAVING, having); - request.put(KEY_ORDER, order); + config.setContent(tableContent); } - try { - config.setId(request.getLongValue(ID)); - } catch (Exception e) { - // empty - } + + config.setWhere(tableWhere); + + config.setId(BaseModel.value(id)); + //在 tableWhere 第0个 config.setIdIn(idIn); + + config.setRole(role); + //TODO condition组合,优先 | config.setCondition(condition); + config.setSchema(schema); + config.setAbout(about); + config.setColumn(column); + config.setGroup(group); + config.setHaving(having); + config.setOrder(order); + + //后面还可能用到,要还原 + //id或id{}条件 + request.put(KEY_ID, id); + request.put(KEY_ID_IN, idIn); + //关键词 + request.put(KEY_ROLE, role); + request.put(KEY_SCHEMA, schema); + request.put(KEY_ABOUT, about); + request.put(KEY_CONDITION, condition); + request.put(KEY_COLUMN, column); + request.put(KEY_GROUP, group); + request.put(KEY_HAVING, having); + request.put(KEY_ORDER, order); + + return config; } - // 导致getSetString,未设置id错误 - // @Override - // public String toString() { - // return JSON.toJSONString(this); - // } + + /**获取客户端实际需要的key + * verifyName = true + * @param method + * @param originKey + * @param isTableKey + * @param saveLogic 保留逻辑运算符 & | ! + * @return + */ + public static String getRealKey(RequestMethod method, String originKey + , boolean isTableKey, boolean saveLogic) throws Exception { + return getRealKey(method, originKey, isTableKey, saveLogic, true); + } + /**获取客户端实际需要的key + * @param method + * @param originKey + * @param isTableKey + * @param saveLogic 保留逻辑运算符 & | ! + * @param verifyName 验证key名是否符合代码变量/常量名 + * @return + */ + public static String getRealKey(RequestMethod method, String originKey + , boolean isTableKey, boolean saveLogic, boolean verifyName) throws Exception { + Log.i(TAG, "getRealKey saveLogic = " + saveLogic + "; originKey = " + originKey); + if (originKey == null || originKey.startsWith("`") || zuo.biao.apijson.JSONObject.isArrayKey(originKey)) { + Log.w(TAG, "getRealKey originKey == null || originKey.startsWith(`)" + + " || zuo.biao.apijson.JSONObject.isArrayKey(originKey) >> return originKey;"); + return originKey; + } + + String key = new String(originKey); + if (key.endsWith("$")) {//搜索,查询时处理 + key = key.substring(0, key.length() - 1); + } + else if (key.endsWith("?")) {//匹配正则表达式,查询时处理 + key = key.substring(0, key.length() - 1); + } + else if (key.endsWith("{}")) {//被包含,或者说key对应值处于value的范围内。查询时处理 + key = key.substring(0, key.length() - 2); + } + else if (key.endsWith("<>")) {//包含,或者说value处于key对应值的范围内。查询时处理 + key = key.substring(0, key.length() - 2); + } + else if (key.endsWith("()")) {//方法,查询完后处理,先用一个Map保存? + key = key.substring(0, key.length() - 2); + } + else if (key.endsWith("@")) {//引用,引用对象查询完后处理。fillTarget中暂时不用处理,因为非GET请求都是由给定的id确定,不需要引用 + key = key.substring(0, key.length() - 1); + } + else if (key.endsWith("+")) {//延长,PUT查询时处理 + if (method == PUT) {//不为PUT就抛异常 + key = key.substring(0, key.length() - 1); + } + } + else if (key.endsWith("-")) {//缩减,PUT查询时处理 + if (method == PUT) {//不为PUT就抛异常 + key = key.substring(0, key.length() - 1); + } + } + + String last = null;//不用Logic优化代码,否则 key 可能变为 key| 导致 key=value 变成 key|=value 而出错 + if (RequestMethod.isQueryMethod(method)) {//逻辑运算符仅供GET,HEAD方法使用 + last = key.isEmpty() ? "" : key.substring(key.length() - 1); + if ("&".equals(last) || "|".equals(last) || "!".equals(last)) { + key = key.substring(0, key.length() - 1); + } else { + last = null;//避免key + StringUtil.getString(last)错误延长 + } + } + + //"User:toUser":User转换"toUser":User, User为查询同名Table得到的JSONObject。交给客户端处理更好 + if (isTableKey) {//不允许在column key中使用Type:key形式 + key = Pair.parseEntry(key, true).getKey();//table以左边为准 + } else { + key = Pair.parseEntry(key).getValue();//column以右边为准 + } + + if (verifyName && StringUtil.isName(key.startsWith("@") ? key.substring(1) : key) == false) { + throw new IllegalArgumentException(TAG + "/" + method + " getRealKey: 字符 " + originKey + " 不合法!"); + } + + if (saveLogic && last != null) { + key = key + last; + } + Log.i(TAG, "getRealKey return key = " + key); + return key; + } } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java similarity index 69% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java index e5a5fa5c4..f77179d49 100755 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java +++ b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java @@ -15,14 +15,13 @@ package zuo.biao.apijson.server.sql; import java.sql.Connection; -import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; +import java.sql.Timestamp; import java.util.HashMap; -import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; @@ -31,7 +30,6 @@ import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.StringUtil; -import zuo.biao.apijson.server.Pair; import zuo.biao.apijson.server.Parser; /**executor for query(read) or update(write) MySQL database @@ -65,7 +63,8 @@ public class SQLExecutor { */ private synchronized Connection getConnection() throws Exception { Log.i(TAG, "成功加载MySQL驱动!"); - return DriverManager.getConnection(SQLConfig.MYSQL_URI, SQLConfig.MYSQL_ACCOUNT, SQLConfig.MYSQL_PASSWORD); + return DriverManager.getConnection(SQLConfig.MYSQL_URI + "?useUnicode=true&characterEncoding=UTF-8&user=" + + SQLConfig.MYSQL_ACCOUNT + "&password=" + SQLConfig.MYSQL_PASSWORD); } /**保存缓存 @@ -118,7 +117,6 @@ public JSONObject getFromCache(String sql, int position, boolean isStatic) { private Connection connection; private Statement statement; - private DatabaseMetaData metaData; /**关闭连接,释放资源 */ public void close() { @@ -133,7 +131,6 @@ public void close() { } catch (SQLException e) { e.printStackTrace(); } - metaData = null; statement = null; cacheMap = null; } @@ -162,13 +159,12 @@ public JSONObject execute(SQLConfig config) throws Exception { Log.i(TAG, "select connection " + (connection == null ? " = null" : ("isClosed = " + connection.isClosed()))) ; connection = getConnection(); statement = connection.createStatement(); //创建Statement对象 - metaData = connection.getMetaData(); } Log.i(TAG, "成功连接到数据库!"); ResultSet rs = null; switch (config.getMethod()) { case HEAD: - case POST_HEAD: + case HEADS: rs = statement.executeQuery(sql); result = rs.next() ? Parser.newSuccessResult() @@ -183,13 +179,20 @@ public JSONObject execute(SQLConfig config) throws Exception { case DELETE: long updateCount = statement.executeUpdate(sql); - result = Parser.newResult(updateCount > 0 ? 200 : 404 - , updateCount > 0 ? "success" : "可能对象不存在!"); - result.put(JSONResponse.KEY_ID, config.getId());//id一定有,一定会返回,不用抛异常来阻止关联写时前面错误导致后面无条件执行! + result = Parser.newResult(updateCount > 0 ? JSONResponse.CODE_SUCCESS : JSONResponse.CODE_NOT_FOUND + , updateCount > 0 ? JSONResponse.MSG_SUCCEED : "可能对象不存在!"); + + //id或id{}一定有,一定会返回,不用抛异常来阻止关联写操作时前面错误导致后面无条件执行! + if (config.getId() > 0) { + result.put(JSONResponse.KEY_ID, config.getId()); + } else { + result.put(JSONResponse.KEY_ID_IN, config.getWhere(JSONResponse.KEY_ID_IN, true)); + } + result.put(JSONResponse.KEY_COUNT, updateCount);//返回修改的记录数 return result; case GET: - case POST_GET: + case GETS: break; default://OPTIONS, TRACE等 @@ -206,11 +209,6 @@ public JSONObject execute(SQLConfig config) throws Exception { return result; } - String[] columnArray = getColumnArray(config); - if (columnArray == null || columnArray.length <= 0) { - return null; - } - rs = statement.executeQuery(sql); // final boolean cache = config.getCount() != 1; @@ -218,45 +216,43 @@ public JSONObject execute(SQLConfig config) throws Exception { // Log.d(TAG, "select cache = " + cache + "; resultMap" + (resultMap == null ? "=" : "!=") + "null"); int index = -1; + + ResultSetMetaData rsmd = rs.getMetaData(); + final int length = rsmd.getColumnCount(); + while (rs.next()){ index ++; Log.d(TAG, "\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n select while (rs.next()){ index = " + index + "\n\n"); result = new JSONObject(true); Object value; - Object json; - for (int i = 0; i < columnArray.length; i++) { - if (columnArray[i] == null || columnArray[i].isEmpty() || columnArray[i].startsWith("_")) { + + for (int i = 1; i <= length; i++) { + if (rsmd.getColumnName(i).startsWith("_")) { Log.i(TAG, "select while (rs.next()){ ..." - + " >> columnArray[i] == " + columnArray[i] - + " >> continue;"); + + " >> rsmd.getColumnName(i).startsWith(_) >> continue;"); continue; - }//允许 key:_alias, 但不允许_key, _key:alias - columnArray[i] = Pair.parseEntry(columnArray[i]).getValue(); - try { - value = rs.getObject(rs.findColumn(columnArray[i])); - } catch (Exception e) { - value = null; - Log.i(TAG, "select while (rs.next()){ ..." - + " >> try { value = rs.getObject(rs.findColumn(columnArray[i])); ..." - + " >> } catch (Exception e) {"); - e.printStackTrace(); } - // Log.i(TAG, "select while (rs.next()) { >> for (int i = 0; i < columnArray.length; i++) {" - // + "\n >>> columnArray[i]) = " + columnArray[i] + "; value = " + value); - if (value != null && value instanceof String) { - try { - json = JSON.parse((String) value); - if (json != null && StringUtil.isNotEmpty(json, true)) { - value = json; - } - } catch (Exception e) { - //太长 Log.i(TAG, "select while (rs.next()){ >> i = " - // + i + " try { json = JSON.parse((String) value);" - // + ">> } catch (Exception e) {\n" + e.getMessage()); + + value = rs.getObject(i); + // Log.d(TAG, "name:" + rsmd.getColumnName(i)); + // Log.d(TAG, "lable:" + rsmd.getColumnLabel(i)); + // Log.d(TAG, "type:" + rsmd.getColumnType(i)); + // Log.d(TAG, "typeName:" + rsmd.getColumnTypeName(i)); + + // Log.i(TAG, "select while (rs.next()) { >> for (int i = 0; i < length; i++) {" + // + "\n >>> value = " + value); + + if (value != null) { //数据库查出来的null和empty值都有意义,去掉会导致 Moment:{ @column:"content" } 部分无结果及中断数组查询! + if (value instanceof Timestamp) { + value = ((Timestamp) value).toString(); + } + else if (value instanceof String && isJSONType(rsmd, i)) { //json String + value = JSON.parse((String) value); } } - result.put(columnArray[i], value); + + result.put(rsmd.getColumnLabel(i), value); } resultMap.put(index, result); @@ -275,31 +271,19 @@ public JSONObject execute(SQLConfig config) throws Exception { return resultMap.get(position); } - - /**获取要查询的字段名数组 - * @param config + /**判断是否为JSON类型 + * @param rsmd + * @param position * @return - * @throws SQLException */ - private String[] getColumnArray(SQLConfig config) throws SQLException { - if (config == null) { - return null; - } - String column = config.getColumn(); - if (StringUtil.isNotEmpty(column, true)) { - return StringUtil.split(column);//column.contains(",") ? column.split(",") : new String[]{column}; - } - - List list = new ArrayList(); - String table = config.getSQLTable(); - ResultSet rs = metaData.getColumns(config.getSchema(), null, table, "%"); - while (rs.next()) { - Log.i(TAG, rs.getString(4)); - list.add(rs.getString(4)); + private boolean isJSONType(ResultSetMetaData rsmd, int position) { + try { + return rsmd.getColumnType(position) == 1 || rsmd.getColumnTypeName(position).toLowerCase().contains("json"); + } catch (SQLException e) { + e.printStackTrace(); } - rs.close(); - - return list.toArray(new String[]{}); + return false; } + } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/package-info.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/sql/package-info.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/java/zuo/biao/apijson/server/sql/package-info.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/resources/application.properties b/APIJSON-Java-Server/APIJSON-Eclipse/src/main/resources/application.properties similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/resources/application.properties rename to APIJSON-Java-Server/APIJSON-Eclipse/src/main/resources/application.properties diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/test/java/zuo/biao/apijson/server/ApplicationTests.java b/APIJSON-Java-Server/APIJSON-Eclipse/src/test/java/zuo/biao/apijson/server/ApplicationTests.java similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/test/java/zuo/biao/apijson/server/ApplicationTests.java rename to APIJSON-Java-Server/APIJSON-Eclipse/src/test/java/zuo/biao/apijson/server/ApplicationTests.java diff --git a/APIJSON(Server)/APIJSON(Idea)/.gitignore b/APIJSON-Java-Server/APIJSON-Idea/.gitignore similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/.gitignore rename to APIJSON-Java-Server/APIJSON-Idea/.gitignore diff --git a/APIJSON(Server)/APIJSON(Idea)/.mvn/wrapper/maven-wrapper.jar b/APIJSON-Java-Server/APIJSON-Idea/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/.mvn/wrapper/maven-wrapper.jar rename to APIJSON-Java-Server/APIJSON-Idea/.mvn/wrapper/maven-wrapper.jar diff --git a/APIJSON(Server)/APIJSON(Idea)/.mvn/wrapper/maven-wrapper.properties b/APIJSON-Java-Server/APIJSON-Idea/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/.mvn/wrapper/maven-wrapper.properties rename to APIJSON-Java-Server/APIJSON-Idea/.mvn/wrapper/maven-wrapper.properties diff --git a/APIJSON(Server)/APIJSON(Idea)/.travis.yml b/APIJSON-Java-Server/APIJSON-Idea/.travis.yml similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/.travis.yml rename to APIJSON-Java-Server/APIJSON-Idea/.travis.yml diff --git a/APIJSON(Server)/APIJSON(Idea)/mvnw b/APIJSON-Java-Server/APIJSON-Idea/mvnw similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/mvnw rename to APIJSON-Java-Server/APIJSON-Idea/mvnw diff --git a/APIJSON(Server)/APIJSON(Idea)/mvnw.cmd b/APIJSON-Java-Server/APIJSON-Idea/mvnw.cmd similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/mvnw.cmd rename to APIJSON-Java-Server/APIJSON-Idea/mvnw.cmd diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/pom.xml b/APIJSON-Java-Server/APIJSON-Idea/pom.xml similarity index 100% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/pom.xml rename to APIJSON-Java-Server/APIJSON-Idea/pom.xml diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/APIJSONApplication.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/APIJSONApplication.java similarity index 66% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/APIJSONApplication.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/APIJSONApplication.java index 5a5a66056..522bb5fd6 100755 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/APIJSONApplication.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/APIJSONApplication.java @@ -32,19 +32,26 @@ public class APIJSONApplication { public static void main(String[] args) throws Exception { SpringApplication.run(APIJSONApplication.class, args); + System.out.println("\n\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<< APIJSON >>>>>>>>>>>>>>>>>>>>>>>>\n"); + System.out.println("开始测试:远程函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); try { Function.test(); } catch (Exception e) { e.printStackTrace(); } + System.out.println("\n完成测试:远程函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); // Structure.init(); + System.out.println("\n\n\n开始测试:请求校验 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); try { Structure.test(); } catch (Exception e) { e.printStackTrace(); } + System.out.println("\n完成测试:请求校验 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + + System.out.println("\n\n<<<<<<<<<<<<<<<<<<<<<<<<< APIJSON已启动 >>>>>>>>>>>>>>>>>>>>>>>>\n"); } @@ -57,7 +64,7 @@ public static void main(String[] args) throws Exception { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", buildConfig()); // 4 + source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } /**CORS跨域配置 @@ -65,9 +72,10 @@ public CorsFilter corsFilter() { */ private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); - corsConfiguration.addAllowedOrigin("*"); - corsConfiguration.addAllowedHeader("*"); - corsConfiguration.addAllowedMethod("*"); + corsConfiguration.addAllowedOrigin("*"); //允许的域名或IP地址 + corsConfiguration.addAllowedHeader("*"); //允许的请求头 + corsConfiguration.addAllowedMethod("*"); //允许的HTTP请求方法 + corsConfiguration.setAllowCredentials(true); //允许发送跨域凭据,前端Axios存取JSESSIONID必须要 return corsConfiguration; } //支持JavaScript跨域请求 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Controller.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Controller.java new file mode 100755 index 000000000..7d5d22047 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Controller.java @@ -0,0 +1,878 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server; + +import static zuo.biao.apijson.RequestMethod.DELETE; +import static zuo.biao.apijson.RequestMethod.GET; +import static zuo.biao.apijson.RequestMethod.GETS; +import static zuo.biao.apijson.RequestMethod.HEAD; +import static zuo.biao.apijson.RequestMethod.HEADS; +import static zuo.biao.apijson.RequestMethod.POST; +import static zuo.biao.apijson.RequestMethod.PUT; + +import java.net.URLDecoder; +import java.util.Random; +import java.util.concurrent.TimeoutException; + +import javax.servlet.http.HttpSession; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; + +import apijson.demo.server.model.BaseModel; +import apijson.demo.server.model.Comment; +import apijson.demo.server.model.Moment; +import apijson.demo.server.model.Privacy; +import apijson.demo.server.model.User; +import apijson.demo.server.model.Verify; +import zuo.biao.apijson.JSON; +import zuo.biao.apijson.JSONResponse; +import zuo.biao.apijson.Log; +import zuo.biao.apijson.RequestMethod; +import zuo.biao.apijson.StringUtil; +import zuo.biao.apijson.server.JSONRequest; +import zuo.biao.apijson.server.Parser; +import zuo.biao.apijson.server.exception.ConditionErrorException; +import zuo.biao.apijson.server.exception.ConflictException; +import zuo.biao.apijson.server.exception.NotExistException; +import zuo.biao.apijson.server.exception.OutOfRangeException; + +/**request controller + *
建议全通过HTTP POST来请求: + *
1.减少代码 - 客户端无需写HTTP GET,PUT等各种方式的请求代码 + *
2.提高性能 - 无需URL encode和decode + *
3.调试方便 - 建议使用 APIJSON在线测试工具 或 Postman + * @author Lemon + */ +@RestController +@RequestMapping("") +public class Controller { + private static final String TAG = "Controller"; + + //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + /**获取 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#GET} + */ + @PostMapping(value = "get") + public String get(@RequestBody String request, HttpSession session) { + return new Parser(GET).setSession(session).parse(request); + } + + /**计数 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#HEAD} + */ + @PostMapping("head") + public String head(@RequestBody String request, HttpSession session) { + return new Parser(HEAD).setSession(session).parse(request); + } + + /**限制性GET,request和response都非明文,浏览器看不到,用于对安全性要求高的GET请求 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#GETS} + */ + @PostMapping("gets") + public String gets(@RequestBody String request, HttpSession session) { + return new Parser(GETS).setSession(session).parse(request); + } + + /**限制性HEAD,request和response都非明文,浏览器看不到,用于对安全性要求高的HEAD请求 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#HEADS} + */ + @PostMapping("heads") + public String heads(@RequestBody String request, HttpSession session) { + return new Parser(HEADS).setSession(session).parse(request); + } + + /**新增 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#POST} + */ + @PostMapping("post") + public String post(@RequestBody String request, HttpSession session) { + return new Parser(POST).setSession(session).parse(request); + } + + /**修改 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#PUT} + */ + @PostMapping("put") + public String put(@RequestBody String request, HttpSession session) { + return new Parser(PUT).setSession(session).parse(request); + } + + /**删除 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#DELETE} + */ + @PostMapping("delete") + public String delete(@RequestBody String request, HttpSession session) { + return new Parser(DELETE).setSession(session).parse(request); + } + + + + + + /**获取 + * 只为兼容HTTP GET请求,推荐用HTTP POST,可删除 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#GET} + */ + @RequestMapping("get/{request}") + public String open_get(@PathVariable String request, HttpSession session) { + try { + request = URLDecoder.decode(request, StringUtil.UTF_8); + } catch (Exception e) { + // Parser会报错 + } + return get(request, session); + } + + /**计数 + * 只为兼容HTTP GET请求,推荐用HTTP POST,可删除 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see {@link RequestMethod#HEAD} + */ + @RequestMapping("head/{request}") + public String open_head(@PathVariable String request, HttpSession session) { + try { + request = URLDecoder.decode(request, StringUtil.UTF_8); + } catch (Exception e) { + // Parser会报错 + } + return head(request, session); + } + + + //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + + + + + + + + public static final String USER_; + public static final String PRIVACY_; + public static final String MOMENT_; + public static final String COMMENT_; + public static final String VERIFY_; //加下划线后缀是为了避免 Verify 和 verify 都叫VERIFY,分不清 + static { + USER_ = User.class.getSimpleName(); + PRIVACY_ = Privacy.class.getSimpleName(); + MOMENT_ = Moment.class.getSimpleName(); + COMMENT_ = Comment.class.getSimpleName(); + VERIFY_ = Verify.class.getSimpleName(); + } + + public static final String VERSION = JSONRequest.KEY_VERSION; + public static final String COUNT = JSONResponse.KEY_COUNT; + public static final String TOTAL = JSONResponse.KEY_TOTAL; + + public static final String RANGE = "range"; + + public static final String ID = "id"; + public static final String USER_ID = "userId"; + public static final String CURRENT_USER_ID = "currentUserId"; + + public static final String NAME = "name"; + public static final String PHONE = "phone"; + public static final String PASSWORD = "password"; + public static final String _PASSWORD = "_password"; + public static final String _PAY_PASSWORD = "_payPassword"; + public static final String OLD_PASSWORD = "oldPassword"; + public static final String VERIFY = "verify"; + + public static final String SEX = "sex"; + public static final String TYPE = "type"; + public static final String WAY = "way"; + public static final String CONTENT = "content"; + + + + + + public static final String DATE_UP = "date+";//同 "date ASC" + public static final String DATE_DOWN = "date-";//同 "date DESC" + + public static final String ID_AT = ID + "@"; + public static final String USER_ID_AT = USER_ID + "@"; + public static final String MOMENT_ID_AT = "momentId@"; + public static final String COMMENT_ID_AT = "commentId@"; + + public static final String ID_IN = ID + "{}"; + public static final String USER_ID_IN = USER_ID + "{}"; + public static final String MOMENT_ID_IN = "momentId{}"; + public static final String COMMENT_ID_IN = "commentId{}"; + + public static final String NAME_SEARCH = NAME + "$"; + public static final String PHONE_SEARCH = PHONE + "$"; + public static final String CONTENT_SEARCH = CONTENT + "$"; + + + + public static final String COLUMNS_USER_SIMPLE = "id,name"; + public static final String COLUMNS_USER = "id,sex,name,head"; + + + + + /**生成验证码,修改为post请求 + * @param request + * @return + */ + @PostMapping("post/verify") + public JSONObject postVerify(@RequestBody String request) { + JSONObject requestObject = null; + int type; + String phone; + try { + requestObject = Parser.parseRequest(request, POST); + type = requestObject.getIntValue(TYPE); + phone = requestObject.getString(PHONE); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + new Parser(DELETE, true).parse(newVerifyRequest(type, phone, null)); + + JSONObject response = new Parser(POST, true).parseResponse( + newVerifyRequest(type, phone, "" + (new Random().nextInt(9999) + 1000))); + + JSONObject verify = null; + try { + verify = response.getJSONObject(VERIFY_); + } catch (Exception e) { + // TODO: handle exception + } + if (verify == null || JSONResponse.isSuccess(verify.getIntValue(JSONResponse.KEY_CODE)) == false) { + new Parser(DELETE, true).parseResponse(new JSONRequest(new Verify(type, phone))); + return response; + } + + //TODO 这里直接返回验证码,方便测试。实际上应该只返回成功信息,验证码通过短信发送 + JSONObject object = new JSONObject(); + object.put(TYPE, type); + object.put(PHONE, phone); + return getVerify(JSON.toJSONString(object)); + } + + /**获取验证码 + * @param request + * @return + */ + @PostMapping("gets/verify") + public JSONObject getVerify(@RequestBody String request) { + JSONObject requestObject = null; + int type; + String phone; + try { + requestObject = Parser.parseRequest(request, GETS); + type = requestObject.getIntValue(TYPE); + phone = requestObject.getString(PHONE); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + return new Parser(GETS, true).parseResponse(newVerifyRequest(type, phone, null)); + } + + /**校验验证码 + * @param request + * @return + */ + @PostMapping("heads/verify") + public JSONObject headVerify(@RequestBody String request) { + JSONObject requestObject = null; + int type; + String phone; + String verify; + try { + requestObject = Parser.parseRequest(request, HEADS); + type = requestObject.getIntValue(TYPE); + phone = requestObject.getString(PHONE); + verify = requestObject.getString(VERIFY); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + return headVerify(type, phone, verify); + } + + /**校验验证码 + * @author Lemon + * @param type + * @param phone + * @param code + * @return + */ + public JSONObject headVerify(int type, String phone, String code) { + JSONResponse response = new JSONResponse( + new Parser(GETS, true).parseResponse( + new JSONRequest( + new Verify(type, phone) + .setVerify(code) + ).setTag(VERIFY_) + ) + ); + Verify verify = response.getObject(Verify.class); + if (verify == null) { + return Parser.newErrorResult(StringUtil.isEmpty(code, true) + ? new NotExistException("验证码不存在!") : new ConditionErrorException("手机号或验证码错误!")); + } + + //验证码过期 + if (System.currentTimeMillis() > (60*1000 + BaseModel.getTimeMillis(verify.getDate()))) { + new Parser(DELETE, true).parseResponse( + new JSONRequest(new Verify(type, phone)).setTag(VERIFY_) + ); + return Parser.newErrorResult(new TimeoutException("验证码已过期!")); + } + + return new JSONResponse( + new Parser(HEADS, true).parseResponse( + new JSONRequest(new Verify(type, phone).setVerify(code)) + ) + ); + } + + + + /**新建一个验证码请求 + * @param phone + * @param verify + * @return + */ + private JSONObject newVerifyRequest(int type, String phone, String verify) { + return new JSONRequest(new Verify(type, phone).setVerify(verify)).setTag(VERIFY_); + } + + + public static final String LOGIN = "login"; + + public static final int LOGIN_TYPE_PASSWORD = 0;//密码登录 + public static final int LOGIN_TYPE_VERIFY = 1;//验证码登录 + /**用户登录 + * @param request 只用String,避免encode后未decode + * @return + * @see + *
+		{
+			"type": 0,  //登录方式,非必须  0-密码 2-验证码
+			"phone": "13000082001",
+			"password": "1234567",
+			"version": 1 //全局版本号,非必须
+		}
+	 * 
+ */ + @PostMapping("login") + public JSONObject login(@RequestBody String request, HttpSession session) { + JSONObject requestObject = null; + boolean isPassword; + String phone; + String password; + int version; + try { + requestObject = Parser.parseRequest(request, POST); + + isPassword = requestObject.getIntValue(TYPE) == LOGIN_TYPE_PASSWORD;//登录方式 + phone = requestObject.getString(PHONE);//手机 + password = requestObject.getString(PASSWORD);//密码 + + if (StringUtil.isPhone(phone) == false) { + throw new IllegalArgumentException("手机号不合法!"); + } + + if (isPassword) { + if (StringUtil.isPassword(password) == false) { + throw new IllegalArgumentException("密码不合法!"); + } + } else { + if (StringUtil.isVerify(password) == false) { + throw new IllegalArgumentException("验证码不合法!"); + } + } + + //全局版本号 + version = requestObject.getIntValue(VERSION); + requestObject.remove(VERSION); + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + + + //手机号是否已注册 + JSONObject phoneResponse = new Parser(HEADS, true).parseResponse( + new JSONRequest( + new Privacy().setPhone(phone) + ) + ); + JSONResponse response = new JSONResponse(phoneResponse).getJSONResponse(PRIVACY_); + if (JSONResponse.isSuccess(response) == false) { + return response; + } + if(JSONResponse.isExist(response) == false) { + return Parser.newErrorResult(new NotExistException("手机号未注册")); + } + + //根据phone获取User + JSONObject privacyResponse = new Parser(GETS, true).parseResponse( + new JSONRequest( + new Privacy().setPhone(phone) + ) + ); + response = new JSONResponse(privacyResponse); + + Privacy privacy = response == null ? null : response.getObject(Privacy.class); + long userId = privacy == null ? 0 : BaseModel.value(privacy.getId()); + if (userId <= 0) { + return privacyResponse; + } + + //校验凭证 + if (isPassword) {//password密码登录 + response = new JSONResponse( + new Parser(HEADS, true).parseResponse( + new JSONRequest(new Privacy(userId).setPassword(password)) + ) + ); + } else {//verify手机验证码登录 + response = new JSONResponse(headVerify(Verify.TYPE_LOGIN, phone, password)); + } + if (JSONResponse.isSuccess(response) == false) { + return response; + } + response = response.getJSONResponse(isPassword ? PRIVACY_ : VERIFY_); + if (JSONResponse.isExist(response) == false) { + return Parser.newErrorResult(new ConditionErrorException("账号或密码错误")); + } + + response = new JSONResponse( + new Parser(GETS, true).parseResponse( + new JSONRequest(new User(userId)) + ) + ); + User user = response.getObject(User.class); + if (user == null || BaseModel.value(user.getId()) != userId) { + return Parser.newErrorResult(new NullPointerException("服务器内部错误")); + } + + //登录状态保存至session + session.setAttribute(USER_ID, userId);//用户id + session.setAttribute(TYPE, isPassword ? LOGIN_TYPE_PASSWORD : LOGIN_TYPE_VERIFY);//登录方式 + session.setAttribute(USER_, user);//用户 + session.setAttribute(PRIVACY_, privacy);//用户隐私信息 + session.setAttribute(VERSION, version);//用户隐私信息 + // session.setMaxInactiveInterval(1*60);//设置session过期时间 + + return response; + } + + /**退出登录,清空session + * @param session + * @return + */ + @PostMapping("logout") + public JSONObject logout(HttpSession session) { + long userId; + try { + userId = Verifier.getUserId(session);//必须在session.invalidate();前! + Log.d(TAG, "logout userId = " + userId + "; session.getId() = " + (session == null ? null : session.getId())); + session.invalidate(); + } catch (Exception e) { + return Parser.newErrorResult(e); + } + + JSONObject result = Parser.newSuccessResult(); + JSONObject user = Parser.newSuccessResult(); + user.put(ID, userId); + user.put(COUNT, 1); + result.put(USER_, user); + + return result; + } + + + private static final String REGISTER = "register"; + /**注册 + * @param request 只用String,避免encode后未decode + * @return + * @see + *
+		{
+			"Privacy": {
+				"phone": "13000082222",
+				"_password": "123456"
+			},
+			"User": {
+				"name": "APIJSONUser"
+			},
+			"verify": "1234"
+		}
+	 * 
+ */ + @PostMapping(REGISTER) + public JSONObject register(@RequestBody String request) { + JSONObject requestObject = null; + + JSONObject privacyObj; + + String phone; + String verify; + String password; + try { + requestObject = Parser.parseRequest(request, POST); + privacyObj = requestObject.getJSONObject(PRIVACY_); + + phone = StringUtil.getString(privacyObj.getString(PHONE)); + verify = requestObject.getString(VERIFY); + password = privacyObj.getString(_PASSWORD); + + if (StringUtil.isPhone(phone) == false) { + return newIllegalArgumentResult(requestObject, PRIVACY_ + "/" + PHONE); + } + if (StringUtil.isPassword(password) == false) { + return newIllegalArgumentResult(requestObject, PRIVACY_ + "/" + _PASSWORD); + } + if (StringUtil.isVerify(verify) == false) { + return newIllegalArgumentResult(requestObject, VERIFY); + } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + + JSONResponse response = new JSONResponse(headVerify(Verify.TYPE_REGISTER, phone, verify)); + if (JSONResponse.isSuccess(response) == false) { + return response; + } + //手机号或验证码错误 + if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { + return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); + } + + + + //生成User和Privacy + if (StringUtil.isEmpty(requestObject.getString(JSONRequest.KEY_TAG), true)) { + requestObject.put(JSONRequest.KEY_TAG, REGISTER); + } + response = new JSONResponse( + new Parser(POST).setNoVerifyLogin(true).parseResponse(requestObject) + ); + + //验证User和Privacy + User user = response.getObject(User.class); + long userId = user == null ? 0 : BaseModel.value(user.getId()); + Privacy privacy = response.getObject(Privacy.class); + long userId2 = privacy == null ? 0 : BaseModel.value(privacy.getId()); + Exception e = null; + if (userId <= 0 || userId != userId2) { //id不同 + e = new Exception("服务器内部错误!写入User或Privacy失败!"); + } + + if (e != null) { //出现错误,回退 + new Parser(DELETE, true).parseResponse( + new JSONRequest(new User(userId)) + ); + new Parser(DELETE, true).parseResponse( + new JSONRequest(new Privacy(userId2)) + ); + } + + return response; + } + + + /** + * @param requestObject + * @param key + * @return + */ + public static JSONObject newIllegalArgumentResult(JSONObject requestObject, String key) { + return newIllegalArgumentResult(requestObject, key, null); + } + /** + * @param requestObject + * @param key + * @param msg 详细说明 + * @return + */ + public static JSONObject newIllegalArgumentResult(JSONObject requestObject, String key, String msg) { + return Parser.extendErrorResult(requestObject + , new IllegalArgumentException(key + ":value 中value不合法!" + StringUtil.getString(msg))); + } + + + /**设置密码 + * @param request 只用String,避免encode后未decode + * @return + * @see + *
+	    使用旧密码修改
+		{
+			"oldPassword": 123456,
+			"Privacy":{
+			  "id": 13000082001,
+			  "_password": "1234567"
+			}
+		}
+		或使用手机号+验证码修改
+		{
+			"verify": "1234",
+			"Privacy":{
+			  "phone": "13000082001",
+			  "_password": "1234567"
+			}
+		}
+	 * 
+ */ + @PostMapping("put/password") + public JSONObject putPassword(@RequestBody String request){ + JSONObject requestObject = null; + String old_password; + String verify; + + int type = Verify.TYPE_PASSWORD; + + JSONObject privacyObj; + long userId; + String phone; + String password; + try { + requestObject = Parser.parseRequest(request, PUT); + old_password = StringUtil.getString(requestObject.getString(OLD_PASSWORD)); + verify = StringUtil.getString(requestObject.getString(VERIFY)); + + requestObject.remove(OLD_PASSWORD); + requestObject.remove(VERIFY); + + privacyObj = requestObject.getJSONObject(PRIVACY_); + if (privacyObj == null) { + throw new IllegalArgumentException(PRIVACY_ + " 不能为空!"); + } + userId = privacyObj.getLongValue(ID); + phone = privacyObj.getString(PHONE); + password = privacyObj.getString(_PASSWORD); + + if (StringUtil.isEmpty(password, true)) { //支付密码 + type = Verify.TYPE_PAY_PASSWORD; + password = privacyObj.getString(_PAY_PASSWORD); + if (StringUtil.isNumberPassword(password) == false) { + throw new IllegalArgumentException(PRIVACY_ + "/" + _PAY_PASSWORD + ":value 中value不合法!"); + } + } else { //登录密码 + if (StringUtil.isPassword(password) == false) { + throw new IllegalArgumentException(PRIVACY_ + "/" + _PASSWORD + ":value 中value不合法!"); + } + } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + + if (StringUtil.isPassword(old_password)) { + if (userId <= 0) { //手机号+验证码不需要userId + return Parser.extendErrorResult(requestObject, new IllegalArgumentException(ID + ":value 中value不合法!")); + } + if (old_password.equals(password)) { + return Parser.extendErrorResult(requestObject, new ConflictException("新旧密码不能一样!")); + } + + //验证旧密码 + Privacy privacy = new Privacy(userId); + if (type == Verify.TYPE_PASSWORD) { + privacy.setPassword(old_password); + } else { + privacy.setPayPassword(old_password); + } + JSONResponse response = new JSONResponse( + new Parser(HEAD, true).parseResponse( + new JSONRequest(privacy) + ) + ); + if (JSONResponse.isExist(response.getJSONResponse(PRIVACY_)) == false) { + return Parser.extendErrorResult(requestObject, new ConditionErrorException("账号或原密码错误,请重新输入!")); + } + } + else if (StringUtil.isPhone(phone) && StringUtil.isVerify(verify)) { + JSONResponse response = new JSONResponse(headVerify(type, phone, verify)); + if (JSONResponse.isSuccess(response) == false) { + return response; + } + if (JSONResponse.isExist(response.getJSONResponse(VERIFY_)) == false) { + return Parser.extendErrorResult(response, new ConditionErrorException("手机号或验证码错误!")); + } + response = new JSONResponse( + new Parser(GET, true).parseResponse( + new JSONRequest( + new Privacy().setPhone(phone) + ) + ) + ); + Privacy privacy = response.getObject(Privacy.class); + long id = privacy == null ? 0 : BaseModel.value(privacy.getId()); + privacyObj.remove(PHONE); + privacyObj.put(ID, id); + + requestObject.put(PRIVACY_, privacyObj); + } else { + return Parser.extendErrorResult(requestObject, new IllegalArgumentException("请输入合法的 旧密码 或 手机号+验证码 !")); + } + //TODO 上线版加上 password = MD5Util.MD5(password); + + + // requestObject.put(JSONRequest.KEY_TAG, "Password"); + //修改密码 + return new Parser(PUT, true).parseResponse(requestObject); + } + + + + /**充值/提现 + * @param request 只用String,避免encode后未decode + * @param session + * @return + * @see + *
+		{
+			"Privacy": {
+				"id": 82001,
+				"balance+": 100,
+				"_payPassword": "123456"
+			}
+		}
+	 * 
+ */ + @PostMapping("put/balance") + public JSONObject putBalance(@RequestBody String request, HttpSession session) { + JSONObject requestObject = null; + JSONObject privacyObj; + long userId; + String payPassword; + double change; + try { + Verifier.verifyLogin(session); + requestObject = Parser.getCorrectRequest(PUT, Parser.parseRequest(request, PUT)); + + privacyObj = requestObject.getJSONObject(PRIVACY_); + if (privacyObj == null) { + throw new NullPointerException("请设置 " + PRIVACY_ + "!"); + } + userId = privacyObj.getLongValue(ID); + payPassword = privacyObj.getString(_PAY_PASSWORD); + change = privacyObj.getDoubleValue("balance+"); + + if (userId <= 0) { + throw new IllegalArgumentException(PRIVACY_ + "." + ID + ":value 中value不合法!"); + } + if (StringUtil.isPassword(payPassword) == false) { + throw new IllegalArgumentException(PRIVACY_ + "." + _PAY_PASSWORD + ":value 中value不合法!"); + } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); + } + + //验证密码<<<<<<<<<<<<<<<<<<<<<<< + + privacyObj.remove("balance+"); + JSONResponse response = new JSONResponse( + new Parser(HEADS, true).setSession(session).parseResponse( + new JSONRequest(PRIVACY_, privacyObj) + ) + ); + response = response.getJSONResponse(PRIVACY_); + if (JSONResponse.isExist(response) == false) { + return Parser.extendErrorResult(requestObject, new ConditionErrorException("支付密码错误!")); + } + + //验证密码>>>>>>>>>>>>>>>>>>>>>>>> + + + //验证金额范围<<<<<<<<<<<<<<<<<<<<<<< + + if (change == 0) { + return Parser.extendErrorResult(requestObject, new OutOfRangeException("balance+的值不能为0!")); + } + if (Math.abs(change) > 10000) { + return Parser.extendErrorResult(requestObject, new OutOfRangeException("单次 充值/提现 的金额不能超过10000元!")); + } + + //验证金额范围>>>>>>>>>>>>>>>>>>>>>>>> + + if (change < 0) {//提现 + response = new JSONResponse( + new Parser(GETS, true).parseResponse( + new JSONRequest( + new Privacy(userId) + ) + ) + ); + Privacy privacy = response == null ? null : response.getObject(Privacy.class); + long id = privacy == null ? 0 : BaseModel.value(privacy.getId()); + if (id != userId) { + return Parser.extendErrorResult(requestObject, new Exception("服务器内部错误!")); + } + + if (BaseModel.value(privacy.getBalance()) < -change) { + return Parser.extendErrorResult(requestObject, new OutOfRangeException("余额不足!")); + } + } + + + privacyObj.remove(_PAY_PASSWORD); + privacyObj.put("balance+", change); + requestObject.put(PRIVACY_, privacyObj); + requestObject.put(JSONRequest.KEY_TAG, PRIVACY_); + //不免验证,里面会验证身份 + return new Parser(PUT).setSession(session).parseResponse(requestObject); + } + + +} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/Function.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Function.java similarity index 91% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/Function.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Function.java index 2abccfc52..2995482cf 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/Function.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Function.java @@ -60,12 +60,12 @@ public static void test() throws Exception { jsonMap.put("map", map); - Log.i(TAG, "plus = " + invoke(jsonMap, "plus(long:i0,long:i1)")); - Log.i(TAG, "count = " + invoke(jsonMap, "count(Collection:collection)")); - Log.i(TAG, "isContain = " + invoke(jsonMap, "isContain(Collection:collection,Object:id)")); - Log.i(TAG, "get(Map:map,key) = " + invoke(jsonMap, "get(Map:map,key)")); - Log.i(TAG, "get(Collection:collection,int:@position) = " + invoke(jsonMap, "get(Collection:collection,int:@position)")); - Log.i(TAG, "Integer:get(Map:map,key) = " + invoke(jsonMap, "Integer:get(Map:map,key)")); + Log.i(TAG, "plus(1, -2) = " + invoke(jsonMap, "plus(long:i0,long:i1)")); + Log.i(TAG, "count([1,2,4,10]) = " + invoke(jsonMap, "count(Collection:collection)")); + Log.i(TAG, "isContain([1,2,4,10], 10) = " + invoke(jsonMap, "isContain(Collection:collection,Object:id)")); + Log.i(TAG, "get({key:true}, key) = " + invoke(jsonMap, "get(Map:map,key)")); + Log.i(TAG, "get([1,2,4,10], 0) = " + invoke(jsonMap, "get(Collection:collection,int:@position)")); + Log.i(TAG, "Integer:get({key:true}, key) = " + invoke(jsonMap, "Integer:get(Map:map,key)")); } /**反射调用 @@ -126,10 +126,6 @@ public long plus(long i0, long i1) { return i0 + i1; } - public JSONObject newVerify(String phone) { - return new Controller().postVerify(phone); - } - //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**判断collection是否为空 diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/FunctionList.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/FunctionList.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/FunctionList.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/FunctionList.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/AccessVerifier.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Verifier.java similarity index 65% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/AccessVerifier.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Verifier.java index 8026da8f3..2cdc02754 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/AccessVerifier.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/Verifier.java @@ -14,6 +14,14 @@ package apijson.demo.server; +import static zuo.biao.apijson.RequestMethod.DELETE; +import static zuo.biao.apijson.RequestMethod.GET; +import static zuo.biao.apijson.RequestMethod.HEAD; +import static zuo.biao.apijson.RequestMethod.POST; +import static zuo.biao.apijson.RequestMethod.GETS; +import static zuo.biao.apijson.RequestMethod.HEADS; +import static zuo.biao.apijson.RequestMethod.PUT; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -29,46 +37,57 @@ import apijson.demo.server.model.Comment; import apijson.demo.server.model.Login; import apijson.demo.server.model.Moment; -import apijson.demo.server.model.Password; +import apijson.demo.server.model.Privacy; import apijson.demo.server.model.User; -import apijson.demo.server.model.UserPrivacy; import apijson.demo.server.model.Verify; -import apijson.demo.server.model.Wallet; import zuo.biao.apijson.JSON; -import zuo.biao.apijson.JSONRequest; +import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.MethodAccess; import zuo.biao.apijson.RequestMethod; import zuo.biao.apijson.RequestRole; +import zuo.biao.apijson.model.Column; +import zuo.biao.apijson.model.Request; +import zuo.biao.apijson.model.Response; +import zuo.biao.apijson.model.Table; +import zuo.biao.apijson.model.Test; +import zuo.biao.apijson.server.JSONRequest; +import zuo.biao.apijson.server.Parser; +import zuo.biao.apijson.server.exception.ConflictException; import zuo.biao.apijson.server.exception.NotLoggedInException; import zuo.biao.apijson.server.sql.SQLConfig; /**权限验证类 * @author Lemon */ -public class AccessVerifier { - private static final String TAG = "AccessVerifier"; +public class Verifier { + private static final String TAG = "Verifier"; public static final String KEY_PASSWORD = "password"; public static final String KEY_LOGIN_PASSWORD = "loginPassword"; public static final String KEY_PAY_PASSWORD = "payPassword"; + public static final String KEY_OLD_PASSWORD = "oldPassword"; // > // > - public static final Map> accessMap; + public static final Map> ACCESS_MAP; static { - accessMap = new HashMap>(); - - accessMap.put(User.class.getSimpleName(), getAccessMap(User.class.getAnnotation(MethodAccess.class))); - accessMap.put(UserPrivacy.class.getSimpleName(), getAccessMap(UserPrivacy.class.getAnnotation(MethodAccess.class))); - accessMap.put(Moment.class.getSimpleName(), getAccessMap(Moment.class.getAnnotation(MethodAccess.class))); - accessMap.put(Comment.class.getSimpleName(), getAccessMap(Comment.class.getAnnotation(MethodAccess.class))); - accessMap.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class))); - accessMap.put(Login.class.getSimpleName(), getAccessMap(Login.class.getAnnotation(MethodAccess.class))); - accessMap.put(Password.class.getSimpleName(), getAccessMap(Password.class.getAnnotation(MethodAccess.class))); - accessMap.put(Wallet.class.getSimpleName(), getAccessMap(Wallet.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP = new HashMap>(); + + ACCESS_MAP.put(Table.class.getSimpleName(), getAccessMap(Table.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Column.class.getSimpleName(), getAccessMap(Column.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Test.class.getSimpleName(), getAccessMap(Test.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Request.class.getSimpleName(), getAccessMap(Request.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Response.class.getSimpleName(), getAccessMap(Response.class.getAnnotation(MethodAccess.class))); + + ACCESS_MAP.put(User.class.getSimpleName(), getAccessMap(User.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Privacy.class.getSimpleName(), getAccessMap(Privacy.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Moment.class.getSimpleName(), getAccessMap(Moment.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Comment.class.getSimpleName(), getAccessMap(Comment.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Verify.class.getSimpleName(), getAccessMap(Verify.class.getAnnotation(MethodAccess.class))); + ACCESS_MAP.put(Login.class.getSimpleName(), getAccessMap(Login.class.getAnnotation(MethodAccess.class))); } /**获取权限Map,每种操作都只允许对应的角色 @@ -81,13 +100,13 @@ private static HashMap getAccessMap(MethodAccess a } HashMap map = new HashMap<>(); - map.put(RequestMethod.GET, access.GET()); - map.put(RequestMethod.HEAD, access.HEAD()); - map.put(RequestMethod.POST_GET, access.POST_GET()); - map.put(RequestMethod.POST_HEAD, access.POST_HEAD()); - map.put(RequestMethod.POST, access.POST()); - map.put(RequestMethod.PUT, access.PUT()); - map.put(RequestMethod.DELETE, access.DELETE()); + map.put(GET, access.GET()); + map.put(HEAD, access.HEAD()); + map.put(GETS, access.GETS()); + map.put(HEADS, access.HEADS()); + map.put(POST, access.POST()); + map.put(PUT, access.PUT()); + map.put(DELETE, access.DELETE()); return map; } @@ -119,7 +138,7 @@ public static boolean verify(SQLConfig config, User visitor) throws Exception { //验证角色,假定真实强制匹配<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - String userIdkey = Controller.USER_.equals(config.getTable()) || Controller.USER_PRIVACY_.equals(config.getTable()) + String userIdkey = Controller.USER_.equals(config.getTable()) || Controller.PRIVACY_.equals(config.getTable()) ? Controller.ID : Controller.USER_ID; if (role == null) { @@ -161,7 +180,7 @@ public static boolean verify(SQLConfig config, User visitor) throws Exception { } if (list.contains(new Long("" + id)) == false) {//Integer等转为Long才能正确判断。强转崩溃 if (method == null) { - method = RequestMethod.GET; + method = GET; } throw new IllegalAccessException(userIdkey + " = " + id + " 的 " + table + " 不允许 " + role.name() + " 用户的 " + method.name() + " 请求!"); @@ -197,12 +216,12 @@ public static void verifyRole(String table, RequestMethod method, RequestRole ro Log.d(TAG, "verifyRole table = " + table + "; method = " + method + "; role = " + role); if (table != null) { if (method == null) { - method = RequestMethod.GET; + method = GET; } if (role == null) { role = RequestRole.UNKNOWN; } - Map map = accessMap.get(table); + Map map = ACCESS_MAP.get(table); if (map == null || BaseModel.isContain(map.get(method), role) == false) { throw new IllegalAccessException(table + " 不允许 " + role.name() + " 用户的 " + method.name() + " 请求!"); @@ -218,6 +237,7 @@ public static void verifyRole(String table, RequestMethod method, RequestRole ro * @throws Exception */ public static void verifyLogin(HttpSession session) throws Exception { + Log.d(TAG, "verifyLogin session.getId() = " + (session == null ? null : session.getId())); verifyLogin(getUserId(session)); } /**登录校验 @@ -231,6 +251,50 @@ public static void verifyLogin(Long userId) throws Exception { throw new NotLoggedInException("未登录,请登录后再操作!"); } } + + + + /**验证是否重复 + * @param table + * @param key + * @param value + * @throws Exception + */ + public static void verifyRepeat(String table, String key, Object value) throws Exception { + verifyRepeat(table, key, value, 0); + } + /**验证是否重复 + * @param table + * @param key + * @param value + * @param exceptId 不包含id + * @throws Exception + */ + public static void verifyRepeat(String table, String key, Object value, long exceptId) throws Exception { + if (key == null || value == null) { + Log.e(TAG, "verifyRepeat key == null || value == null >> return;"); + return; + } + if (value instanceof JSON) { + throw new UnsupportedDataTypeException(key + ":value 中value的类型不能为JSON!"); + } + + JSONRequest request = new JSONRequest(key, value); + if (exceptId > 0) {//允许修改自己的属性为该属性原来的值 + request.put(JSONRequest.KEY_ID + "!", exceptId); + } + JSONObject repeat = new Parser(HEAD, true).parseResponse( + new JSONRequest(table, request) + ); + repeat = repeat == null ? null : repeat.getJSONObject(table); + if (repeat == null) { + throw new Exception("服务器内部错误 verifyRepeat repeat == null"); + } + if (repeat.getIntValue(JSONResponse.KEY_COUNT) > 0) { + throw new ConflictException(key + ": " + value + " 已经存在,不能重复!"); + } + } + /**获取来访用户的id * @author Lemon @@ -267,6 +331,7 @@ public static JSONObject removeAccessInfo(JSONObject requestObject) { requestObject.remove(KEY_PASSWORD); requestObject.remove(KEY_LOGIN_PASSWORD); requestObject.remove(KEY_PAY_PASSWORD); + requestObject.remove(KEY_OLD_PASSWORD); } return requestObject; } diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/BaseModel.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/BaseModel.java new file mode 100644 index 000000000..8dec7d729 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/BaseModel.java @@ -0,0 +1,304 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server.model; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.Map; + +import com.alibaba.fastjson.JSON; + +import zuo.biao.apijson.StringUtil; + +/**base model for reduce model codes + * @author Lemon + * @use extends BaseModel + */ +public abstract class BaseModel implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; //主键,唯一标识 + private Long userId; //对应User表中的id,外键 + private String date; //创建时间,JSON没有Date,TimeStamp类型,都会被转成Long,不能用! + + public Long getId() { + return id; + } + public BaseModel setId(Long id) { + this.id = id; + return this; + } + public Long getUserId() { + return userId; + } + public BaseModel setUserId(Long userId) { + this.userId = userId; + return this; + } + public String getDate() { + return date; + } + public BaseModel setDate(String date) { + this.date = date; + return this; + } + + + @Override + public String toString() { + return JSON.toJSONString(this); + } + + + /**获取当前时间戳 + * @return + */ + public static Timestamp currentTimeStamp() { + return new Timestamp(new Date().getTime()); + } + /**获取时间戳 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static Timestamp getTimeStamp(String time) { + return Timestamp.valueOf(time); + } + /**获取时间毫秒值 TODO 判空? 还是要报错? + * @param time + * @return + */ + public static long getTimeMillis(String time) { + return StringUtil.isEmpty(time, true) ? 0 : getTimeStamp(time).getTime(); + } + + + //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**判断array是否为空 + * @param array + * @return + */ + public static boolean isEmpty(T[] array) { + return array == null || array.length <= 0; + } + /**判断collection是否为空 + * @param collection + * @return + */ + public static boolean isEmpty(Collection collection) { + return collection == null || collection.isEmpty(); + } + /**判断map是否为空 + * @param + * @param + * @param map + * @return + */ + public static boolean isEmpty(Map map) { + return map == null || map.isEmpty(); + } + //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + //判断是否包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**判断array是否包含a + * @param array + * @param a + * @return + */ + public static boolean isContain(T[] array, T a) { + return array == null ? false : Arrays.asList(array).contains(a); + } + /**判断collection是否包含object + * @param collection + * @param object + * @return + */ + public static boolean isContain(Collection collection, T object) { + return collection != null && collection.contains(object); + } + /**判断map是否包含key + * @param + * @param + * @param map + * @param key + * @return + */ + public static boolean isContainKey(Map map, K key) { + return map != null && map.containsKey(key); + } + /**判断map是否包含value + * @param + * @param + * @param map + * @param value + * @return + */ + public static boolean isContainValue(Map map, V value) { + return map != null && map.containsValue(value); + } + //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**获取数量 + * @param + * @param array + * @return + */ + public static int count(T[] array) { + return array == null ? 0 : array.length; + } + /**获取数量 + * @param + * @param collection List, Vector, Set等都是Collection的子类 + * @return + */ + public static int count(Collection collection) { + return collection == null ? 0 : collection.size(); + } + /**获取数量 + * @param + * @param + * @param map + * @return + */ + public static int count(Map map) { + return map == null ? 0 : map.size(); + } + //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**获取 + * @param + * @param array + * @return + */ + public static T get(T[] array, int position) { + return position < 0 || position >= count(array) ? null : array[position]; + } + /**获取 + * @param + * @param collection List, Vector, Set等都是Collection的子类 + * @return + */ + @SuppressWarnings("unchecked") + public static T get(Collection collection, int position) { + return collection == null ? null : (T) get(collection.toArray(), position); + } + /**获取 + * @param + * @param + * @param map null ? null + * @param key null ? null : map.get(key); + * @return + */ + public static V get(Map map, K key) { + return key == null || map == null ? null : map.get(key); + } + //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**获取非空值 + * @param value + * @return + */ + public static boolean value(Boolean value) { + return value == null ? false : value; + } + /**获取非空值 + * @param value + * @return + */ + public static int value(Integer value) { + return value == null ? 0 : value; + } + /**获取非空值 + * @param value + * @return + */ + public static long value(Long value) { + return value == null ? 0 : value; + } + /**获取非空值 + * @param value + * @return + */ + public static float value(Float value) { + return value == null ? 0 : value; + } + /**获取非空值 + * @param value + * @return + */ + public static double value(Double value) { + return value == null ? 0 : value; + } + //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + /**index是否在arr长度范围内 + * @param index + * @param array + * @return + */ + public static boolean isIndexInRange(Integer index, Object[] array) { + return index != null && index >= 0 && index < count(array); + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param index + * @param array + * @return + */ + public static int getIndexInRange(Integer index, Object[] array) { + return getIndexInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static int getIndexInRange(Integer index, Object[] array, int defaultIndex) { + return isIndexInRange(index, array) ? index : defaultIndex; + } + + /**获取在arr长度范围内的index + * defaultIndex = 0 + * @param + * @param index + * @param array + * @return + */ + public static T getInRange(Integer index, T[] array) { + return getInRange(index, array, 0); + } + /**获取在arr长度范围内的index + * @param + * @param index + * @param array + * @param defaultIndex + * @return + */ + public static T getInRange(Integer index, T[] array, int defaultIndex) { + return get(array, getIndexInRange(index, array, defaultIndex)); + } + +} diff --git a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/client/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Comment.java similarity index 73% rename from APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/client/package-info.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Comment.java index 84599fa4a..5bbdb50fc 100644 --- a/APIJSON(Android)/APIJSON(AndroidStudio)/APIJSONTest/APIJSONLibrary/src/main/java/zuo/biao/apijson/client/package-info.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Comment.java @@ -1,4 +1,4 @@ -/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,11 +12,13 @@ See the License for the specific language governing permissions and limitations under the License.*/ -/** - * files for client projects - */ -/** +package apijson.demo.server.model; + +import zuo.biao.apijson.MethodAccess; + +/**评论类 * @author Lemon - * */ -package zuo.biao.apijson.client; \ No newline at end of file +@MethodAccess +public class Comment { +} \ No newline at end of file diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Login.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Login.java new file mode 100644 index 000000000..6a0973bf0 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Login.java @@ -0,0 +1,62 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CONTACT; +import static zuo.biao.apijson.RequestRole.LOGIN; +import static zuo.biao.apijson.RequestRole.OWNER; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import zuo.biao.apijson.MethodAccess; + +/**登录日志表 + * @author Lemon + */ +@SuppressWarnings("serial") +@MethodAccess( + GET = {}, + HEAD = {}, + GETS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, + HEADS = {UNKNOWN, LOGIN, CONTACT, OWNER, ADMIN}, + POST = {ADMIN}, + PUT = {ADMIN}, + DELETE = {ADMIN} + ) +public class Login extends BaseModel { + + public static final int TYPE_PASSWORD = 0;//密码登录 + public static final int TYPE_VERIFY = 1;//验证码登录 + + private Integer type; + + public Login() { + super(); + } + public Login(long userId) { + this(); + setUserId(userId); + } + + + public Integer getType() { + return type; + } + public Login setType(Integer type) { + this.type = type; + return this; + } + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Moment.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Moment.java new file mode 100644 index 000000000..8fc89e5ed --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Moment.java @@ -0,0 +1,32 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CIRCLE; +import static zuo.biao.apijson.RequestRole.CONTACT; +import static zuo.biao.apijson.RequestRole.LOGIN; +import static zuo.biao.apijson.RequestRole.OWNER; + +import zuo.biao.apijson.MethodAccess; + +/**动态类 + * @author Lemon + */ +@MethodAccess( + PUT = {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}//TODO 还要细分,LOGIN,CONTACT只允许修改praiseUserIdList。数据库加role没用,应该将praiseUserIdList移到Praise表 + ) +public class Moment { +} \ No newline at end of file diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Privacy.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Privacy.java new file mode 100644 index 000000000..48516110e --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Privacy.java @@ -0,0 +1,99 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CIRCLE; +import static zuo.biao.apijson.RequestRole.OWNER; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import zuo.biao.apijson.MethodAccess; + +/**用户隐私信息 + * @author Lemon + */ +@MethodAccess( + GET = {}, + GETS = {CIRCLE, OWNER, ADMIN}, + POST = {UNKNOWN, ADMIN}, + DELETE = {ADMIN} + ) +public class Privacy extends BaseModel { + private static final long serialVersionUID = 1L; + + public static final int PASSWORD_TYPE_LOGIN = 0; + public static final int PASSWORD_TYPE_PAY = 1; + + private String phone; //手机 + private String password; //登录密码,隐藏字段 + private String payPassword; //支付密码,隐藏字段 + private Double balance; //余额 + + public Privacy() { + super(); + } + + public Privacy(long id) { + this(); + setId(id); + } + + public Privacy(String phone, String password) { + this(); + setPhone(phone); + setPassword(password); + } + + + + public String getPhone() { + return phone; + } + public Privacy setPhone(String phone) { + this.phone = phone; + return this; + } + + /**get_password会转为password + * @return + */ + public String get__password() { + return password; + } + public Privacy setPassword(String password) { + this.password = password; + return this; + } + + /**get_PayPassword会转为PayPassword + * @return + */ + public String get__payPassword() { + return payPassword; + } + public Privacy setPayPassword(String payPassword) { + this.payPassword = payPassword; + return this; + } + + public Double getBalance() { + return balance; + } + public Privacy setBalance(Double balance) { + this.balance = balance; + return this; + } + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/User.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/User.java new file mode 100644 index 000000000..75f0c7682 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/User.java @@ -0,0 +1,102 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package apijson.demo.server.model; + +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import java.util.List; + +import zuo.biao.apijson.MethodAccess; + +/**用户类 + * @author Lemon + */ +@MethodAccess( + POST = {UNKNOWN, ADMIN}, + DELETE = {ADMIN} + ) +public class User extends BaseModel { + private static final long serialVersionUID = 1L; + + public static final int SEX_MAIL = 0; + public static final int SEX_FEMALE = 1; + public static final int SEX_UNKNOWN = 2; + + + private Integer sex; //性别 + private String head; //头像url + private String name; //姓名 + private String tag; //标签 + private List pictureList; //照片列表 + private List contactIdList; //朋友列表 + + /**默认构造方法,JSON等解析时必须要有 + */ + public User() { + super(); + } + public User(long id) { + this(); + setId(id); + } + + public Integer getSex() { + return sex; + } + public User setSex(Integer sex) { + this.sex = sex; + return this; + } + public String getHead() { + return head; + } + public User setHead(String head) { + this.head = head; + return this; + } + public String getName() { + return name; + } + public User setName(String name) { + this.name = name; + return this; + } + public List getPictureList() { + return pictureList; + } + public User setPictureList(List pictureList) { + this.pictureList = pictureList; + return this; + } + + public String getTag() { + return tag; + } + public User setTag(String tag) { + this.tag = tag; + return this; + } + + public List getContactIdList() { + return contactIdList; + } + public User setContactIdList(List contactIdList) { + this.contactIdList = contactIdList; + return this; + } + + +} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Password.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Verify.java similarity index 51% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Password.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Verify.java index f0c9b8c48..b88cd2a98 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONApp/APIJSONApp/src/apijson/demo/server/model/Password.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/Verify.java @@ -15,80 +15,74 @@ package apijson.demo.server.model; import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CIRCLE; +import static zuo.biao.apijson.RequestRole.CONTACT; import static zuo.biao.apijson.RequestRole.LOGIN; import static zuo.biao.apijson.RequestRole.OWNER; import static zuo.biao.apijson.RequestRole.UNKNOWN; import zuo.biao.apijson.MethodAccess; -import zuo.biao.apijson.StringUtil; -/**密码类,已用UserPrivacy替代 +/**验证码 * @author Lemon - * @see - *
POST_HEAD:
-{
- "Password":{
-     "disallow":"!",
-     "necessary":"id,type"
- }
-}
- * 
- *
PUT:put/loginPassword, put/payPassword
-{
-    "Password":{
-        "disallow":"!",
-        "necessary":"id,type,password"
-    },
-    "necessary":"oldPassword"
-}
- * 
*/ -@Deprecated @MethodAccess( GET = {}, HEAD = {}, - POST_HEAD = {OWNER, ADMIN}, - POST = {UNKNOWN, LOGIN, OWNER, ADMIN} + GETS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + HEADS = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + POST = {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}, + PUT = {ADMIN}, + DELETE = {ADMIN} ) -public class Password extends BaseModel { +public class Verify extends BaseModel { private static final long serialVersionUID = 1L; - public static final int TYPE_LOGIN = 0; - public static final int TYPE_PAY = 1; + public static final int TYPE_LOGIN = 0; //登录 + public static final int TYPE_REGISTER = 1; //注册 + public static final int TYPE_PASSWORD = 2; //登录密码 + public static final int TYPE_PAY_PASSWORD = 3; //支付密码 - private Integer type; - private String password; + private String phone; //手机 + private String verify; //验证码 + private Integer type; //验证类型 - public Password() { + public Verify() { super(); } - public Password(String phone) { + /**type和phone为联合主键,必传 + * @param type + * @param phone + */ + public Verify(int type, String phone) { this(); + setType(type); setPhone(phone); } - public Password(String phone, String password) { - this(phone); - setPassword(password); + + + public String getVerify() { + return verify; + } + public Verify setVerify(String verify) { + this.verify = verify; + return this; } - public Password setPhone(String phone) { - setId(Long.valueOf(0 + StringUtil.getNumber(phone))); + public String getPhone() { + return phone; + } + public Verify setPhone(String phone) { + this.phone = phone; return this; } - + public Integer getType() { return type; } - public Password setType(Integer type) { + public Verify setType(Integer type) { this.type = type; return this; } - public String getPassword() { - return password; - } - public Password setPassword(String password) { - this.password = password; - return this; - } } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/model/package-info.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/model/package-info.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/apijson/demo/server/package-info.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/apijson/demo/server/package-info.java diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSON.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSON.java new file mode 100755 index 000000000..7bd24b97d --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSON.java @@ -0,0 +1,276 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; +import com.alibaba.fastjson.serializer.SerializerFeature; + +/**阿里FastJSON封装类 防止解析时异常 + * @author Lemon + */ +public class JSON { + private static final String TAG = "JSON"; + + /**判断json格式是否正确 + * @param s + * @return + */ + public static boolean isJsonCorrect(String s) { + //太长 Log.i(TAG, "isJsonCorrect <<<< " + s + " >>>>>>>"); + if (s == null + // || s.equals("[]") + // || s.equals("{}") + || s.equals("") + || s.equals("[null]") + || s.equals("{null}") + || s.equals("null")) { + return false; + } + return true; + } + + /**获取有效的json + * @param s + * @return + */ + public static String getCorrectJson(String s) { + return getCorrectJson(s, false); + } + /**获取有效的json + * @param s + * @param isArray + * @return + */ + public static String getCorrectJson(String s, boolean isArray) { + s = StringUtil.getTrimedString(s); + // if (isArray) { + // while (s.startsWith("\"")) { + // s = s.substring(1); + // } + // while (s.endsWith("\"")) { + // s = s.substring(0, s.length() - 1); + // } + // } + return s;//isJsonCorrect(s) ? s : null; + } + + /**obj转JSONObject + * @param json + * @return + */ + public static JSONObject parseObject(Object obj) { + if (obj instanceof JSONObject) { + return (JSONObject) obj; + } + return parseObject(toJSONString(obj)); + } + /**json转JSONObject + * @param json + * @return + */ + public static JSONObject parseObject(String json) { + int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; + features |= Feature.OrderedField.getMask(); + return parseObject(json, features); + } + /**json转JSONObject + * @param json + * @param features + * @return + */ + public static JSONObject parseObject(String json, int features) { + try { + return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), JSONObject.class, features); + } catch (Exception e) { + Log.i(TAG, "parseObject catch \n" + e.getMessage()); + } + return null; + } + + /**JSONObject转实体类 + * @param object + * @param clazz + * @return + */ + public static T parseObject(JSONObject object, Class clazz) { + return parseObject(toJSONString(object), clazz); + } + /**json转实体类 + * @param json + * @param clazz + * @return + */ + public static T parseObject(String json, Class clazz) { + if (clazz == null) { + Log.e(TAG, "parseObject clazz == null >> return null;"); + } else { + try { + int features = com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; + features |= Feature.OrderedField.getMask(); + return com.alibaba.fastjson.JSON.parseObject(getCorrectJson(json), clazz, features); + } catch (Exception e) { + Log.i(TAG, "parseObject catch \n" + e.getMessage()); + } + } + return null; + } + + /**list转JSONArray + * @param list + * @return + */ + public static JSONArray parseArray(List list) { + return new JSONArray(list); + } + /**obj转JSONArray + * @param json + * @return + */ + public static JSONArray parseArray(Object obj) { + if (obj instanceof JSONArray) { + return (JSONArray) obj; + } + return parseArray(toJSONString(obj)); + } + /**json转JSONArray + * @param json + * @return + */ + public static JSONArray parseArray(String json) { + try { + return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true)); + } catch (Exception e) { + Log.i(TAG, "parseArray catch \n" + e.getMessage()); + } + return null; + } + /**JSONArray转实体类列表 + * @param array + * @param clazz + * @return + */ + public static List parseArray(JSONArray array, Class clazz) { + return parseArray(toJSONString(array), clazz); + } + /**json转实体类列表 + * @param json + * @param clazz + * @return + */ + public static List parseArray(String json, Class clazz) { + if (clazz == null) { + Log.e(TAG, "parseArray clazz == null >> return null;"); + } else { + try { + return com.alibaba.fastjson.JSON.parseArray(getCorrectJson(json, true), clazz); + } catch (Exception e) { + Log.i(TAG, "parseArray catch \n" + e.getMessage()); + } + } + return null; + } + + /**实体类转json + * @param obj + * @return + */ + public static String toJSONString(Object obj) { + if (obj instanceof String) { + return (String) obj; + } + try { + return com.alibaba.fastjson.JSON.toJSONString(obj); + } catch (Exception e) { + Log.e(TAG, "toJSONString catch \n" + e.getMessage()); + } + return null; + } + + /**实体类转json + * @param obj + * @param features + * @return + */ + public static String toJSONString(Object obj, SerializerFeature... features) { + if (obj instanceof String) { + return (String) obj; + } + try { + return com.alibaba.fastjson.JSON.toJSONString(obj, features); + } catch (Exception e) { + Log.e(TAG, "parseArray catch \n" + e.getMessage()); + } + return null; + } + + /**格式化,显示更好看 + * @param json + * @return + */ + public static String format(String json) { + return format(parseObject(json)); + } + /**格式化,显示更好看 + * @param object + * @return + */ + public static String format(JSONObject object) { + return toJSONString(object, SerializerFeature.PrettyFormat); + } + + /**判断是否为JSONObject + * @param obj instanceof String ? parseObject + * @return + */ + public static boolean isJSONObject(Object obj) { + if (obj instanceof JSONObject) { + return true; + } + if (obj instanceof String) { + try { + JSONObject json = parseObject((String) obj); + return json != null && json.isEmpty() == false; + } catch (Exception e) { + Log.e(TAG, "isJSONObject catch \n" + e.getMessage()); + } + } + + return false; + } + /**判断是否为JSONArray + * @param obj instanceof String ? parseArray + * @return + */ + public static boolean isJSONArray(Object obj) { + if (obj instanceof JSONArray) { + return true; + } + if (obj instanceof String) { + try { + JSONArray json = parseArray((String) obj); + return json != null && json.isEmpty() == false; + } catch (Exception e) { + Log.e(TAG, "isJSONArray catch \n" + e.getMessage()); + } + } + + return false; + } + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONObject.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONObject.java new file mode 100644 index 000000000..3c9e0d1cf --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONObject.java @@ -0,0 +1,374 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Map; + +/**use this class instead of com.alibaba.fastjson.JSONObject + * @author Lemon + * @see #put + * @see #puts + * @see #putsAll + */ +public class JSONObject extends com.alibaba.fastjson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONObject"; + + + /**ordered + */ + public JSONObject() { + super(true); + } + /**transfer Object to JSONObject + * @param object + * @see {@link #JSONObject(Object, boolean)} + */ + public JSONObject(Object object) { + this(toJSONString(object)); + } + /**parse JSONObject with JSON String + * @param json + * @see {@link #JSONObject(String, boolean)} + */ + public JSONObject(String json) { + this(parseObject(json)); + } + /**transfer com.alibaba.fastjson.JSONObject to JSONObject + * @param object + * @see {@link #putsAll(com.alibaba.fastjson.JSONObject)} + */ + public JSONObject(com.alibaba.fastjson.JSONObject object) { + this(); + putsAll(object); + } + + + + + //judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ARRAY = "[]"; + + /**判断是否为Array的key + * @param key + * @return + */ + public static boolean isArrayKey(String key) { + return key != null && key.endsWith(KEY_ARRAY); + } + /**判断是否为对应Table的key + * @param key + * @return + */ + public static boolean isTableKey(String key) { + return StringUtil.isBigName(key); + } + //judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //JSONObject内关键词 key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + + /**set "id":id in Table layer + * @param id + * @return + */ + public JSONObject setId(Long id) { + return puts(KEY_ID, id); + } + /**set id{}:[] in Table layer + * @param list + * @return + */ + public JSONObject setIdIn(List list) { + return puts(KEY_ID_IN, list); + } + + + //@key关键字都放这个类 <<<<<<<<<<<<<<<<<<<<<< + public static final String KEY_ROLE = "@role"; //角色,拥有对某些数据的某些操作的权限 + public static final String KEY_CONDITION = "@condition"; //条件 TODO 用 @where& @where| @where! 替代? + public static final String KEY_TRY = "@try"; //尝试,忽略异常 + public static final String KEY_DROP = "@drop"; //丢弃,不返回 + public static final String KEY_CORRECT = "@correct"; //字段校正 + + public static final String KEY_SCHEMA = "@schema"; //数据库,Table在非默认schema内时需要声明 + public static final String KEY_ABOUT = "@about"; //关于,返回数据库表的信息,包括表说明和字段说明 + public static final String KEY_COLUMN = "@column"; //查询的Table字段或SQL函数 + public static final String KEY_GROUP = "@group"; //分组方式 + public static final String KEY_HAVING = "@having"; //聚合函数条件,一般和@group一起用 + public static final String KEY_ORDER = "@order"; //排序方式 + //@key关键字都放这个类 >>>>>>>>>>>>>>>>>>>>>> + + + /**set role of request sender + * @param role + * @return this + */ + public JSONObject setRole(String role) { + return puts(KEY_ROLE, role); + } + + /**set try, ignore exceptions + * @param tri + * @return this + */ + public JSONObject setTry(boolean tri) { + return puts(KEY_TRY, tri); + } + + /**set drop, data dropped will not return + * @param drop + * @return this + */ + public JSONObject setDrop(boolean drop) { + return puts(KEY_DROP, drop); + } + + /**set correct, correct keys to target ones + * @param correct Map{originKey, [posibleKeys]}, posibleKey之间用 , 隔开 + * @return this + */ + public JSONObject setCorrect(Map correct) { + return puts(KEY_CORRECT, correct); + } + + + + /**set schema where table was puts + * @param schema + * @return this + */ + public JSONObject setSchema(String schema) { + return puts(KEY_SCHEMA, schema); + } + + /**set about + * @param about + * @return this + */ + public JSONObject setAbout(boolean about) { + return puts(KEY_ABOUT, about); + } + + /**set keys need to be returned + * @param keys key0, key1, key2 ... + * @return {@link #setColumn(String)} + */ + public JSONObject setColumn(String... keys) { + return setColumn(StringUtil.getString(keys, true)); + } + /**set keys need to be returned + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setColumn(String keys) { + return puts(KEY_COLUMN, keys); + } + + /**set keys for group by + * @param keys key0, key1, key2 ... + * @return {@link #setGroup(String)} + */ + public JSONObject setGroup(String... keys) { + return setGroup(StringUtil.getString(keys, true)); + } + /**set keys for group by + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setGroup(String keys) { + return puts(KEY_GROUP, keys); + } + + /**set keys for having + * @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ... + * @return {@link #setHaving(String)} + */ + public JSONObject setHaving(String... keys) { + return setHaving(StringUtil.getString(keys, true)); + } + /**set keys for having + * @param keys "key0,key1,key2..." + * @return + */ + public JSONObject setHaving(String keys) { + return puts(KEY_HAVING, keys); + } + + /**set keys for order by + * @param keys key0, key1+, key2- ... + * @return {@link #setOrder(String)} + */ + public JSONObject setOrder(String... keys) { + return setOrder(StringUtil.getString(keys, true)); + } + /**set keys for order by + * @param keys "key0,key1+,key2-..." + * @return + */ + public JSONObject setOrder(String keys) { + return puts(KEY_ORDER, keys); + } + + + //JSONObject内关键词 key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //Request <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + /** + * @param key + * @param keys path = keys[0] + "/" + keys[1] + "/" + keys[2] + ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsPath(String key, String... keys) { + return puts(key+"@", StringUtil.getString(keys, "/")); + } + + /** + * @param key + * @param isNull + * @return {@link #puts(String, Object)} + */ + public JSONObject putsNull(String key, boolean isNull) { + return puts(key+"{}", SQL.isNull(isNull)); + } + /** + * trim = false + * @param key + * @param isEmpty + * @return {@link #putsEmpty(String, boolean, boolean)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty) { + return putsEmpty(key, isEmpty, false); + } + /** + * @param key + * @param isEmpty + * @return {@link #puts(String, Object)} + */ + public JSONObject putsEmpty(String key, boolean isEmpty, boolean trim) { + return puts(key+"{}", SQL.isEmpty(key, isEmpty, trim)); + } + /** + * @param key + * @param compare <=0, >5 ... + * @return {@link #puts(String, Object)} + */ + public JSONObject putsLength(String key, String compare) { + return puts(key+"{}", SQL.length(key) + compare); + } + + /**设置搜索 + * type = SEARCH_TYPE_CONTAIN_FULL + * @param key + * @param value + * @return {@link #putsSearch(String, String, int)} + */ + public JSONObject putsSearch(String key, String value) { + return putsSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); + } + /**设置搜索 + * @param key + * @param value + * @param type + * @return {@link #puts(String, Object)} + */ + public JSONObject putsSearch(String key, String value, int type) { + return puts(key+"$", SQL.search(value, type)); + } + + //Request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + /**puts key-value in object into this + * @param object + * @return this + */ + public JSONObject putsAll(Map map) { + putAll(map); + return this; + } + @Override + public void putAll(Map map) { + if (map != null && map.isEmpty() == false) { + super.putAll(map); + } + } + + + + /**put and return this + * @param value must be annotated by {@link MethodAccess} + * @return {@link #puts(String, boolean)} + */ + public JSONObject puts(Object value) { + return puts(null, value); + } + /**put and return this + * @param key + * @param value + * @return this + * @see {@link #put(String, Object)} + */ + public JSONObject puts(String key, Object value) { + put(key, value); + return this; + } + + /**put and return value + * @param value must be annotated by {@link MethodAccess} + * @return {@link #put(String, boolean)} + */ + public Object put(Object value) { + return put(null, value); + } + /**put and return value + * @param key StringUtil.isEmpty(key, true) ? key = value.getClass().getSimpleName(); + * @param value + * @return value + */ + @Override + public Object put(String key, Object value) { + if (value == null) { + Log.e(TAG, "put value == null >> return null;"); + return null; + } + if (StringUtil.isEmpty(key, true)) { + Class clazz = value.getClass(); + if (clazz == null || clazz.getAnnotation(MethodAccess.class) == null) { + throw new IllegalArgumentException("puts StringUtil.isNotEmpty(key, true) == false" + + " && clazz == null || clazz.getAnnotation(MethodAccess.class) == null" + + " \n key为空时仅支持 类型被@MethodAccess注解 的value !!!" + + " \n 如果一定要这么用,请对 " + clazz.getName() + " 注解!" + + " \n 如果是类似 key[]:{} 结构的请求,建议用 putsAll(...) !"); + } + key = value.getClass().getSimpleName(); + } + return super.put(key, value); + } + + + +} diff --git a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONRequest.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONRequest.java similarity index 52% rename from APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONRequest.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONRequest.java index 78b935560..51d064731 100644 --- a/APIJSON(Android)/APIJSON(ADT)/APIJSONLibrary/src/zuo/biao/apijson/JSONRequest.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONRequest.java @@ -14,11 +14,14 @@ package zuo.biao.apijson; -/**encapsulator for request JSONObject, encode in default cases +import java.util.Map; + +/**wrapper for request * @author Lemon + * @see #puts * @see #toArray * @use JSONRequest request = new JSONRequest(...); - *
request.put(...);//not a must + *
request.puts(...);//not a must *
request.toArray(...);//not a must */ public class JSONRequest extends JSONObject { @@ -28,51 +31,43 @@ public JSONRequest() { super(); } /** - * encode = true - * @param object must be annotated by {@link APIJSONRequest} + * @param object must be annotated by {@link MethodAccess} * @see {@link #JSONRequest(String, Object)} */ public JSONRequest(Object object) { this(null, object); } /** - * encode = true * @param name * @param object - * @see {@link #JSONRequest(String, Object, boolean)} + * @see {@link #puts(String, Object)} */ public JSONRequest(String name, Object object) { - this(name, object, true); - } - /** - * @param object must be annotated by {@link APIJSONRequest} - * @param encode - * @see {@link #JSONRequest(String, Object, boolean)} - */ - public JSONRequest(Object object, boolean encode) { - this(null, object, encode); - } - /** - * @param name - * @param object - * @param encode - * @see {@link #put(String, Object, boolean)} - */ - public JSONRequest(String name, Object object, boolean encode) { this(); - put(name, object, encode); + puts(name, object); } - - - + public static final String KEY_TAG = "tag";//只在最外层,最外层用JSONRequest - - public JSONObject setTag(String tag) { - put(KEY_TAG, tag); - return this; + public static final String KEY_VERSION = "version";//只在最外层,最外层用JSONRequest + + /**set "tag":tag in outermost layer + * for write operations + * @param tag + * @return + */ + public JSONRequest setTag(String tag) { + return puts(KEY_TAG, tag); + } + /**set "version":version in outermost layer + * for target version of request + * @param version + * @return + */ + public JSONRequest setVersion(String version) { + return puts(KEY_VERSION, version); } @@ -86,104 +81,67 @@ public JSONObject setTag(String tag) { public static final String KEY_COUNT = "count"; public static final String KEY_PAGE = "page"; - /** + /**set what to query in Array layer * @param query what need to query, Table,total,ALL? * @return + * @see {@link #QUERY_TABLE} + * @see {@link #QUERY_TOTAL} + * @see {@link #QUERY_ALL} */ public JSONRequest setQuery(int query) { - put(KEY_QUERY, query); - return this; + return puts(KEY_QUERY, query); } - /** - * @param count + /**set maximum count of Tables to query in Array layer + * @param count <= 0 || >= max ? max : count * @return */ public JSONRequest setCount(int count) { - put(KEY_COUNT, count); - return this; + return puts(KEY_COUNT, count); } - /** - * @param page + /**set page of Tables to query in Array layer + * @param page <= 0 ? 0 : page * @return */ public JSONRequest setPage(int page) { - put(KEY_PAGE, page); - return this; + return puts(KEY_PAGE, page); } //array object >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - // 导致JSONObject add >> get = null - // /** - // * decode = true - // * @param key - // * return {@link #get(Object, boolean)} - // */ - // @Override - // public Object get(Object key) { - // return get(key, true); - // } - - /** - * encode = true - * @param value must be annotated by {@link APIJSONRequest} - * @return {@link #put(String, boolean)} - */ - @Override - public Object put(Object value) { - return put(value, true); - } - /** - * encode = true - * @param key - * @param value - * return {@link #put(String, Object, boolean)} - */ - @Override - public Object put(String key, Object value) { - return put(key, value, true); - } - - /**create a parent JSONObject named KEY_ARRAY - * encode = true; * @param count * @param page * @return {@link #toArray(int, int, boolean)} */ public JSONRequest toArray(int count, int page) { - return toArray(count, page, true); - } - /**create a parent JSONObject named KEY_ARRAY - * encode = true; - * @param count - * @param page - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, boolean encode) { - return toArray(count, page, null, encode); - } - /**create a parent JSONObject named name+KEY_ARRAY - * encode = true; - * @param count - * @param page - * @param name - * @return {@link #toArray(int, int, String, boolean)} - */ - public JSONRequest toArray(int count, int page, String name) { - return toArray(count, page, name, true); + return toArray(count, page, null); } /**create a parent JSONObject named name+KEY_ARRAY. * @param count * @param page * @param name - * @param encode * @return {name+KEY_ARRAY : this}. if needs to be put, use {@link #add(com.alibaba.fastjson.JSONObject)} instead */ - public JSONRequest toArray(int count, int page, String name, boolean encode) { - return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page), encode); + public JSONRequest toArray(int count, int page, String name) { + return new JSONRequest(StringUtil.getString(name) + KEY_ARRAY, this.setCount(count).setPage(page)); + } + + + @Override + public JSONObject putsAll(Map map) { + super.putsAll(map); + return this; + } + + @Override + public JSONRequest puts(Object value) { + return puts(null, value); + } + @Override + public JSONRequest puts(String key, Object value) { + super.puts(key, value); + return this; } } diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONResponse.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONResponse.java new file mode 100644 index 000000000..f9b6d3fc9 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/JSONResponse.java @@ -0,0 +1,400 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.util.List; +import java.util.Set; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/**parser for response + * @author Lemon + * @see #getObject + * @see #getList + * @use JSONResponse response = new JSONResponse(json); + *
User user = response.getObject(User.class);//not a must + *
List commenntList = response.getList("Comment[]", Comment.class);//not a must + */ +public class JSONResponse extends zuo.biao.apijson.JSONObject { + private static final long serialVersionUID = 1L; + + private static final String TAG = "JSONResponse"; + + public JSONResponse() { + super(); + } + public JSONResponse(String json) { + this(parseObject(json)); + } + public JSONResponse(JSONObject object) { + super(format(object)); + } + + //状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int CODE_SUCCESS = 200; //成功 + public static final int CODE_UNSUPPORTED_ENCODING = 400; //编码错误 + public static final int CODE_ILLEGAL_ACCESS = 401; //权限错误 + public static final int CODE_UNSUPPORTED_OPERATION = 403; //禁止操作 + public static final int CODE_NOT_FOUND = 404; //未找到 + public static final int CODE_ILLEGAL_ARGUMENT = 406; //参数错误 + public static final int CODE_NOT_LOGGED_IN = 407; //未登录 + public static final int CODE_TIME_OUT = 408; //超时 + public static final int CODE_CONFLICT = 409; //重复,已存在 + public static final int CODE_CONDITION_ERROR = 412; //条件错误,如密码错误 + public static final int CODE_UNSUPPORTED_TYPE = 415; //类型错误 + public static final int CODE_OUT_OF_RANGE = 416; //超出范围 + public static final int CODE_NULL_POINTER = 417; //对象为空 + public static final int CODE_SERVER_ERROR = 500; //服务器内部错误 + + + public static final String MSG_SUCCEED = "success"; //成功 + public static final String MSG_SERVER_ERROR = "Internal Server Error!"; //服务器内部错误 + + + public static final String KEY_CODE = "code"; + public static final String KEY_MSG = "msg"; + public static final String KEY_ID = "id"; + public static final String KEY_ID_IN = KEY_ID + "{}"; + public static final String KEY_COUNT = "count"; + public static final String KEY_TOTAL = "total"; + + /**获取状态 + * @return + */ + public int getCode() { + try { + return getIntValue(KEY_CODE); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取信息 + * @return + */ + public String getMsg() { + return getString(KEY_MSG); + } + /**获取id + * @return + */ + public long getId() { + try { + return getLongValue(KEY_ID); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取数量 + * @return + */ + public int getCount() { + try { + return getIntValue(KEY_COUNT); + } catch (Exception e) { + //empty + } + return 0; + } + /**获取总数 + * @return + */ + public int getTotal() { + try { + return getIntValue(KEY_TOTAL); + } catch (Exception e) { + //empty + } + return 0; + } + + + /**是否成功 + * @return + */ + public boolean isSuccess() { + return isSuccess(getCode()); + } + /**是否成功 + * @param code + * @return + */ + public static boolean isSuccess(int code) { + return code == CODE_SUCCESS; + } + /**是否成功 + * @param response + * @return + */ + public static boolean isSuccess(JSONResponse response) { + return response != null && response.isSuccess(); + } + + /**校验服务端是否存在table + * @return + */ + public boolean isExist() { + return isExist(getCount()); + } + /**校验服务端是否存在table + * @param count + * @return + */ + public static boolean isExist(int count) { + return count > 0; + } + /**校验服务端是否存在table + * @param response + * @return + */ + public static boolean isExist(JSONResponse response) { + return response != null && response.isExist(); + } + + /**获取内部的JSONResponse + * @param key + * @return + */ + public JSONResponse getJSONResponse(String key) { + return getObject(key, JSONResponse.class); + } + //状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + /** + * key = clazz.getSimpleName() + * @param clazz + * @return + */ + public T getObject(Class clazz) { + return getObject(clazz == null ? "" : clazz.getSimpleName(), clazz); + } + /** + * @param key + * @param clazz + * @return + */ + public T getObject(String key, Class clazz) { + return getObject(this, key, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static T getObject(JSONObject object, String key, Class clazz) { + return toObject(object == null ? null : object.getJSONObject(key), clazz); + } + + /** + * @param clazz + * @return + */ + public T toObject(Class clazz) { + return toObject(this, clazz); + } + /** + * @param object + * @param clazz + * @return + */ + public static T toObject(JSONObject object, Class clazz) { + return JSON.parseObject(JSON.toJSONString(object), clazz); + } + + + + + /** + * key = KEY_ARRAY + * @param clazz + * @return + */ + public List getList(Class clazz) { + return getList(KEY_ARRAY, clazz); + } + /** + * arrayObject = this + * @param key + * @param clazz + * @return + */ + public List getList(String key, Class clazz) { + return getList(this, key, clazz); + } + + /** + * key = KEY_ARRAY + * @param object + * @param clazz + * @return + */ + public static List getList(JSONObject object, Class clazz) { + return getList(object, KEY_ARRAY, clazz); + } + /** + * @param object + * @param key + * @param clazz + * @return + */ + public static List getList(JSONObject object, String key, Class clazz) { + return object == null ? null : JSON.parseArray(object.getString(replaceArray(key)), clazz); + } + + /** + * key = KEY_ARRAY + * @return + */ + public JSONArray getArray() { + return getArray(KEY_ARRAY); + } + /** + * @param key + * @return + */ + public JSONArray getArray(String key) { + return getArray(this, key); + } + /** + * @param object + * @return + */ + public static JSONArray getArray(JSONObject object) { + return getArray(object, KEY_ARRAY); + } + /** + * key = KEY_ARRAY + * @param object + * @param key + * @return + */ + public static JSONArray getArray(JSONObject object, String key) { + return object == null ? null : object.getJSONArray(replaceArray(key)); + } + + + // /** + // * @return + // */ + // public JSONObject format() { + // return format(this); + // } + /**格式化key名称 + * @param object + * @return + */ + public static JSONObject format(final JSONObject object) { + //太长查看不方便,不如debug Log.i(TAG, "format object = \n" + JSON.toJSONString(object)); + if (object == null || object.isEmpty()) { + Log.i(TAG, "format object == null || object.isEmpty() >> return object;"); + return object; + } + JSONObject formatedObject = new JSONObject(true); + + Set set = object.keySet(); + if (set != null) { + + Object value; + for (String key : set) { + value = object.get(key); + + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedObject.put(replaceArray(key), format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedObject.put(getSimpleName(key), format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedObject.put(getSimpleName(key), value); + } + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedObject = " + JSON.toJSONString(formatedObject)); + return formatedObject; + } + + /**格式化key名称 + * @param array + * @return + */ + public static JSONArray format(final JSONArray array) { + //太长查看不方便,不如debug Log.i(TAG, "format array = \n" + JSON.toJSONString(array)); + if (array == null || array.isEmpty()) { + Log.i(TAG, "format array == null || array.isEmpty() >> return array;"); + return array; + } + JSONArray formatedArray = new JSONArray(); + + Object value; + for (int i = 0; i < array.size(); i++) { + value = array.get(i); + if (value instanceof JSONArray) {//JSONArray,遍历来format内部项 + formatedArray.add(format((JSONArray) value)); + } + else if (value instanceof JSONObject) {//JSONObject,往下一级提取 + formatedArray.add(format((JSONObject) value)); + } + else {//其它Object,直接填充 + formatedArray.add(value); + } + } + + //太长查看不方便,不如debug Log.i(TAG, "format return formatedArray = " + JSON.toJSONString(formatedArray)); + return formatedArray; + } + + /**替换key+KEY_ARRAY为keyList + * @param key + * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} + */ + public static String replaceArray(String key) { + if (isArrayKey(key)) { + key = getArrayKey(key.substring(0, key.lastIndexOf(KEY_ARRAY))); + } + return getSimpleName(key); + } + /**获取列表变量名 + * @param key => StringUtil.getNoBlankString(key) + * @return empty ? "list" : key + "List" 且首字母小写 + */ + public static String getArrayKey(String key) { + return StringUtil.addSuffix(key, "list"); + } + + /**获取简单名称 + * @param fullName name 或 name:alias + * @return name => name; name:alias => alias + */ + public static String getSimpleName(String fullName) { + //key:alias -> alias; key:alias[] -> alias[] + int index = fullName == null ? -1 : fullName.indexOf(":"); + if (index >= 0) { + fullName = fullName.substring(index + 1); + } + return fullName; + } + + +} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/Log.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/Log.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/Log.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/Log.java diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/MethodAccess.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/MethodAccess.java new file mode 100644 index 000000000..939571625 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/MethodAccess.java @@ -0,0 +1,73 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static zuo.biao.apijson.RequestRole.ADMIN; +import static zuo.biao.apijson.RequestRole.CIRCLE; +import static zuo.biao.apijson.RequestRole.CONTACT; +import static zuo.biao.apijson.RequestRole.LOGIN; +import static zuo.biao.apijson.RequestRole.OWNER; +import static zuo.biao.apijson.RequestRole.UNKNOWN; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/**请求方法权限,只允许某些角色通过对应方法访问 + * @author Lemon + */ +@Documented +@Retention(RUNTIME) +@Target(TYPE) +public @interface MethodAccess { + + /**@see {@link RequestMethod#GET} + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] GET() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#HEAD} + * @return 该请求方法允许的角色 default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] HEAD() default {UNKNOWN, LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#GETS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] GETS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#HEADS} + * @return 该请求方法允许的角色 default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + */ + RequestRole[] HEADS() default {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}; + + /**@see {@link RequestMethod#POST} + * @return 该请求方法允许的角色 default {LOGIN, ADMIN}; + */ + RequestRole[] POST() default {LOGIN, ADMIN}; + + /**@see {@link RequestMethod#PUT} + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; + */ + RequestRole[] PUT() default {OWNER, ADMIN}; + + /**@see {@link RequestMethod#DELETE} + * @return 该请求方法允许的角色 default {OWNER, ADMIN}; + */ + RequestRole[] DELETE() default {OWNER, ADMIN}; + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/MethodStructure.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/MethodStructure.java new file mode 100644 index 000000000..27c30c96d --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/MethodStructure.java @@ -0,0 +1,58 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/**对应方法的请求结构。 + * 仅测试和基本的校验用,实际用Request表里的配置 + * @author Lemon + */ +@Documented +@Retention(RUNTIME) +@Target(TYPE) +public @interface MethodStructure { + + /**@see {@link RequestMethod#HEADS} + * @return 该请求方法允许的结构 + */ + String HEADS() default ""; + + /**@see {@link RequestMethod#GETS} + * @return 该请求方法允许的结构 + */ + String GETS() default ""; + + /**@see {@link RequestMethod#POST} + * @return 该请求方法允许的结构 + */ + String POST() default ""; + + /**@see {@link RequestMethod#PUT} + * @return 该请求方法允许的结构 + */ + String PUT() default ""; + + /**@see {@link RequestMethod#DELETE} + * @return 该请求方法允许的结构 + */ + String DELETE() default ""; + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/RequestMethod.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/RequestMethod.java new file mode 100644 index 000000000..a450baad8 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/RequestMethod.java @@ -0,0 +1,94 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +/**请求方法,对应org.springframework.web.bind.annotation.RequestMethod,多出GETS,HEADS方法 + * @author Lemon + */ +public enum RequestMethod { + + /** + * 常规获取数据方式 + */ + GET, + + /** + * 检查,默认是非空检查,返回数据总数 + */ + HEAD, + + /**Safe, Single, Simple + *
限制性GET,通过POST来GET数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 + */ + GETS, + + /**Safe, Single, Simple + *
限制性HEAD,通过POST来HEAD数据,不显示请求内容和返回结果,并且校验请求,一般用于对安全要求比较高的请求 + */ + HEADS, + + /** + * 新增(或者说插入)数据 + */ + POST, + + /** + * 修改数据,只修改传入字段对应的值 + */ + PUT, + + /** + * 删除数据 + */ + DELETE; + + + /**是否为GET请求方法 + * @param method + * @param containPrivate 包含私密(非明文)获取方法GETS + * @return + */ + public static boolean isGetMethod(RequestMethod method, boolean containPrivate) { + boolean is = method == null || method == GET; + return containPrivate == false ? is : is || method == GETS; + } + + /**是否为HEAD请求方法 + * @param method + * @param containPrivate 包含私密(非明文)获取方法HEADS + * @return + */ + public static boolean isHeadMethod(RequestMethod method, boolean containPrivate) { + boolean is = method == HEAD; + return containPrivate == false ? is : is || method == HEADS; + } + + /**是否为查询的请求方法 + * @param method + * @return 读操作(GET型或HEAD型) - true, 写操作(POST,PUT,DELETE) - false + */ + public static boolean isQueryMethod(RequestMethod method) { + return isGetMethod(method, true) || isHeadMethod(method, true); + } + + /**是否为开放(不限制请求的结构或内容;明文,浏览器能直接访问及查看)的请求方法 + * @param method + * @return + */ + public static boolean isPublicMethod(RequestMethod method) { + return method == null || method == GET || method == HEAD; + } + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/RequestRole.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/RequestRole.java new file mode 100644 index 000000000..f3a777d67 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/RequestRole.java @@ -0,0 +1,63 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +/**来访的用户角色 + * @author Lemon + */ +public enum RequestRole { + + /**未登录,不明身份的用户 + */ + UNKNOWN, + + /**已登录的用户 + */ + LOGIN, + + /**联系人,必须已登录 + */ + CONTACT, + + /**圈子成员(CONTACT + OWNER),必须已登录 + */ + CIRCLE, + + /**拥有者,必须已登录 + */ + OWNER, + + /**管理员,必须已登录 + */ + ADMIN; + + //似乎不管怎么做,外部引用后都是空值。并且如果在注解内的位置不是最前的,还会导致被注解的类在其它类中import报错。 + //虽然直接打印显示正常,但被@MethodAccess内RequestRole[] GET()等方法引用后获取的是空值 + // public static final RequestRole[] ALL = {RequestRole.UNKNOWN};//values();//所有 + // public static final RequestRole[] HIGHS;//高级 + // static { + // HIGHS = new RequestRole[] {OWNER, ADMIN}; + // } + + public static RequestRole get(String name) { + try {//Enum.valueOf只要找不到对应的值就会抛异常 + return RequestRole.valueOf(StringUtil.toUpperCase(name)); + } catch (Exception e) { + //empty + } + return null; + } + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/SQL.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/SQL.java new file mode 100644 index 000000000..a9da023e5 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/SQL.java @@ -0,0 +1,389 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +/**SQL语句,函数名尽量和JDK中相同或类似功能的函数的名称一致 + * @author Lemon + */ +public class SQL { + + public static final String OR = " OR "; + public static final String AND = " AND "; + public static final String NOT = " NOT "; + public static final String AS = " AS "; + public static final String IS = " is "; + public static final String NULL = " null "; + + //括号必须紧跟函数名! count (...) 报错! + public static final String COUNT = "count"; + public static final String SUM = "sum"; + public static final String MAX = "max"; + public static final String MIN = "min"; + public static final String AVG = "avg"; + + /** + * isNull = true + * @return {@link #isNull(boolean)} + */ + public static String isNull() { + return isNull(true); + } + /** + * @param isNull + * @return {@link #IS} + (isNull ? "" : {@link #NOT}) + {@link #NULL}; + */ + public static String isNull(boolean isNull) { + return IS + (isNull ? "" : NOT) + NULL; + } + /** + * isNull = true + * @param s + * @return {@link #isNull(String, boolean)} + */ + public static String isNull(String s) { + return isNull(s, true); + } + /** + * @param s + * @param isNull + * @return s + {@link #isNull(boolean)} + */ + public static String isNull(String s, boolean isNull) { + return s + isNull(isNull); + } + + /** + * isEmpty = true + * @param s + * @return {@link #isEmpty(String, boolean)} + */ + public static String isEmpty(String s) { + return isEmpty(s, true); + } + /** + * trim = false + * @param s + * @param isEmpty + * @return {@link #isEmpty(String, boolean, boolean)} + */ + public static String isEmpty(String s, boolean isEmpty) { + return isEmpty(s, isEmpty, false); + } + /** + * nullable = true + * @param s + * @param isEmpty <=0 + * @param trim s = trim(s); + * @return {@link #isEmpty(String, boolean, boolean, boolean)} + */ + public static String isEmpty(String s, boolean isEmpty, boolean trim) { + return isEmpty(s, isEmpty, trim, true); + } + /** + * @param s + * @param isEmpty <=0 + * @param trim s = trim(s); + * @param nullable isNull(s, true) + {@link #OR} + + * @return {@link #lengthCompare(String, String)} + */ + public static String isEmpty(String s, boolean isEmpty, boolean trim, boolean nullable) { + if (trim) { + s = trim(s); + } + return (nullable ? isNull(s, true) + OR : "") + lengthCompare(s, (isEmpty ? "<=" : ">") + "0"); + } + /** + * @param s 因为POWER(x,y)等函数含有不只一个key,所以需要客户端添加进去,服务端检测到条件中有'('和')'时就不转换,直接当SQL语句查询 + * @return {@link #length(String)} + compare + */ + public static String lengthCompare(String s, String compare) { + return length(s) + compare; + } + + + /** + * @param s 因为POWER(x,y)等函数含有不只一个key,所以需要客户端添加进去,服务端检测到条件中有'('和')'时就不转换,直接当SQL语句查询 + * @return "length(" + s + ")" + */ + public static String length(String s) { + return "length(" + s + ")"; + } + /** + * @param s 因为POWER(x,y)等函数含有不只一个key,所以需要客户端添加进去,服务端检测到条件中有'('和')'时就不转换,直接当SQL语句查询 + * @return "char_length(" + s + ")" + */ + public static String charLength(String s) { + return "char_length(" + s + ")"; + } + + /** + * @param s + * @return "trim(" + s + ")" + */ + public static String trim(String s) { + return "trim(" + s + ")"; + } + /** + * @param s + * @return "ltrim(" + s + ")" + */ + public static String trimLeft(String s) { + return "ltrim(" + s + ")"; + } + /** + * @param s + * @return "rtrim(" + s + ")" + */ + public static String trimRight(String s) { + return "rtrim(" + s + ")"; + } + + /** + * @param s + * @param n + * @return "left(" + s + "," + n + ")" + */ + public static String left(String s, int n) { + return "left(" + s + "," + n + ")"; + } + /** + * @param s + * @param n + * @return "right(" + s + "," + n + ")" + */ + public static String right(String s, int n) { + return "right(" + s + "," + n + ")"; + } + + /** + * @param s + * @param start + * @param end + * @return "substring(" + s + "," + start + "," + (end-start) + ")" + */ + public static String subString(String s, int start, int end) { + return "substring(" + s + "," + start + "," + (end-start) + ")"; + } + + /** + * @param s + * @param c -> 'c' + * @return "instr(" + s + ", '" + c + "')" + */ + public static String indexOf(String s, String c) { + return "instr(" + s + ", '" + c + "')"; + } + + /** + * @param s + * @param c1 -> 'c1' + * @param c2 -> 'c2' + * @return "replace(" + s + ", '" + c1 + "', '" + c2 + "')" + */ + public static String replace(String s, String c1, String c2) { + return "replace(" + s + ", '" + c1 + "', '" + c2 + "')"; + } + + /** + * @param s1 + * @param s2 -> 's2' + * @return "strcmp(" + s1 + ", '" + s2 + "')" + */ + public static String equals(String s1, String s2) { + return "strcmp(" + s1 + ", '" + s2 + "')"; + } + + /** + * @param s + * @return "upper(" + s + ")" + */ + public static String toUpperCase(String s) { + return "upper(" + s + ")"; + } + /** + * @param s + * @return "lower(" + s + ")" + */ + public static String toLowerCase(String s) { + return "lower(" + s + ")"; + } + + + + + //column and function<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**字段 + * @param column + * @return column.isEmpty() ? "*" : column; + */ + public static String column(String column) { + column = StringUtil.getTrimedString(column); + return column.isEmpty() ? "*" : column; + } + /**有别名的字段 + * @param column + * @return {@link #count(String)} + {@link #AS}; + */ + public static String columnAs(String column) { + return count(column) + AS; + } + + /**函数 + * @param column if (StringUtil.isEmpty(column, true) || column.contains(",")) -> column = null; + * @return " " + fun + "(" + {@link #column(String)} + ") "; + */ + public static String function(String fun, String column) { + if (StringUtil.isEmpty(column, true) || column.contains(",")) { + column = null; //解决 count(id,name) 这种多个字段导致的SQL异常 + } + return " " + fun + "(" + column(column) + ") "; + } + /**有别名的函数 + * @param column + * @return {@link #function(String, String)} + {@link #AS} + fun; + */ + public static String functionAs(String fun, String column) { + return function(fun, column) + AS + fun + " "; + } + + /**计数 + * column = null + * @return {@link #count(String)} + */ + public static String count() { + return count(null); + } + /**计数 + * fun = {@link #COUNT} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String count(String column) { + return functionAs(COUNT, column); + } + /**求和 + * fun = {@link #SUM} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String sum(String column) { + return functionAs(SUM, column); + } + /**最大值 + * fun = {@link #MAX} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String max(String column) { + return functionAs(MAX, column); + } + /**最小值 + * fun = {@link #MIN} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String min(String column) { + return functionAs(MIN, column); + } + /**平均值 + * fun = {@link #AVG} + * @param column + * @return {@link #functionAs(String, String)} + */ + public static String avg(String column) { + return functionAs(AVG, column); + } + + //column and function>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + //search<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final int SEARCH_TYPE_CONTAIN_FULL = 0; + public static final int SEARCH_TYPE_CONTAIN_ORDER = 1; + public static final int SEARCH_TYPE_CONTAIN_SINGLE = 2; + public static final int SEARCH_TYPE_CONTAIN_ANY = 3; + public static final int SEARCH_TYPE_START = 4; + public static final int SEARCH_TYPE_END = 5; + public static final int SEARCH_TYPE_START_SINGLE = 6; + public static final int SEARCH_TYPE_END_SINGLE = 7; + public static final int SEARCH_TYPE_PART_MATCH = 8; + /**获取搜索值 + * @param s + * @return + */ + public static String search(String s) { + return search(s, SEARCH_TYPE_CONTAIN_FULL); + } + /**获取搜索值 + * @param s + * @param type + * @return + */ + public static String search(String s, int type) { + return search(s, type, true); + } + /**获取搜索值 + * @param s + * @param type + * @param ignoreCase + * @return default SEARCH_TYPE_CONTAIN_FULL + */ + public static String search(String s, int type, boolean ignoreCase) { + if (s == null) { + return null; + } + switch (type) { + case SEARCH_TYPE_CONTAIN_SINGLE: + return "_" + s + "_"; + case SEARCH_TYPE_CONTAIN_ORDER: + char[] cs = s.toCharArray(); + if (cs == null) { + return null; + } + String value = "%"; + for (int i = 0; i < cs.length; i++) { + value += cs[i] + "%"; + } + return value; + case SEARCH_TYPE_START: + return s + "%"; + case SEARCH_TYPE_END: + return "%" + s; + case SEARCH_TYPE_START_SINGLE: + return s + "_"; + case SEARCH_TYPE_END_SINGLE: + return "_" + s; + case SEARCH_TYPE_CONTAIN_ANY: + case SEARCH_TYPE_PART_MATCH: + cs = s.toCharArray(); + if (cs == null) { + return null; + } + value = ""; + for (int i = 0; i < cs.length; i++) { + value += search("" + cs[i], SEARCH_TYPE_CONTAIN_FULL, ignoreCase); + } + return value; + default://SEARCH_TYPE_CONTAIN_FULL + return "%" + s + "%"; + } + } + + //search>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/StringUtil.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/StringUtil.java new file mode 100755 index 000000000..b219b430a --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/StringUtil.java @@ -0,0 +1,842 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson; + +import java.io.File; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.regex.Pattern; + +/**通用字符串(String)相关类,为null时返回"" + * @author Lemon + * @use StringUtil. + */ +public class StringUtil { + private static final String TAG = "StringUtil"; + + public StringUtil() { + } + + public static final String UTF_8 = "utf-8"; + + public static final String EMPTY = "无"; + public static final String UNKNOWN = "未知"; + public static final String UNLIMITED = "不限"; + + public static final String I = "我"; + public static final String YOU = "你"; + public static final String HE = "他"; + public static final String SHE = "她"; + public static final String IT = "它"; + + public static final String MALE = "男"; + public static final String FEMALE = "女"; + + public static final String TODO = "未完成"; + public static final String DONE = "已完成"; + + public static final String FAIL = "失败"; + public static final String SUCCESS = "成功"; + + public static final String SUNDAY = "日"; + public static final String MONDAY = "一"; + public static final String TUESDAY = "二"; + public static final String WEDNESDAY = "三"; + public static final String THURSDAY = "四"; + public static final String FRIDAY = "五"; + public static final String SATURDAY = "六"; + + public static final String YUAN = "元"; + + + private static String currentString = ""; + /**获取刚传入处理后的string + * @must 上个影响currentString的方法 和 这个方法都应该在同一线程中,否则返回值可能不对 + * @return + */ + public static String getCurrentString() { + return currentString == null ? "" : currentString; + } + + //获取string,为null时返回"" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**获取string,为null则返回"" + * @param object + * @return + */ + public static String getString(Object object) { + return object == null ? "" : getString(String.valueOf(object)); + } + /**获取string,为null则返回"" + * @param cs + * @return + */ + public static String getString(CharSequence cs) { + return cs == null ? "" : getString(cs.toString()); + } + /**获取string,为null则返回"" + * @param s + * @return + */ + public static String getString(String s) { + return s == null ? "" : s; + } + /**获取string,为null则返回"" + * ignoreEmptyItem = false; + * split = "," + * @param array + * @return {@link #getString(String[], boolean)} + */ + public static String getString(Object[] array) { + return getString(array, false); + } + /**获取string,为null则返回"" + * split = "," + * @param array + * @param ignoreEmptyItem + * @return {@link #getString(String[], String, boolean)} + */ + public static String getString(Object[] array, boolean ignoreEmptyItem) { + return getString(array, null, ignoreEmptyItem); + } + /**获取string,为null则返回"" + * ignoreEmptyItem = false; + * @param array + * @param split + * @return {@link #getString(String[], String, boolean)} + */ + public static String getString(Object[] array, String split) { + return getString(array, split, false); + } + /**获取string,为null则返回"" + * @param array + * @param split + * @param ignoreEmptyItem + * @return + */ + public static String getString(Object[] array, String split, boolean ignoreEmptyItem) { + String s = ""; + if (array != null) { + if (split == null) { + split = ","; + } + for (int i = 0; i < array.length; i++) { + if (ignoreEmptyItem && isEmpty(array[i], true)) { + continue; + } + s += ((i > 0 ? split : "") + array[i]); + } + } + return getString(s); + } + + //获取string,为null时返回"" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + //获取去掉前后空格后的string<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**获取去掉前后空格后的string,为null则返回"" + * @param object + * @return + */ + public static String getTrimedString(Object object) { + return getTrimedString(getString(object)); + } + /**获取去掉前后空格后的string,为null则返回"" + * @param cs + * @return + */ + public static String getTrimedString(CharSequence cs) { + return getTrimedString(getString(cs)); + } + /**获取去掉前后空格后的string,为null则返回"" + * @param s + * @return + */ + public static String getTrimedString(String s) { + return getString(s).trim(); + } + + //获取去掉前后空格后的string>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //获取去掉所有空格后的string <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**获取去掉所有空格后的string,为null则返回"" + * @param object + * @return + */ + public static String getNoBlankString(Object object) { + return getNoBlankString(getString(object)); + } + /**获取去掉所有空格后的string,为null则返回"" + * @param cs + * @return + */ + public static String getNoBlankString(CharSequence cs) { + return getNoBlankString(getString(cs)); + } + /**获取去掉所有空格后的string,为null则返回"" + * @param s + * @return + */ + public static String getNoBlankString(String s) { + return getString(s).replaceAll("\\s", ""); + } + + //获取去掉所有空格后的string >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //获取string的长度<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**获取string的长度,为null则返回0 + * @param object + * @param trim + * @return + */ + public static int getLength(Object object, boolean trim) { + return getLength(getString(object), trim); + } + /**获取string的长度,为null则返回0 + * @param cs + * @param trim + * @return + */ + public static int getLength(CharSequence cs, boolean trim) { + return getLength(getString(cs), trim); + } + /**获取string的长度,为null则返回0 + * @param s + * @param trim + * @return + */ + public static int getLength(String s, boolean trim) { + s = trim ? getTrimedString(s) : s; + return getString(s).length(); + } + + //获取string的长度>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //判断字符是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**判断字符是否为空 + * @param object + * @param trim + * @return + */ + public static boolean isEmpty(Object object, boolean trim) { + return isEmpty(getString(object), trim); + } + /**判断字符是否为空 + * @param cs + * @param trim + * @return + */ + public static boolean isEmpty(CharSequence cs, boolean trim) { + return isEmpty(getString(cs), trim); + } + /**判断字符是否为空 + * @param s + * @param trim + * @return + */ + public static boolean isEmpty(String s, boolean trim) { + // Log.i(TAG, "getTrimedString s = " + s); + if (s == null) { + return true; + } + if (trim) { + s = s.trim(); + } + if (s.isEmpty()) { + return true; + } + + currentString = s; + + return false; + } + + //判断字符是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + //判断字符是否非空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**判断字符是否非空 + * @param object + * @param trim + * @return + */ + public static boolean isNotEmpty(Object object, boolean trim) { + return isNotEmpty(getString(object), trim); + } + /**判断字符是否非空 + * @param cs + * @param trim + * @return + */ + public static boolean isNotEmpty(CharSequence cs, boolean trim) { + return isNotEmpty(getString(cs), trim); + } + /**判断字符是否非空 + * @param s + * @param trim + * @return + */ + public static boolean isNotEmpty(String s, boolean trim) { + return ! isEmpty(s, trim); + } + + //判断字符是否非空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static final Pattern PATTERN_NUMBER; + public static final Pattern PATTERN_PHONE; + public static final Pattern PATTERN_EMAIL; + public static final Pattern PATTERN_ID_CARD; + public static final Pattern PATTERN_ALPHA; + public static final Pattern PATTERN_PASSWORD; //TODO + public static final Pattern PATTERN_NAME; + public static final Pattern PATTERN_ALPHA_BIG; + public static final Pattern PATTERN_ALPHA_SMALL; + static { + PATTERN_NUMBER = Pattern.compile("^[0-9]+$"); + PATTERN_ALPHA = Pattern.compile("^[a-zA-Z]+$"); + PATTERN_ALPHA_BIG = Pattern.compile("^[A-Z]+$"); + PATTERN_ALPHA_SMALL = Pattern.compile("^[a-z]+$"); + PATTERN_NAME = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过 + PATTERN_PHONE = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-2,5-9])|(17[0-9]))\\d{8}$"); + PATTERN_EMAIL = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); + PATTERN_ID_CARD = Pattern.compile("(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)"); + PATTERN_PASSWORD = Pattern.compile("^[0-9a-zA-Z]+$"); + } + + /**判断手机格式是否正确 + * @param phone + * @return + */ + public static boolean isPhone(String phone) { + if (isNotEmpty(phone, true) == false) { + return false; + } + + currentString = phone; + return PATTERN_PHONE.matcher(phone).matches(); + } + /**判断手机格式是否正确 + * @param s + * @return + */ + public static boolean isPassword(String s) { + return getLength(s, false) >= 6 && PATTERN_PASSWORD.matcher(s).matches(); + } + /**判断是否全是数字密码 + * @param s + * @return + */ + public static boolean isNumberPassword(String s) { + return getLength(s, false) == 6 && isNumer(s); + } + /**判断email格式是否正确 + * @param email + * @return + */ + public static boolean isEmail(String email) { + if (isNotEmpty(email, true) == false) { + return false; + } + + currentString = email; + return PATTERN_EMAIL.matcher(email).matches(); + } + + + /**判断是否全是验证码 + * @param s + * @return + */ + public static boolean isVerify(String s) { + return getLength(s, false) >= 4 && isNumer(s); + } + /**判断是否全是数字 + * @param s + * @return + */ + public static boolean isNumer(String s) { + if (isNotEmpty(s, true) == false) { + return false; + } + + currentString = s; + return PATTERN_NUMBER.matcher(s).matches(); + } + /**判断是否全是字母 + * @param s + * @return + */ + public static boolean isAlpha(String s) { + if (isEmpty(s, true)) { + return false; + } + + currentString = s; + return PATTERN_ALPHA.matcher(s).matches(); + } + /**判断是否全是数字或字母 + * @param s + * @return + */ + public static boolean isNumberOrAlpha(String s) { + return isNumer(s) || isAlpha(s); + } + + /**判断是否为代码名称,只能包含字母,数字或下划线 + * @param s + * @return + */ + public static boolean isName(String s) { + return s != null && PATTERN_NAME.matcher(s).matches(); + } + /**判断是否为首字母大写的代码名称 + * @param key + * @return + */ + public static boolean isBigName(String s) { + s = getString(s); + if (s.isEmpty() || PATTERN_ALPHA_BIG.matcher(s.substring(0, 1)).matches() == false) { + return false; + } + return s.length() <= 1 ? true : isName(s.substring(1)); + } + /**判断是否为首字母小写的代码名称 + * @param key + * @return + */ + public static boolean isSmallName(String s) { + s = getString(s); + if (s.isEmpty() || PATTERN_ALPHA_SMALL.matcher(s.substring(0, 1)).matches() == false) { + return false; + } + return s.length() <= 1 ? true : isName(s.substring(1)); + } + + + /**判断字符类型是否是身份证号 + * @param number + * @return + */ + public static boolean isIDCard(String number) { + if (isNumberOrAlpha(number) == false) { + return false; + } + number = getString(number); + if (number.length() == 15) { + Log.i(TAG, "isIDCard number.length() == 15 old IDCard"); + currentString = number; + return true; + } + if (number.length() == 18) { + currentString = number; + return true; + } + + return false; + } + + public static final String HTTP = "http"; + public static final String URL_PREFIX = "http://"; + public static final String URL_PREFIXs = "https://"; + public static final String URL_STAFFIX = URL_PREFIX; + public static final String URL_STAFFIXs = URL_PREFIXs; + /**判断字符类型是否是网址 + * @param url + * @return + */ + public static boolean isUrl(String url) { + if (isNotEmpty(url, true) == false) { + return false; + } else if (! url.startsWith(URL_PREFIX) && ! url.startsWith(URL_PREFIXs)) { + return false; + } + + currentString = url; + return true; + } + + public static final String FILE_PATH_PREFIX = "file://"; + /**判断文件路径是否存在 + * @param path + * @return + */ + public static boolean isFilePathExist(String path) { + return StringUtil.isFilePath(path) && new File(path).exists(); + } + + public static final String SEPARATOR = "/"; + /**判断是否为路径 + * @param path + * @return + */ + public static boolean isPath(String path) { + return StringUtil.isNotEmpty(path, true) && path.contains(SEPARATOR) + && path.contains(SEPARATOR + SEPARATOR) == false && path.endsWith(SEPARATOR) == false; + } + + /**判断字符类型是否是路径 + * @param path + * @return + */ + public static boolean isFilePath(String path) { + if (isNotEmpty(path, true) == false) { + return false; + } + + if (! path.contains(".") || path.endsWith(".")) { + return false; + } + + currentString = path; + + return true; + } + + //判断字符类型 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //提取特殊字符<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**去掉string内所有非数字类型字符 + * @param object + * @return + */ + public static String getNumber(Object object) { + return getNumber(getString(object)); + } + /**去掉string内所有非数字类型字符 + * @param cs + * @return + */ + public static String getNumber(CharSequence cs) { + return getNumber(getString(cs)); + } + /**去掉string内所有非数字类型字符 + * @param s + * @return + */ + public static String getNumber(String s) { + return getNumber(s, false); + } + /**去掉string内所有非数字类型字符 + * @param s + * @param onlyStart 中间有非数字时只获取前面的数字 + * @return + */ + public static String getNumber(String s, boolean onlyStart) { + if (isNotEmpty(s, true) == false) { + return ""; + } + + String numberString = ""; + String single; + for (int i = 0; i < s.length(); i++) { + single = s.substring(i, i + 1); + if (isNumer(single)) { + numberString += single; + } else { + if (onlyStart) { + return numberString; + } + } + } + + return numberString; + } + + //提取特殊字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + //校正(自动补全等)字符串<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**获取网址,自动补全 + * @param url + * @return + */ + public static String getCorrectUrl(String url) { + Log.i(TAG, "getCorrectUrl : \n" + url); + if (isNotEmpty(url, true) == false) { + return ""; + } + + // if (! url.endsWith("/") && ! url.endsWith(".html")) { + // url = url + "/"; + // } + + if (isUrl(url) == false) { + return URL_PREFIX + url; + } + return url; + } + + /**获取去掉所有 空格 、"-" 、"+86" 后的phone + * @param phone + * @return + */ + public static String getCorrectPhone(String phone) { + if (isNotEmpty(phone, true) == false) { + return ""; + } + + phone = getNoBlankString(phone); + phone = phone.replaceAll("-", ""); + if (phone.startsWith("+86")) { + phone = phone.substring(3); + } + return phone; + } + + + /**获取邮箱,自动补全 + * @param email + * @return + */ + public static String getCorrectEmail(String email) { + if (isNotEmpty(email, true) == false) { + return ""; + } + + email = getNoBlankString(email); + if (isEmail(email) == false && ! email.endsWith(".com")) { + email += ".com"; + } + + return email; + } + + + public static final int PRICE_FORMAT_DEFAULT = 0; + public static final int PRICE_FORMAT_PREFIX = 1; + public static final int PRICE_FORMAT_SUFFIX = 2; + public static final int PRICE_FORMAT_PREFIX_WITH_BLANK = 3; + public static final int PRICE_FORMAT_SUFFIX_WITH_BLANK = 4; + public static final String[] PRICE_FORMATS = { + "", "¥", "元", "¥ ", " 元" + }; + + /**获取价格,保留两位小数 + * @param price + * @return + */ + public static String getPrice(String price) { + return getPrice(price, PRICE_FORMAT_DEFAULT); + } + /**获取价格,保留两位小数 + * @param price + * @param formatType 添加单位(元) + * @return + */ + public static String getPrice(String price, int formatType) { + if (isNotEmpty(price, true) == false) { + return getPrice(0, formatType); + } + + //单独写到getCorrectPrice? <<<<<<<<<<<<<<<<<<<<<< + String correctPrice = ""; + String s; + for (int i = 0; i < price.length(); i++) { + s = price.substring(i, i + 1); + if (".".equals(s) || isNumer(s)) { + correctPrice += s; + } + } + //单独写到getCorrectPrice? >>>>>>>>>>>>>>>>>>>>>> + + Log.i(TAG, "getPrice <<<<<<<<<<<<<<<<<< correctPrice = " + correctPrice); + if (correctPrice.contains(".")) { + // if (correctPrice.startsWith(".")) { + // correctPrice = 0 + correctPrice; + // } + if (correctPrice.endsWith(".")) { + correctPrice = correctPrice.replaceAll(".", ""); + } + } + + Log.i(TAG, "getPrice correctPrice = " + correctPrice + " >>>>>>>>>>>>>>>>"); + return isNotEmpty(correctPrice, true) ? getPrice(new BigDecimal(0 + correctPrice), formatType) : getPrice(0, formatType); + } + /**获取价格,保留两位小数 + * @param price + * @return + */ + public static String getPrice(BigDecimal price) { + return getPrice(price, PRICE_FORMAT_DEFAULT); + } + /**获取价格,保留两位小数 + * @param price + * @return + */ + public static String getPrice(double price) { + return getPrice(price, PRICE_FORMAT_DEFAULT); + } + /**获取价格,保留两位小数 + * @param price + * @param formatType 添加单位(元) + * @return + */ + public static String getPrice(BigDecimal price, int formatType) { + return getPrice(price == null ? 0 : price.doubleValue(), formatType); + } + /**获取价格,保留两位小数 + * @param price + * @param formatType 添加单位(元) + * @return + */ + public static String getPrice(double price, int formatType) { + String s = new DecimalFormat("#########0.00").format(price); + switch (formatType) { + case PRICE_FORMAT_PREFIX: + return PRICE_FORMATS[PRICE_FORMAT_PREFIX] + s; + case PRICE_FORMAT_SUFFIX: + return s + PRICE_FORMATS[PRICE_FORMAT_SUFFIX]; + case PRICE_FORMAT_PREFIX_WITH_BLANK: + return PRICE_FORMATS[PRICE_FORMAT_PREFIX_WITH_BLANK] + s; + case PRICE_FORMAT_SUFFIX_WITH_BLANK: + return s + PRICE_FORMATS[PRICE_FORMAT_SUFFIX_WITH_BLANK]; + default: + return s; + } + } + + + /**分割路径 + * @param path + * @return + */ + public static String[] splitPath(String path) { + if (StringUtil.isNotEmpty(path, true) == false) { + return null; + } + return isPath(path) ? split(path, SEPARATOR) : new String[] {path}; + } + /**将s分割成String[] + * @param s + * @return + */ + public static String[] split(String s) { + return split(s, null); + } + /**将s用split分割成String[] + * trim = true; + * @param s + * @param split + * @return + */ + public static String[] split(String s, String split) { + return split(s, split, true); + } + /**将s用split分割成String[] + * @param s + * @param split + * @param trim 去掉前后两端的split + * @return + */ + public static String[] split(String s, String split, boolean trim) { + s = getString(s); + if (s.isEmpty()) { + return null; + } + if (isNotEmpty(split, false) == false) { + split = ","; + } + if (trim) { + while (s.startsWith(split)) { + s = s.substring(split.length()); + } + while (s.endsWith(split)) { + s = s.substring(0, s.length() - split.length()); + } + } + return s.contains(split) ? s.split(split) : new String[]{s}; + } + + /** + * @param key + * @param suffix + * @return key + suffix,第一个字母小写 + */ + public static String addSuffix(String key, String suffix) { + key = getNoBlankString(key); + if (key.isEmpty()) { + return firstCase(suffix); + } + return firstCase(key) + firstCase(suffix, true); + } + /** + * @param key + */ + public static String firstCase(String key) { + return firstCase(key, false); + } + /** + * @param key + * @param upper + * @return + */ + public static String firstCase(String key, boolean upper) { + key = getString(key); + if (key.isEmpty()) { + return ""; + } + + String first = key.substring(0, 1); + key = (upper ? first.toUpperCase() : first.toLowerCase()) + key.substring(1, key.length()); + + return key; + } + + /**全部大写 + * @param s + * @return + */ + public static String toUpperCase(String s) { + return toUpperCase(s, false); + } + /**全部大写 + * @param s + * @param trim + * @return + */ + public static String toUpperCase(String s, boolean trim) { + s = trim ? getTrimedString(s) : getString(s); + return s.toUpperCase(); + } + /**全部小写 + * @param s + * @return + */ + public static String toLowerCase(String s) { + return toLowerCase(s, false); + } + /**全部小写 + * @param s + * @return + */ + public static String toLowerCase(String s, boolean trim) { + s = trim ? getTrimedString(s) : getString(s); + return s.toLowerCase(); + } + + //校正(自动补全等)字符串>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Column.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Column.java new file mode 100644 index 000000000..ed68fc497 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Column.java @@ -0,0 +1,26 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**字段(列名) + * @author Lemon + */ +@MethodAccess +public class Column { + public static final String TAG = "`columns`"; + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Request.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Request.java new file mode 100644 index 000000000..09a6d4254 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Request.java @@ -0,0 +1,28 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**请求类 + * @author Lemon + */ +@MethodAccess( + POST = {}, + PUT = {}, + DELETE = {} + ) +public class Request { +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Response.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Response.java new file mode 100644 index 000000000..e46dc8479 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Response.java @@ -0,0 +1,28 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**结果类 + * @author Lemon + */ +@MethodAccess( + POST = {}, + PUT = {}, + DELETE = {} + ) +public class Response { +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Table.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Table.java new file mode 100644 index 000000000..eeb3e9571 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Table.java @@ -0,0 +1,26 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**数据库表 + * @author Lemon + */ +@MethodAccess +public class Table { + public static final String TAG = "`tables`"; + +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Test.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Test.java new file mode 100644 index 000000000..8f2840d4f --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/Test.java @@ -0,0 +1,24 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.model; + +import zuo.biao.apijson.MethodAccess; + +/**输入条件测试类 + * @author Lemon + */ +@MethodAccess +public class Test { +} diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/package-info.java new file mode 100644 index 000000000..356cf4e4a --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/model/package-info.java @@ -0,0 +1,8 @@ +/** + * models for special tables + */ +/** + * @author Lemon + * + */ +package zuo.biao.apijson.model; \ No newline at end of file diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/package-info.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/package-info.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Entry.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Entry.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Entry.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Entry.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/JSONRequest.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/JSONRequest.java similarity index 53% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/JSONRequest.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/JSONRequest.java index 3216f2a06..0a357656c 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/JSONRequest.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/JSONRequest.java @@ -14,8 +14,10 @@ package zuo.biao.apijson.server; +import java.util.Map; + import zuo.biao.apijson.JSON; -import zuo.biao.apijson.SQL; +import zuo.biao.apijson.JSONObject; import zuo.biao.apijson.StringUtil; /**JSONRequest for Server to replace zuo.biao.apijson.JSONRequest, @@ -35,111 +37,66 @@ public JSONRequest() { * @param object */ public JSONRequest(Object object) { - this(null, object); + super(object); } /** - * encode = false - * {@link #JSONRequest(String, Object, boolean)} * @param name * @param object */ public JSONRequest(String name, Object object) { - this(name, object, false); - } - /** - * {@link #JSONRequest(String, Object, boolean)} - * @param object - * @param encode - */ - public JSONRequest(Object object, boolean encode) { - super(object, encode); + super(name, object); } - /** - * {@link #put(String, Object, boolean)} - * @param name - * @param object - * @param encode - */ - public JSONRequest(String name, Object object, boolean encode) { - super(name, object, encode); - } - - - /** - * decode = true - * @param key - * return {@link #get(Object, boolean)} - */ + + @Override - public Object get(Object key) { - return get(key, false); + public JSONObject putsAll(Map map) { + super.putsAll(map); + return this; } /** - * encode = false * @param value - * @return {@link #put(String, boolean)} + * @return {@link #puts(String, Object)} */ @Override - public Object put(Object value) { - return put(value, false); + public JSONRequest puts(Object value) { + return puts(null, value); } /** + * @param key * @param value - * @param encode - * @return {@link #put(String, Object, boolean)} + * @return this + * @see {@link #put(String, Object)} */ @Override - public Object put(Object value, boolean encode) { - return put(null, value, encode); + public JSONRequest puts(String key, Object value) { + put(key, value); + return this; } + /** - * encode = false - * @param key * @param value - * return {@link #put(String, Object, boolean)} + * @return {@link #put(String, Object)} */ @Override - public Object put(String key, Object value) { - return put(key, value, false); + public Object put(Object value) { + return put(null, value); } /**自定义类型必须转为JSONObject或JSONArray,否则RequestParser解析不了 */ @Override - public Object put(String key, Object value, boolean encode) { + public Object put(String key, Object value) { if (value == null) {// || key == null return null; } - + com.alibaba.fastjson.JSONObject target = JSON.parseObject(value); - if (target == null) { - return null; - } + // if (target == null) { // "tag":"User" 报错 + // return null; + // } return super.put(StringUtil.isNotEmpty(key, true) ? key : value.getClass().getSimpleName() //must handle key here - , target, encode); - } - - /**设置搜索 - * @param key - * @param value - * @return - * @see {@link #putSearch(String, String, int)} - */ - @Override - public JSONRequest putSearch(String key, String value) { - return putSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL); - } - /**设置搜索 - * @param key - * @param value - * @param type - * @see {@link #putSearch(String, String, int, boolean)} - */ - @Override - public JSONRequest putSearch(String key, String value, int type) { - putSearch(key, value, type, false); - return this; + , target == null ? value : target); } } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Logic.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Logic.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Logic.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Logic.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/ObjectParser.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/ObjectParser.java similarity index 65% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/ObjectParser.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/ObjectParser.java index 75ca1b1e9..9f16ea895 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/ObjectParser.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/ObjectParser.java @@ -14,13 +14,23 @@ package zuo.biao.apijson.server; +import static zuo.biao.apijson.JSONObject.KEY_CORRECT; +import static zuo.biao.apijson.JSONObject.KEY_DROP; +import static zuo.biao.apijson.JSONObject.KEY_TRY; import static zuo.biao.apijson.RequestMethod.PUT; +import static zuo.biao.apijson.JSONObject.KEY_CONDITION; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.regex.Pattern; import javax.validation.constraints.NotNull; @@ -29,8 +39,10 @@ import com.alibaba.fastjson.JSONObject; import apijson.demo.server.Function; +import apijson.demo.server.model.BaseModel; import zuo.biao.apijson.Log; import zuo.biao.apijson.RequestMethod; +import zuo.biao.apijson.StringUtil; import zuo.biao.apijson.server.exception.ConflictException; import zuo.biao.apijson.server.exception.NotExistException; import zuo.biao.apijson.server.sql.SQLConfig; @@ -63,24 +75,35 @@ public ParserAdapter getAdapter() { * name = null * @param parentPath * @param request + * @throws Exception */ - public ObjectParser(@NotNull JSONObject request, String parentPath, int type) { + public ObjectParser(@NotNull JSONObject request, String parentPath, int type) throws Exception { this(request, parentPath, type, null); } protected JSONObject request;//不用final是为了recycle protected String parentPath;//不用final是为了recycle + protected final boolean isEmpty;//empty有效 User:{} protected final int type; protected String path;//不用final是为了recycle protected String table;//不用final是为了recycle protected final boolean isTableKey; + + protected final boolean tri; + /** + * TODO Parser内要不因为 非 TYPE_ITEM_CHILD_0 的Table 为空导致后续中断。 + */ + protected final boolean drop; + protected JSONObject correct; + /**for single object * @param parentPath * @param request * @param name + * @throws Exception */ - public ObjectParser(@NotNull JSONObject request, String parentPath, int type, String name) { + public ObjectParser(@NotNull JSONObject request, String parentPath, int type, String name) throws Exception { if (request == null) { throw new IllegalArgumentException(TAG + ".ObjectParser request == null!!!"); } @@ -91,7 +114,84 @@ public ObjectParser(@NotNull JSONObject request, String parentPath, int type, St this.path = Parser.getAbsPath(parentPath, name); this.table = Pair.parseEntry(name, true).getKey(); this.isTableKey = zuo.biao.apijson.JSONObject.isTableKey(table); + + this.isEmpty = request.isEmpty(); + if (isEmpty) { + this.tri = false; + this.drop = false; + } else { + this.tri = request.getBooleanValue(KEY_TRY); + this.drop = request.getBooleanValue(KEY_DROP); + this.correct = request.getJSONObject(KEY_CORRECT); + + request.remove(KEY_TRY); + request.remove(KEY_DROP); + request.remove(KEY_CORRECT); + + try { + parseCorrect(); + } catch (Exception e) { + if (tri == false) { + throw e; + } + invalidate(); + } + } + + Log.d(TAG, "ObjectParser table = " + table + "; isTableKey = " + isTableKey); + Log.d(TAG, "ObjectParser isEmpty = " + isEmpty + "; tri = " + tri + "; drop = " + drop); + } + + public static final Map COMPILE_MAP; + static { + COMPILE_MAP = new HashMap(); + COMPILE_MAP.put("phone", StringUtil.PATTERN_PHONE); + COMPILE_MAP.put("email", StringUtil.PATTERN_EMAIL); + COMPILE_MAP.put("id_number", StringUtil.PATTERN_ID_CARD); + } + + protected Map corrected; + /**解析 @correct 校正 + * @throws Exception + */ + protected ObjectParser parseCorrect() throws Exception { + Set set = correct == null ? null : new HashSet<>(correct.keySet()); + + if (set != null && set.isEmpty() == false) {//对每个需要校正的key进行正则表达式匹配校正 + corrected = new HashMap<>();//TODO 返回全部correct内的内容,包括未校正的? correct); + + String value; //13000082001 + String v; // phone,id_number,card_number + String[] posibleKeys; //[phone,email,id_number,card_number] + + for (String k : set) {// k = cert + v = k == null ? null : correct.getString(k); + value = v == null ? null : request.getString(k); + posibleKeys = value == null ? null : StringUtil.split(v); + + if (posibleKeys != null && posibleKeys.length > 0) { + String rk = null; + Pattern p; + for (String pk : posibleKeys) { + p = pk == null ? null : COMPILE_MAP.get(pk); + if (p != null && p.matcher(value).matches()) { + rk = pk; + break; + } + } + + if (rk == null) { + throw new IllegalArgumentException( + "格式错误!找不到 " + k + ":" + value + " 对应[" + v + "]内的任何一项!"); + } + request.put(rk, request.remove(k)); + corrected.put(k, rk); + } + } + } + + return this; } @@ -127,53 +227,78 @@ public boolean isBreakParse() { * @throws Exception */ public ObjectParser parse() throws Exception { - breakParse = false; - - response = new JSONObject(true);//must init + if (isInvalidate() == false) { + breakParse = false; + + response = new JSONObject(true);//must init + + sqlRequest = new JSONObject(true);//must init + sqlReponse = null;//must init + customMap = null;//must init + functionMap = null;//must init + childMap = null;//must init + + Set> set = new LinkedHashSet>(request.entrySet()); + if (set != null && set.isEmpty() == false) {//判断换取少几个变量的初始化是否值得? + if (isTableKey) {//非Table下不必分离出去再添加进来 + customMap = new LinkedHashMap(); + childMap = new LinkedHashMap(); + } + functionMap = new LinkedHashMap();//必须执行 - sqlRequest = new JSONObject(true);//must init - sqlReponse = null;//must init - customMap = null;//must init - functionMap = null;//must init - childMap = null;//must init - Set> set = new LinkedHashSet>(request.entrySet()); - if (set != null && set.isEmpty() == false) {//判断换取少几个变量的初始化是否值得? - if (isTableKey) {//非Table下不必分离出去再添加进来 - customMap = new LinkedHashMap(); - childMap = new LinkedHashMap(); - } - functionMap = new LinkedHashMap();//必须执行 - - String key; - Object value; - for (Entry entry : set) { - value = entry.getValue(); - if (value == null) { - continue; + //条件<<<<<<<<<<<<<<<<<<< + List conditionList = null; + if (method == PUT) { //这里只有PUTArray需要处理 || method == DELETE) { + String[] conditions = StringUtil.split(request.getString(KEY_CONDITION)); + //Arrays.asList()返回值不支持add方法! + conditionList = new ArrayList(Arrays.asList(conditions != null ? conditions : new String[]{})); + conditionList.add(zuo.biao.apijson.JSONRequest.KEY_ID); + conditionList.add(zuo.biao.apijson.JSONRequest.KEY_ID_IN); } - key = entry.getKey(); - - if (value instanceof JSONObject) {//JSONObject,往下一级提取 - putChild(key, (JSON) value); - } else if (method == PUT && value instanceof JSONArray) {//PUT JSONArray - onPUTArrayParse(key, (JSONArray) value); - } else {//JSONArray或其它Object,直接填充 - if (onParse(key, value) == false) { - invalidate(); + //条件>>>>>>>>>>>>>>>>>>> + + String key; + Object value; + for (Entry entry : set) { + if (isBreakParse()) { + break; } - } - if (isInvalidate()) { - recycle(); - return null; - } - if (isBreakParse()) { - break; + value = entry.getValue(); + if (value == null) { + continue; + } + key = entry.getKey(); + + try { + if (value instanceof JSONObject && key.startsWith("@") == false) {//JSONObject,往下一级提取 + putChild(key, (JSON) value); + } + else if (method == PUT && value instanceof JSONArray + && BaseModel.isContain(conditionList, key) == false) {//PUT JSONArray + onPUTArrayParse(key, (JSONArray) value); + } + else {//JSONArray或其它Object,直接填充 + if (onParse(key, value) == false) { + invalidate(); + } + } + } catch (Exception e) { + if (tri == false) { + throw e;//不忽略错误,抛异常 + } + invalidate();//忽略错误,还原request + } } } } + if (isInvalidate()) { + recycle(); + return null; + } + return this; } @@ -273,6 +398,7 @@ protected boolean onParse(@NotNull String key, @NotNull Object value) throws Exc } + //TODO 需要锁表来保证获取到的 [] 不会在写入前被修改 /**PUT key:[] * @param key * @param array @@ -290,16 +416,16 @@ protected void onPUTArrayParse(@NotNull String key, @NotNull JSONArray array) th } else if (key.endsWith("-")) {//remove putType = 2; } else {//replace - throw new IllegalAccessException("PUT " + path + ", PUT Array不允许 " + key + - " 这种没有 + 或 - 结尾的key!不允许整个替换掉原来的Array!"); + // throw new IllegalAccessException("PUT " + path + ", PUT Array不允许 " + key + + // " 这种没有 + 或 - 结尾的key!不允许整个替换掉原来的Array!"); } - String realKey = Parser.getRealKey(method, key, false, false); + String realKey = SQLConfig.getRealKey(method, key, false, false); //GET > add all 或 remove all > PUT > remove key //GET <<<<<<<<<<<<<<<<<<<<<<<<< JSONObject rq = new JSONObject(); - rq.put(SQLConfig.ID, request.get(SQLConfig.ID)); + rq.put(JSONRequest.KEY_ID, request.get(JSONRequest.KEY_ID)); rq.put(JSONRequest.KEY_COLUMN, realKey); JSONObject rp = parseResponse(new JSONRequest(table, rq)); //GET >>>>>>>>>>>>>>>>>>>>>>>>> @@ -360,12 +486,12 @@ public ObjectParser executeSQL(int count, int page, int position) throws Excepti if (isTableKey == false) {//提高性能 sqlReponse = new JSONObject(sqlRequest); } else { - if (config == null) { - config = newQueryConfig(); - } - config.setCount(count).setPage(page).setPosition(position); try { + if (config == null) { + config = newSQLConfig(); + } + config.setCount(count).setPage(page).setPosition(position); sqlReponse = onSQLExecute(); } catch (Exception e) { Log.e(TAG, "getObject try { response = getSQLObject(config2); } catch (Exception e) {"); @@ -380,6 +506,10 @@ public ObjectParser executeSQL(int count, int page, int position) throws Excepti throw e; } } + + if (drop) {//丢弃Table,只为了向下提供条件 + sqlReponse = null; + } } return this; @@ -398,17 +528,25 @@ public JSONObject response() throws Exception { response.putAll(sqlReponse); } + + //把已校正的字段键值对corrected添加进来,还是correct直接改? + if (corrected != null) { + response.put(KEY_CORRECT, corrected); + } + //把isTableKey时取出去的custom重新添加回来 if (customMap != null) { response.putAll(customMap); } + + //解析函数function if (functionMap != null) { Set> functionSet = functionMap == null ? null : functionMap.entrySet(); if (functionSet != null && functionSet.isEmpty() == false) { for (Entry entry : functionSet) { - response.put(Parser.getRealKey(method, entry.getKey(), false, false) + response.put(SQLConfig.getRealKey(method, entry.getKey(), false, false) , Function.invoke(response, entry.getValue())); } } @@ -429,8 +567,8 @@ public JSONObject response() throws Exception { return response; } - protected SQLConfig newQueryConfig() { - return SQLConfig.newQueryConfig(method, table, sqlRequest); + protected SQLConfig newSQLConfig() throws Exception { + return SQLConfig.newSQLConfig(method, table, sqlRequest); } /** * response has the final value after parse (and query if isTableKey) @@ -442,6 +580,20 @@ protected void onComplete() { /**回收内存 */ public void recycle() { + //后面还可能用到,要还原 + if (tri) {//避免返回未传的字段 + request.put(KEY_TRY, tri); + } + if (drop) { + request.put(KEY_DROP, drop); + } + if (correct != null) { + request.put(KEY_CORRECT, correct); + } + + + correct = null; + corrected = null; method = null; parentPath = null; path = null; diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/OnParseCallback.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/OnParseCallback.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/OnParseCallback.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/OnParseCallback.java diff --git a/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Operation.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Operation.java new file mode 100644 index 000000000..b5678a670 --- /dev/null +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Operation.java @@ -0,0 +1,68 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.*/ + +package zuo.biao.apijson.server; + +import zuo.biao.apijson.StringUtil; + +/**对请求JSON的操作 + * @author Lemon + */ +public enum Operation { + + /** + * 不允许传的字段 + */ + DISALLOW, + /** + * 必须传的字段 + */ + NECESSARY, + + /** + * 验证是否符合预设的条件 + */ + VERIFY, + /** + * 验证是否不存在,除了本身的记录 + */ + UNIQUE, + + /** + * 添加,当要被添加的对象不存在时 + */ + ADD, + /** + * 强行放入,不存在时就添加,存在时就修改 + */ + PUT, + /** + * 替换,当要被替换的对象存在时 + */ + REPLACE, + /** + * 移除,当要被移除的对象存在时 + */ + REMOVE; + + public static Operation get(String name) { + try {//Enum.valueOf只要找不到对应的值就会抛异常 + return Operation.valueOf(StringUtil.toUpperCase(name)); + } catch (Exception e) { + //empty + } + return null; + } + +} diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Pair.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Pair.java similarity index 94% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Pair.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Pair.java index ce0fc3a08..a19c8e447 100644 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/Pair.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Pair.java @@ -18,6 +18,9 @@ import java.util.HashMap; import java.util.Map; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + import zuo.biao.apijson.StringUtil; /**key:value @@ -43,6 +46,8 @@ public class Pair extends Entry { classMap.put(String.class.getSimpleName(), String.class); classMap.put(Collection.class.getSimpleName(), Collection.class);//不允许指定 classMap.put(Map.class.getSimpleName(), Map.class);//不允许指定 + classMap.put(JSONObject.class.getSimpleName(), JSONObject.class);//必须有,Map中没有getLongValue等方法 + classMap.put(JSONArray.class.getSimpleName(), JSONArray.class);//必须有,Collection中没有?等方法 } diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Parser.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Parser.java similarity index 81% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Parser.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Parser.java index fd9b35085..de8dd8118 100755 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Parser.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Parser.java @@ -15,11 +15,8 @@ package zuo.biao.apijson.server; import static zuo.biao.apijson.RequestMethod.GET; -import static zuo.biao.apijson.RequestMethod.PUT; -import static zuo.biao.apijson.StringUtil.UTF_8; import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -32,7 +29,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import apijson.demo.server.AccessVerifier; +import apijson.demo.server.Verifier; +import apijson.demo.server.model.BaseModel; import apijson.demo.server.model.User; import zuo.biao.apijson.JSON; import zuo.biao.apijson.JSONResponse; @@ -42,6 +40,7 @@ import zuo.biao.apijson.StringUtil; import zuo.biao.apijson.server.exception.ConditionErrorException; import zuo.biao.apijson.server.exception.ConflictException; +import zuo.biao.apijson.server.exception.NotExistException; import zuo.biao.apijson.server.exception.NotLoggedInException; import zuo.biao.apijson.server.exception.OutOfRangeException; import zuo.biao.apijson.server.sql.SQLConfig; @@ -68,7 +67,6 @@ public Parser(RequestMethod method) { } private final RequestMethod requestMethod; - private final boolean noVerify;//方法免验证。但内容还是需要验证,避免服务端写错代码导致产生脏数据甚至清空Table /** * @param requestMethod null ? requestMethod = GET * @param noVerify 仅限于为服务端提供方法免验证特权,普通请求不要设置为true! 如果对应Table有权限也建议用默认值false,保持和客户端权限一致 @@ -76,7 +74,9 @@ public Parser(RequestMethod method) { public Parser(RequestMethod method, boolean noVerify) { super(); this.requestMethod = method == null ? GET : method; - this.noVerify = noVerify; + setNoVerifyRequest(noVerify); + setNoVerifyLogin(noVerify); + setNoVerifyRole(noVerify); } private HttpSession session;//可能比较大,占内存。而且不是所有地方都用 @@ -84,8 +84,8 @@ public Parser(RequestMethod method, boolean noVerify) { private long visitorId;//来访用户id public Parser setSession(@NotNull HttpSession session) { this.session = session; - this.visitor = AccessVerifier.getUser(session); - this.visitorId = AccessVerifier.getUserId(session); + this.visitor = Verifier.getUser(session); + this.visitorId = Verifier.getUserId(session); return this; } private RequestRole globleRole;//全局角色,对未指明角色的Table自动加上这个角色 @@ -94,9 +94,30 @@ public Parser setGlobleRole(RequestRole globleRole) { return this; } + //一定要验证结构!对管理员也要验证! + private boolean noVerifyRequest = false; + private boolean noVerifyLogin = false; + private boolean noVerifyRole = false; + public Parser setNoVerifyRequest(boolean noVerifyRequest) { + this.noVerifyRequest = noVerifyRequest; + return this; + } + public Parser setNoVerifyLogin(boolean noVerifyLogin) { + this.noVerifyLogin = noVerifyLogin; + return this; + } + public Parser setNoVerifyRole(boolean noVerifyRole) { + this.noVerifyRole = noVerifyRole; + return this; + } + + + + + private JSONObject requestObject; - private SQLExecutor sQLExecutor; + private SQLExecutor sqlExecutor; private Map queryResultMap;//path-result @@ -111,6 +132,7 @@ public String parse(String request) { * @param request * @return */ + @NotNull public String parse(JSONObject request) { return JSON.toJSONString(parseResponse(request)); } @@ -119,12 +141,13 @@ public String parse(JSONObject request) { * @param request 先parseRequest中URLDecoder.decode(request, UTF_8);再parseResponse(getCorrectRequest(...)) * @return parseResponse(requestObject); */ + @NotNull public JSONObject parseResponse(String request) { Log.d(TAG, "\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" + requestMethod + "/parseResponse request = \n" + request + "\n\n"); try { - requestObject = getCorrectRequest(requestMethod, parseRequest(request, requestMethod)); + requestObject = parseRequest(request, requestMethod); } catch (Exception e) { return newErrorResult(e); } @@ -136,24 +159,34 @@ public JSONObject parseResponse(String request) { * @param request * @return requestObject */ + @NotNull public JSONObject parseResponse(JSONObject request) { long startTime = System.currentTimeMillis(); Log.d(TAG, "parseResponse startTime = " + startTime + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n\n "); - if (noVerify == false) { - //TODO 暂时去掉,方便测试 - if (RequestMethod.isPublicMethod(requestMethod) == false) { - try { - AccessVerifier.verifyLogin(session); - } catch (Exception e) { - return Parser.newErrorResult(e); + requestObject = request; + if (RequestMethod.isPublicMethod(requestMethod) == false) { + try { + //TODO + // if (noVerifyLogin == false) { + // Verifier.verifyLogin(session); + // } + if (noVerifyRequest == false) { + //补充全局缺省版本号 + if (session != null && requestObject.getIntValue(JSONRequest.KEY_VERSION) <= 0) { + requestObject.put(JSONRequest.KEY_VERSION, session.getAttribute(JSONRequest.KEY_VERSION)); + } + + requestObject = getCorrectRequest(requestMethod, requestObject); } + } catch (Exception e) { + return Parser.extendErrorResult(requestObject, e); } + } - if (globleRole == null) { - setGlobleRole(RequestRole.get(request.getString(JSONRequest.KEY_ROLE))); - } + if (noVerifyRole == false && globleRole == null) { + setGlobleRole(RequestRole.get(requestObject.getString(JSONRequest.KEY_ROLE))); } final String requestString = JSON.toJSONString(request);//request传进去解析后已经变了 @@ -162,22 +195,19 @@ public JSONObject parseResponse(JSONObject request) { queryResultMap = new HashMap(); Exception error = null; - sQLExecutor = new SQLExecutor(); + sqlExecutor = new SQLExecutor(); try { requestObject = getObject(null, null, request); } catch (Exception e) { e.printStackTrace(); error = e; } - sQLExecutor.close(); - sQLExecutor = null; + sqlExecutor.close(); + sqlExecutor = null; - if (noVerify == false) { - requestObject = AccessVerifier.removeAccessInfo(requestObject); - } - requestObject = error == null ? extendSuccessResult(requestObject) - : extendResult(requestObject, JSONResponse.CODE_PARTIAL_SUCCEED, "未完成全部请求:\n " + error.getMessage()); + requestObject = Verifier.removeAccessInfo(requestObject); + requestObject = error == null ? extendSuccessResult(requestObject) : extendErrorResult(requestObject, error); queryResultMap.clear(); @@ -203,14 +233,22 @@ public JSONObject parseResponse(JSONObject request) { * @return * @throws Exception */ + @NotNull public static JSONObject parseRequest(String request, RequestMethod method) throws Exception { - request = URLDecoder.decode(request, UTF_8); + //全走HTTP POST,不用encode和decode + // if (RequestMethod.isPublicMethod(method)) { + // request = URLDecoder.decode(request, UTF_8); + // Log.d(TAG, "\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n " + method + // + "/parseRequest request = \n" + request + "\n\n"); + // } if (method == null) { method = GET; } - Log.d(TAG, "\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n " + method - + "/parseResponse request = \n" + request + "\n\n"); - return JSON.parseObject(request); + JSONObject obj = JSON.parseObject(request); + if (obj == null) { + throw new UnsupportedEncodingException("JSON格式不合法!"); + } + return obj; } @@ -235,7 +273,13 @@ public static JSONObject extendResult(JSONObject object, int code, String msg) { if (object == null) { object = new JSONObject(true); } - object.put(JSONResponse.KEY_CODE, code); + if (object.containsKey(JSONResponse.KEY_CODE) == false) { + object.put(JSONResponse.KEY_CODE, code); + } + String m = StringUtil.getString(object.getString(JSONResponse.KEY_MSG)); + if (m.isEmpty() == false) { + msg = m + " \n " + StringUtil.getString(msg); + } object.put(JSONResponse.KEY_MSG, msg); return object; } @@ -246,13 +290,13 @@ public static JSONObject extendResult(JSONObject object, int code, String msg) { * @return */ public static JSONObject extendSuccessResult(JSONObject object) { - return extendResult(object, 200, "success"); + return extendResult(object, JSONResponse.CODE_SUCCESS, JSONResponse.MSG_SUCCEED); } /**获取请求成功的状态内容 * @return */ public static JSONObject newSuccessResult() { - return newResult(200, "success"); + return newResult(JSONResponse.CODE_SUCCESS, JSONResponse.MSG_SUCCEED); } /**添加请求成功的状态内容 * @param object @@ -270,7 +314,7 @@ public static JSONObject newErrorResult(Exception e) { if (e != null) { e.printStackTrace(); - int code = JSONResponse.CODE_NOT_FOUND; + int code; if (e instanceof UnsupportedEncodingException) { code = JSONResponse.CODE_UNSUPPORTED_ENCODING; } @@ -280,6 +324,9 @@ else if (e instanceof IllegalAccessException) { else if (e instanceof UnsupportedOperationException) { code = JSONResponse.CODE_UNSUPPORTED_OPERATION; } + else if (e instanceof NotExistException) { + code = JSONResponse.CODE_NOT_FOUND; + } else if (e instanceof IllegalArgumentException) { code = JSONResponse.CODE_ILLEGAL_ARGUMENT; } @@ -304,11 +351,14 @@ else if (e instanceof OutOfRangeException) { else if (e instanceof NullPointerException) { code = JSONResponse.CODE_NULL_POINTER; } + else { + code = JSONResponse.CODE_SERVER_ERROR; + } return newResult(code, e.getMessage()); } - return newResult(500, "服务器内部错误"); + return newResult(JSONResponse.CODE_SERVER_ERROR, JSONResponse.MSG_SERVER_ERROR); } @@ -321,20 +371,21 @@ else if (e instanceof NullPointerException) { * @return * @throws Exception */ - public static JSONObject getCorrectRequest(RequestMethod method, JSONObject request) throws Exception { + public static JSONObject getCorrectRequest(@NotNull RequestMethod method, JSONObject request) throws Exception { if (RequestMethod.isPublicMethod(method)) { return request;//需要指定JSON结构的get请求可以改为post请求。一般只有对安全性要求高的才会指定,而这种情况用明文的GET方式几乎肯定不安全 } String tag = request.getString(JSONRequest.KEY_TAG); if (StringUtil.isNotEmpty(tag, true) == false) { - throw new IllegalArgumentException("请指定tag!一般是table名称"); + throw new IllegalArgumentException("请设置tag!一般是Table名"); } + int version = request.getIntValue(JSONRequest.KEY_VERSION); JSONObject object = null; String error = ""; try { - object = getStructure(method, "Request", JSONRequest.KEY_TAG, tag); + object = getStructure(method, "Request", JSONRequest.KEY_TAG, tag, version); } catch (Exception e) { error = e.getMessage(); } @@ -352,6 +403,7 @@ public static JSONObject getCorrectRequest(RequestMethod method, JSONObject requ //获取指定的JSON结构 >>>>>>>>>>>>>> request.remove(JSONRequest.KEY_TAG); + request.remove(JSONRequest.KEY_VERSION); return Structure.parseRequest(method, "", (JSONObject) target.clone(), request); } @@ -362,7 +414,7 @@ public static JSONObject getCorrectRequest(RequestMethod method, JSONObject requ * @return * @throws Exception */ - public static JSONObject getCorrectResponse(final RequestMethod method + public static JSONObject getCorrectResponse(@NotNull final RequestMethod method , String table, JSONObject response) throws Exception { // Log.d(TAG, "getCorrectResponse method = " + method + "; table = " + table); // if (response == null || response.isEmpty()) {//避免无效空result:{}添加内容后变有效 @@ -387,10 +439,12 @@ public static JSONObject getCorrectResponse(final RequestMethod method * @param table * @param key * @param value + * @param version * @return * @throws Exception */ - public static JSONObject getStructure(RequestMethod method, String table, String key, String value) throws Exception { + public static JSONObject getStructure(@NotNull final RequestMethod method, @NotNull String table, + String key, String value, int version) throws Exception { //获取指定的JSON结构 <<<<<<<<<<<<<< SQLConfig config = new SQLConfig(GET, table); config.setColumn("structure"); @@ -400,7 +454,12 @@ public static JSONObject getStructure(RequestMethod method, String table, String if (key != null) { where.put(key, value); } + if (version > 0) { + where.put(JSONRequest.KEY_VERSION + "{}", ">=" + version); + } config.setWhere(where); + config.setOrder(JSONRequest.KEY_VERSION + (version > 0 ? "+" : "-")); + config.setCount(1); SQLExecutor qh = new SQLExecutor(); @@ -487,7 +546,12 @@ public com.alibaba.fastjson.JSON parseChild(@NotNull String path, @NotNull Strin @Override public JSONObject parseResponse(JSONRequest request) throws Exception { - return new Parser(GET, noVerify).setSession(session).parseResponse(request); + return new Parser(GET) + .setSession(session) + // .setNoVerifyRequest(noVerifyRequest) + .setNoVerifyLogin(noVerifyLogin) + .setNoVerifyRole(noVerifyRole) + .parseResponse(request); } // @Override @@ -593,11 +657,13 @@ private JSONArray getArray(String parentPath, String name, final JSONObject requ //key[]:{Table:{}}中key equals Table时 提取Table - boolean isContainer = true; int index = name == null ? -1 : name.lastIndexOf("[]"); - String table = index <= 0 ? null : Pair.parseEntry(name.substring(0, index), true).getKey(); - if (JSONRequest.isTableKey(table) && request.containsKey(table)) { - isContainer = false; + String childPath = index <= 0 ? null : Pair.parseEntry(name.substring(0, index), true).getKey(); // Table-key1-key2... + + //判断第一个key,即Table是否存在,如果存在就提取 + String[] childKeys = StringUtil.split(childPath, "-", false); + if (childKeys == null || childKeys.length <= 0 || request.containsKey(childKeys[0]) == false) { + childKeys = null; } @@ -612,7 +678,7 @@ private JSONArray getArray(String parentPath, String name, final JSONObject requ break; } //key[]:{Table:{}}中key equals Table时 提取Table - response.add(isContainer ? parent : parent.getJSONObject(table) ); + response.add(getValue(parent, childKeys)); //null有意义 } //Table>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -626,6 +692,29 @@ private JSONArray getArray(String parentPath, String name, final JSONObject requ } + /**根据路径取值 + * @param parent + * @param pathKeys + * @return + */ + private static Object getValue(JSONObject parent, String[] pathKeys) { + if (parent == null || pathKeys == null || pathKeys.length <= 0) { + Log.w(TAG, "getChild parent == null || pathKeys == null || pathKeys.length <= 0 >> return parent;"); + return parent; + } + + //逐层到达child的直接容器JSONObject parent + final int last = pathKeys.length - 1; + for (int i = 0; i < last; i++) {//一步一步到达指定位置 + if (parent == null) {//不存在或路径错误(中间的key对应value不是JSONObject) + break; + } + parent = getJSONObject(parent, pathKeys[i]); + } + + return parent == null ? null : parent.get(pathKeys[last]); + } + /**获取被依赖引用的key的路径, 实时替换[] -> []/i * @param parentPath @@ -729,7 +818,7 @@ private Object getValueByPath(String valuePath) { JSONObject parent = null; String[] keys = null; for (String path : set) { - if (valuePath.startsWith(path)) { + if (valuePath.startsWith(path + "/")) { try { parent = (JSONObject) queryResultMap.get(path); } catch (Exception e) { @@ -781,7 +870,7 @@ public static JSONObject getJSONObject(JSONObject object, String key) { */ private synchronized JSONObject getSQLObject(SQLConfig config) throws Exception { Log.i(TAG, "getSQLObject config = " + JSON.toJSONString(config)); - if (noVerify == false) { + if (noVerifyRole == false) { if (config.getRole() == null) { if (globleRole != null) { config.setRole(globleRole); @@ -789,75 +878,9 @@ private synchronized JSONObject getSQLObject(SQLConfig config) throws Exception config.setRole(visitorId <= 0 ? RequestRole.UNKNOWN : RequestRole.LOGIN); } } - AccessVerifier.verify(config, visitor); - } - return getCorrectResponse(requestMethod, config.getTable(), sQLExecutor.execute(config)); - } - - - - /**获取客户端实际需要的key - * @param method - * @param originKey - * @param isTableKey - * @param saveLogic 保留逻辑运算符 & | ! - * @return - */ - public static String getRealKey(RequestMethod method, String originKey, boolean isTableKey, boolean saveLogic) - throws Exception { - Log.i(TAG, "getRealKey saveLogic = " + saveLogic + "; originKey = " + originKey); - if (originKey == null || zuo.biao.apijson.JSONObject.isArrayKey(originKey)) { - Log.w(TAG, "getRealKey originKey == null || isArrayKey(originKey) >> return originKey;"); - return originKey; - } - - String key = new String(originKey); - if (key.endsWith("$")) {//搜索,查询时处理 - key = key.substring(0, key.length() - 1); - } else if (key.endsWith("{}")) {//被包含,或者说key对应值处于value的范围内。查询时处理 - key = key.substring(0, key.length() - 2); - } else if (key.endsWith("<>")) {//包含,或者说value处于key对应值的范围内。查询时处理 - key = key.substring(0, key.length() - 2); - } else if (key.endsWith("()")) {//方法,查询完后处理,先用一个Map保存? - key = key.substring(0, key.length() - 2); - } else if (key.endsWith("@")) {//引用,引用对象查询完后处理。fillTarget中暂时不用处理,因为非GET请求都是由给定的id确定,不需要引用 - key = key.substring(0, key.length() - 1); - } else if (key.endsWith("+")) {//延长,PUT查询时处理 - if (method == PUT) {//不为PUT就抛异常 - key = key.substring(0, key.length() - 1); - } - } else if (key.endsWith("-")) {//缩减,PUT查询时处理 - if (method == PUT) {//不为PUT就抛异常 - key = key.substring(0, key.length() - 1); - } - } - - String last = null;//不用Logic优化代码,否则 key 可能变为 key| 导致 key=value 变成 key|=value 而出错 - if (RequestMethod.isQueryMethod(method)) {//逻辑运算符仅供GET,HEAD方法使用 - last = key.isEmpty() ? "" : key.substring(key.length() - 1); - if ("&".equals(last) || "|".equals(last) || "!".equals(last)) { - key = key.substring(0, key.length() - 1); - } else { - last = null;//避免key + StringUtil.getString(last)错误延长 - } - } - - //"User:toUser":User转换"toUser":User, User为查询同名Table得到的JSONObject。交给客户端处理更好 - if (isTableKey) {//不允许在column key中使用Type:key形式 - key = Pair.parseEntry(key, true).getKey();//table以左边为准 - } else { - key = Pair.parseEntry(key).getValue();//column以右边为准 - } - - if (StringUtil.isWord(key.startsWith("@") ? key.substring(1) : key) == false) { - throw new IllegalArgumentException(TAG + "/" + method + " getRealKey: 字符 " + originKey + " 不合法!"); - } - - if (saveLogic && last != null) { - key = key + last; + Verifier.verify(config, visitor); } - Log.i(TAG, "getRealKey return key = " + key); - return key; + return getCorrectResponse(requestMethod, config.getTable(), sqlExecutor.execute(config)); } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/ParserAdapter.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/ParserAdapter.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/ParserAdapter.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/ParserAdapter.java diff --git a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Structure.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Structure.java similarity index 51% rename from APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Structure.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Structure.java index 8a380d89c..1c836146d 100644 --- a/APIJSON(Server)/APIJSON(Eclipse_JEE)/src/main/java/zuo/biao/apijson/server/Structure.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/Structure.java @@ -14,8 +14,16 @@ package zuo.biao.apijson.server; -import static zuo.biao.apijson.JSONResponse.KEY_ID; -import static zuo.biao.apijson.RequestMethod.POST; +import static zuo.biao.apijson.JSONRequest.KEY_ID; +import static zuo.biao.apijson.JSONRequest.KEY_ID_IN; +import static zuo.biao.apijson.server.Operation.ADD; +import static zuo.biao.apijson.server.Operation.DISALLOW; +import static zuo.biao.apijson.server.Operation.NECESSARY; +import static zuo.biao.apijson.server.Operation.PUT; +import static zuo.biao.apijson.server.Operation.REMOVE; +import static zuo.biao.apijson.server.Operation.REPLACE; +import static zuo.biao.apijson.server.Operation.UNIQUE; +import static zuo.biao.apijson.server.Operation.VERIFY; import java.util.ArrayList; import java.util.Arrays; @@ -24,6 +32,7 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; +import java.util.regex.Pattern; import javax.activation.UnsupportedDataTypeException; import javax.validation.constraints.NotNull; @@ -31,46 +40,54 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import apijson.demo.server.Verifier; +import apijson.demo.server.model.BaseModel; import zuo.biao.apijson.JSON; +import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.RequestMethod; import zuo.biao.apijson.RequestRole; import zuo.biao.apijson.StringUtil; +import zuo.biao.apijson.model.Test; +import zuo.biao.apijson.server.sql.SQLConfig; +import zuo.biao.apijson.server.sql.SQLExecutor; //TODO 放到 zuo.biao.apijson 包内,供Android客户端校验请求结构 /**结构类 - * 增删改查: operation(add,replace,put,remove) operation:{key0:value0, key1:value1 ...} - * 对值校验: verify:{key0:value0, key1:value1 ...} (key{}:range,key$:"%m%"等) + * 增删改查: OPERATION(ADD,REPLACE,PUT,REMOVE) OPERATION:{key0:value0, key1:value1 ...} + * 对值校验: VERIFY:{key0:value0, key1:value1 ...} (key{}:range,key$:"%m%"等) + * 对值重复性校验: UNIQUE:"key0:, key1 ..." (UNIQUE:"phone,email" 等) * @author Lemon */ public class Structure { private static final String TAG = "Structure"; + private Structure() {} - static final String requestString = "{\"Comment\":{\"disallow\": \"id\", \"necessary\": \"userId,momentId,content\"}, \"add\":{\"Comment:to\":{}}}"; - static final String responseString = "{\"User\":{\"remove\": \"phone\", \"replace\":{\"sex\":2}, \"add\":{\"name\":\"api\"}}, \"put\":{\"Comment:to\":{}}}"; + static final String requestString = "{\"Comment\":{\"DISALLOW\": \"id\", \"NECESSARY\": \"userId,momentId,content\"}, \"ADD\":{\"Comment:to\":{}}}"; + static final String responseString = "{\"User\":{\"REMOVE\": \"phone\", \"REPLACE\":{\"sex\":2}, \"ADD\":{\"name\":\"api\"}}, \"PUT\":{\"Comment:to\":{}}}"; public static void test() throws Exception { JSONObject request; try { request = JSON.parseObject("{\"Comment\":{\"userId\":0}}"); - Log.d(TAG, "test parseRequest = " + parseRequest(POST, "", JSON.parseObject(requestString), request)); + Log.d(TAG, "test parseRequest = " + parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request)); } catch (Exception e) { e.printStackTrace(); } try { request = JSON.parseObject("{\"Comment\":{\"userId\":0, \"momentId\":0, \"content\":\"apijson\"}}"); - Log.d(TAG, "test parseRequest = " + parseRequest(POST, "", JSON.parseObject(requestString), request)); + Log.d(TAG, "test parseRequest = " + parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request)); } catch (Exception e) { e.printStackTrace(); } try { request = JSON.parseObject("{\"Comment\":{\"id\":0, \"userId\":0, \"momentId\":0, \"content\":\"apijson\"}}"); - Log.d(TAG, "test parseRequest = " + parseRequest(POST, "", JSON.parseObject(requestString), request)); + Log.d(TAG, "test parseRequest = " + parseRequest(RequestMethod.POST, "", JSON.parseObject(requestString), request)); } catch (Exception e) { e.printStackTrace(); } @@ -104,26 +121,6 @@ public static void test() throws Exception { } - - //TODO 放在一个 enum StructureOperate - public static final int TYPE_DEFAULT = 0; - public static final int TYPE_VERIFY = 1; - public static final int TYPE_ADD = 2; - public static final int TYPE_PUT = 3; - public static final int TYPE_REPLACE = 4; - public static final int TYPE_REMOVE = 5; - - public static final String NAME_VERIFY = "verify"; - - public static final String NAME_ADD = "add"; - public static final String NAME_PUT = "put"; - public static final String NAME_REPLACE = "replace"; - public static final String NAME_REMOVE = "remove"; - - public static final String NAME_DISALLOW = "disallow"; - public static final String NAME_NECESSARY = "necessary"; - - /**从request提取target指定的内容 * @param method @@ -133,7 +130,7 @@ public static void test() throws Exception { * @return * @throws Exception */ - public static JSONObject parseRequest(final RequestMethod method, final String name + public static JSONObject parseRequest(@NotNull final RequestMethod method, final String name , final JSONObject target, final JSONObject request) throws Exception { Log.i(TAG, "parseRequest method = " + method + "; name = " + name + "; target = \n" + JSON.toJSONString(target) @@ -157,16 +154,38 @@ public JSONObject onParseJSONObject(String key, JSONObject tobj, JSONObject robj // Log.i(TAG, "parseRequest.parse.onParseJSONObject key = " + key + "; robj = " + robj); if (robj == null) { if (tobj != null) {//不允许不传Target中指定的Table - throw new IllegalArgumentException("请设置 " + key + " !"); + throw new IllegalArgumentException(method.name() + "请求,请设置 " + key + " !"); } } else if (zuo.biao.apijson.JSONObject.isTableKey(key)) { - if (method == POST) { + if (method == RequestMethod.POST) { if (robj.containsKey(KEY_ID)) { - throw new IllegalArgumentException("POST " + key + " 请求不能设置" + KEY_ID + "!"); + throw new IllegalArgumentException("POST请求, " + key + " 不能设置 " + KEY_ID + " !"); } } else { - if (RequestMethod.isQueryMethod(method) == false && robj.containsKey(KEY_ID) == false) { - throw new IllegalArgumentException("请设置 " + key + " 的 " + KEY_ID + "!"); + if (RequestMethod.isQueryMethod(method) == false) { + //单个修改或删除 + Object id = robj.get(KEY_ID); //如果必须传 id ,可在Request表中配置necessary + if (id != null) { + if (id instanceof Number == false) { + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面的 " + KEY_ID_IN + ":value 中value的类型只能是Long!"); + } + } else { + //批量修改或删除 + Object arr = robj.get(KEY_ID_IN); //如果必须传 id{} ,可在Request表中配置necessary + if (arr == null) { + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面 " + KEY_ID + " 和 " + KEY_ID_IN + " 必须传其中一个!"); + } + if (arr instanceof JSONArray == false) { + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面的 " + KEY_ID_IN + ":value 中value的类型只能是 [Long] !"); + } + if (((JSONArray)arr).size() > 10) { //不允许一次操作10条以上记录 + throw new IllegalArgumentException(method.name() + "请求, " + key + + " 里面的 " + KEY_ID_IN + ":[] 中[]的长度不能超过10!"); + } + } } } } @@ -183,11 +202,11 @@ public JSONObject onParseJSONObject(String key, JSONObject tobj, JSONObject robj * @param name * @param target * @param response - * @param callback + * @param callback * @return * @throws Exception */ - public static JSONObject parseResponse(final RequestMethod method, final String name + public static JSONObject parseResponse(@NotNull final RequestMethod method, final String name , final JSONObject target, final JSONObject response, OnParseCallback callback) throws Exception { Log.i(TAG, "parseResponse method = " + method + "; name = " + name + "; target = \n" + JSON.toJSONString(target) @@ -217,24 +236,26 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real //获取配置<<<<<<<<<<<<<<<<<<<<<<<<<<<< - JSONObject verify = target.getJSONObject(NAME_VERIFY); - JSONObject add = target.getJSONObject(NAME_ADD); - JSONObject put = target.getJSONObject(NAME_PUT); - JSONObject replace = target.getJSONObject(NAME_REPLACE); + JSONObject verify = target.getJSONObject(VERIFY.name()); + JSONObject add = target.getJSONObject(ADD.name()); + JSONObject put = target.getJSONObject(PUT.name()); + JSONObject replace = target.getJSONObject(REPLACE.name()); - String remove = StringUtil.getNoBlankString(target.getString(NAME_REMOVE)); - String necessary = StringUtil.getNoBlankString(target.getString(NAME_NECESSARY)); - String disallow = StringUtil.getNoBlankString(target.getString(NAME_DISALLOW)); + String unique = StringUtil.getNoBlankString(target.getString(UNIQUE.name())); + String remove = StringUtil.getNoBlankString(target.getString(REMOVE.name())); + String necessary = StringUtil.getNoBlankString(target.getString(NECESSARY.name())); + String disallow = StringUtil.getNoBlankString(target.getString(DISALLOW.name())); //不还原,传进来的target不应该是原来的 - target.remove(NAME_VERIFY); - target.remove(NAME_ADD); - target.remove(NAME_PUT); - target.remove(NAME_REPLACE); - - target.remove(NAME_REMOVE); - target.remove(NAME_NECESSARY); - target.remove(NAME_DISALLOW); + target.remove(VERIFY.name()); + target.remove(ADD.name()); + target.remove(PUT.name()); + target.remove(REPLACE.name()); + + target.remove(UNIQUE.name()); + target.remove(REMOVE.name()); + target.remove(NECESSARY.name()); + target.remove(DISALLOW.name()); //获取配置>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -242,7 +263,7 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real //移除字段<<<<<<<<<<<<<<<<<<< - String[] removes = StringUtil.split(StringUtil.getNoBlankString(remove)); + String[] removes = StringUtil.split(remove); if (removes != null && removes.length > 0) { for (String r : removes) { real.remove(r); @@ -254,7 +275,7 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real String[] necessarys = StringUtil.split(necessary); List necessaryList = necessarys == null ? new ArrayList() : Arrays.asList(necessarys); for (String s : necessaryList) { - if (real.containsKey(s) == false) { + if (real.get(s) == null) {//可能传null进来,这里还会通过 real.containsKey(s) == false) { throw new IllegalArgumentException(name + "不能缺少 " + s + " 等[" + necessary + "]内的任何字段!"); } @@ -283,7 +304,7 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real for (String s : disallowList) { if (real.containsKey(s)) { throw new IllegalArgumentException(name - + "不允许传 " + s + " 等[" + disallow + "]内的任何字段!"); + + "不允许传 " + s + " 等" + StringUtil.getString(disallowList) + "内的任何字段!"); } } //判断是否都有不允许的字段>>>>>>>>>>>>>>>>>>> @@ -343,12 +364,23 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real //校验与修改Request<<<<<<<<<<<<<<<<< //在tableKeySet校验后操作,避免 导致put/add进去的Table 被当成原Request的内容 - real = operate(TYPE_VERIFY, verify, real); - real = operate(TYPE_ADD, add, real); - real = operate(TYPE_PUT, put, real); - real = operate(TYPE_REPLACE, replace, real); + real = operate(VERIFY, verify, real); + real = operate(ADD, add, real); + real = operate(PUT, put, real); + real = operate(REPLACE, replace, real); //校验与修改Request>>>>>>>>>>>>>>>>> + //TODO放在operate前?考虑性能、operate修改后再验证的值是否和原来一样 + //校验重复<<<<<<<<<<<<<<<<<<< + String[] uniques = StringUtil.split(unique); + if (BaseModel.isEmpty(uniques) == false) { + long exceptId = real.getLongValue(KEY_ID); + for (String u : uniques) { + Verifier.verifyRepeat(name, u, real.get(u), exceptId); + } + } + //校验重复>>>>>>>>>>>>>>>>>>> + Log.i(TAG, "parse return real = " + JSON.toJSONString(real)); return real; } @@ -356,13 +388,13 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real /**执行操作 - * @param type + * @param opt * @param targetChild * @param real * @return * @throws Exception */ - private static JSONObject operate(int type, JSONObject targetChild, JSONObject real) throws Exception { + private static JSONObject operate(Operation opt, JSONObject targetChild, JSONObject real) throws Exception { if (targetChild == null) { return real; } @@ -370,17 +402,11 @@ private static JSONObject operate(int type, JSONObject targetChild, JSONObject r throw new IllegalArgumentException("operate real == null!!!"); } - if (type <= TYPE_DEFAULT || type > TYPE_REMOVE) { - return real; - } - Set> set = new LinkedHashSet<>(targetChild.entrySet()); String tk; Object tv; - String rk; - Object rv; - Logic logic; + for (Entry e : set) { tk = e == null ? null : e.getKey(); if (tk == null) { @@ -388,87 +414,178 @@ private static JSONObject operate(int type, JSONObject targetChild, JSONObject r } tv = e.getValue(); - - if (type == TYPE_VERIFY) {//TODO {}, $, <> - if (tv == null) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY >> tv == null!!!"); + if (opt == VERIFY) { + verify(tk, tv, real); + } else if (opt == PUT) { + real.put(tk, tv); + } else { + if (real.containsKey(tk)) { + if (opt == REPLACE) { + real.put(tk, tv); + } + } else { + if (opt == ADD) { + real.put(tk, tv); + } } + } + } - if (tk.endsWith("{}")) {//rv符合tv条件或在tv内 - logic = new Logic(tk.substring(0, tk.length() - 2)); - rk = logic.getKey(); - rv = real.get(rk); - - if (tv instanceof String) {//TODO >= 0, < 10 - //TODO - } else if (tv instanceof JSONArray) { - if (((JSONArray) tv).contains(rv) == logic.isNot()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> ((JSONArray) tv).contains(rv) == logic.isNot()"); - } - } else { - throw new UnsupportedDataTypeException(""); - } - } else if (tk.endsWith("<>")) {//rv包含tv内的值 - logic = new Logic(tk.substring(0, tk.length() - 2)); - rk = logic.getKey(); - rv = real.get(rk); + return real; + } - if (rv instanceof JSONArray == false) { - throw new UnsupportedDataTypeException(""); - } - JSONArray array; - if (tv instanceof JSONArray) { - array = (JSONArray) tv; - } else { - array = new JSONArray(); - array.add(tv); - } + /**验证值 + * @param tk + * @param tv + * @param real + * @throws Exception + */ + private static void verify(@NotNull String tk, @NotNull Object tv, @NotNull JSONObject real) throws Exception { + if (tv == null) { + throw new IllegalArgumentException("operate operate == VERIFY " + tk + ":" + tv + " , >> tv == null!!!"); + } - boolean isOr = false; - for (Object o : array) { - if (((JSONArray) rv).contains(o)) { - if (logic.isNot()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> ((JSONArray) rv).contains(o) >> logic.isNot()"); - } - if (logic.isOr()) { - isOr = true; - break; - } - } else { - if (logic.isAnd()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> ((JSONArray) rv).contains(o) == false >> logic.isAnd()"); - } - } - } + String rk; + Object rv; + Logic logic; + if (tk.endsWith("$")) { //搜索 + sqlVerify("$", real, tk, tv); + } + else if (tk.endsWith("?")) { //正则表达式 + logic = new Logic(tk.substring(0, tk.length() - 1)); + rk = logic.getKey(); + rv = real.get(rk); + if (rv == null) { + return; + } - if (isOr == false && logic.isOr()) { - throw new IllegalArgumentException("operate operate == TYPE_VERIFY" - + " >> isOr == false && logic.isOr()"); + JSONArray array = SQLConfig.newJSONArray(tv); + + boolean m; + boolean isOr = false; + Pattern reg; + for (Object r : array) { + if (r instanceof String == false) { + throw new UnsupportedDataTypeException(rk + ":" + rv + " 中value只支持 String 或 [String] 类型!"); + } + reg = ObjectParser.COMPILE_MAP.get(r); + if (reg == null) { + reg = Pattern.compile((String) r); + } + m = reg.matcher("" + rv).matches(); + if (m) { + if (logic.isNot()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + if (logic.isOr()) { + isOr = true; + break; + } + } else { + if (logic.isAnd()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); } - } else if (tk.endsWith("$")) {//TODO 正则表达式? + } + } + if (isOr == false && logic.isOr()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + } + else if (tk.endsWith("{}")) { //rv符合tv条件或在tv内 + if (tv instanceof String) {//TODO >= 0, < 10 + sqlVerify("{}", real, tk, tv); + } + else if (tv instanceof JSONArray) { + logic = new Logic(tk.substring(0, tk.length() - 2)); + rk = logic.getKey(); + rv = real.get(rk); + if (rv == null) { + return; } - } else if (type == TYPE_PUT) { - real.put(tk, tv); - } else { - if (real.containsKey(tk)) { - if (type == TYPE_REPLACE) { - real.put(tk, tv); + if (((JSONArray) tv).contains(rv) == logic.isNot()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + } + else { + throw new UnsupportedDataTypeException("服务器Request表verify配置错误!"); + } + } + else if (tk.endsWith("<>")) { //rv包含tv内的值 + logic = new Logic(tk.substring(0, tk.length() - 2)); + rk = logic.getKey(); + rv = real.get(rk); + if (rv == null) { + return; + } + + if (rv instanceof JSONArray == false) { + throw new UnsupportedDataTypeException("服务器Request表verify配置错误!"); + } + + JSONArray array = SQLConfig.newJSONArray(tv); + + boolean isOr = false; + for (Object o : array) { + if (((JSONArray) rv).contains(o)) { + if (logic.isNot()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } + if (logic.isOr()) { + isOr = true; + break; } } else { - if (type == TYPE_ADD) { - real.put(tk, tv); + if (logic.isAnd()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); } } } + + if (isOr == false && logic.isOr()) { + throw new IllegalArgumentException(rk + ":value 中value不合法!必须匹配 " + tk + ":" + tv + " !"); + } } + else { + throw new IllegalArgumentException("服务器Request表verify配置错误!"); + } + } - return real; + /**通过数据库执行SQL语句来验证条件 + * @param funChar + * @param real + * @param tk + * @param tv + * @throws Exception + */ + private static void sqlVerify(@NotNull String funChar, JSONObject real, String tk, Object tv) throws Exception { + //不能用Parser, 0 这种不符合 StringUtil.isName ! + Logic logic = new Logic(tk.substring(0, tk.length() - funChar.length())); + String rk = logic.getKey(); + Object rv = real.get(rk); + if (rv == null) { + return; + } + + SQLConfig config = new SQLConfig(RequestMethod.HEAD, 1, 0); + config.setTable(Test.class.getSimpleName()); + config.setTest(true); + config.addWhere("'" + rv + "'" + logic.getChar() + funChar, tv); + + SQLExecutor executor = new SQLExecutor(); + JSONObject result = null; + try { + result = executor.execute(config); + } catch (Exception e) { + throw e; + } finally { + executor.close(); + } + if (result != null && JSONResponse.isExist(result.getIntValue(JSONResponse.KEY_COUNT)) == false) { + throw new IllegalArgumentException(rk + ":" + rv + "中value不合法!必须匹配 " + logic.getChar() + tv + " !"); + } } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/ConditionErrorException.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/ConflictException.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/NotExistException.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/NotLoggedInException.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/OutOfRangeException.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/exception/package-info.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/exception/package-info.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/package-info.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/package-info.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java similarity index 55% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java index d11b8b7bb..8e344c090 100755 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/SQLConfig.java @@ -14,15 +14,20 @@ package zuo.biao.apijson.server.sql; +import static zuo.biao.apijson.JSONObject.KEY_ABOUT; import static zuo.biao.apijson.JSONObject.KEY_COLUMN; +import static zuo.biao.apijson.JSONObject.KEY_CONDITION; import static zuo.biao.apijson.JSONObject.KEY_GROUP; import static zuo.biao.apijson.JSONObject.KEY_HAVING; +import static zuo.biao.apijson.JSONObject.KEY_ID; +import static zuo.biao.apijson.JSONObject.KEY_ID_IN; import static zuo.biao.apijson.JSONObject.KEY_ORDER; import static zuo.biao.apijson.JSONObject.KEY_ROLE; import static zuo.biao.apijson.JSONObject.KEY_SCHEMA; import static zuo.biao.apijson.JSONRequest.KEY_COUNT; import static zuo.biao.apijson.JSONRequest.KEY_PAGE; import static zuo.biao.apijson.JSONRequest.KEY_QUERY; +import static zuo.biao.apijson.RequestMethod.DELETE; import static zuo.biao.apijson.RequestMethod.GET; import static zuo.biao.apijson.RequestMethod.POST; import static zuo.biao.apijson.RequestMethod.PUT; @@ -31,27 +36,33 @@ import static zuo.biao.apijson.SQL.OR; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import javax.validation.constraints.NotNull; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; +import apijson.demo.server.model.BaseModel; +import apijson.demo.server.model.Privacy; import apijson.demo.server.model.User; -import apijson.demo.server.model.UserPrivacy; -import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.RequestMethod; import zuo.biao.apijson.RequestRole; import zuo.biao.apijson.SQL; import zuo.biao.apijson.StringUtil; +import zuo.biao.apijson.model.Column; +import zuo.biao.apijson.model.Table; import zuo.biao.apijson.server.Logic; -import zuo.biao.apijson.server.Parser; +import zuo.biao.apijson.server.Pair; import zuo.biao.apijson.server.exception.NotExistException; /**config sql for JSON Request @@ -63,10 +74,15 @@ public class SQLConfig { public static final String MYSQL_URI = "jdbc:mysql://localhost:3306";//TODO 改成你自己的 public static final String MYSQL_SCHEMA = "sys";//TODO 改成你自己的 public static final String MYSQL_ACCOUNT = "root";//TODO 改成你自己的 - public static final String MYSQL_PASSWORD = "root";//TODO 改成你自己的 + public static final String MYSQL_PASSWORD = "apijson";//TODO 改成你自己的 + + + public static final String SCHEMA_INFORMATION = "`information_schema`"; + public static final String TABLE_SCHEMA = "`table_schema`"; + public static final String TABLE_NAME = "`table_name`"; + - public static final String ID = JSONResponse.KEY_ID; public static final List ARRAY_KEY_LIST; static { @@ -79,7 +95,9 @@ public class SQLConfig { static { TABLE_KEY_LIST = new ArrayList(); TABLE_KEY_LIST.add(KEY_ROLE); + TABLE_KEY_LIST.add(KEY_CONDITION); TABLE_KEY_LIST.add(KEY_SCHEMA); + TABLE_KEY_LIST.add(KEY_ABOUT); TABLE_KEY_LIST.add(KEY_COLUMN); TABLE_KEY_LIST.add(KEY_GROUP); TABLE_KEY_LIST.add(KEY_HAVING); @@ -92,17 +110,24 @@ public class SQLConfig { public static final Map TABLE_KEY_MAP; static { TABLE_KEY_MAP = new HashMap(); + TABLE_KEY_MAP.put(Table.class.getSimpleName(), Table.TAG); + TABLE_KEY_MAP.put(Column.class.getSimpleName(), Column.TAG); + TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user"); - TABLE_KEY_MAP.put(UserPrivacy.class.getSimpleName(), "apijson_user_privacy"); + TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy"); } private long id; //Table的id private RequestMethod method; //操作方法 + /** + * TODO 被关联的表通过就忽略关联的表?(这个不行 User:{"sex@":"/Comment/toId"}) + */ private RequestRole role; //发送请求的用户的角色 private String schema; //Table所在的数据库 private String table; //Table名 + private boolean about; //关于,返回数据库表的信息,包括表说明和字段说明 private String group; //分组方式的字符串数组,','分隔 private String having; //聚合函数的字符串数组,','分隔 private String order; //排序方式的字符串数组,','分隔 @@ -119,6 +144,7 @@ public class SQLConfig { private int query; //JSONRequest.query private int type; //ObjectParser.type //array item >>>>>>>>>> + private boolean test; //测试 private boolean cacheStatic; //静态缓存 public SQLConfig(RequestMethod method) { @@ -167,6 +193,13 @@ public SQLConfig setRole(RequestRole role) { } public String getSchema() { + String sqlTable = getSQLTable(); + if (sqlTable != null && sqlTable.startsWith("`")) { + return SCHEMA_INFORMATION; + } + return getSchema(schema); + } + public static String getSchema(String schema) { if (StringUtil.isEmpty(schema, true)) { schema = MYSQL_SCHEMA; //非默认Schema必须要有 } @@ -200,6 +233,14 @@ public SQLConfig setTable(String table) { return this; } + public boolean isAbout() { + return about; + } + public SQLConfig setAbout(boolean about) { + this.about = about; + return this; + } + public String getGroup() { return group; } @@ -273,8 +314,8 @@ public SQLConfig setColumn(String column) { public String getColumnString() throws NotExistException { switch (getMethod()) { case HEAD: - case POST_HEAD: - return "count(0) AS count"; + case HEADS: + return SQL.count(column); case POST: if (StringUtil.isEmpty(column, true)) { throw new NotExistException(TAG + "getColumnString getMethod() = POST" @@ -298,12 +339,12 @@ public String getValues() { public String getValuesString() { return values; } - public SQLConfig setValues(String[][] values) { + public SQLConfig setValues(String[][] valuess) { String s = ""; - if (values != null && values.length > 0) { - String[] items = new String[values.length]; - for (int i = 0; i < values.length; i++) { - items[i] = "(" + StringUtil.getString(values[i]) + ")"; + if (BaseModel.isEmpty(valuess) == false) { + String[] items = new String[valuess.length]; + for (int i = 0; i < valuess.length; i++) { + items[i] = "(" + StringUtil.getString(valuess[i]) + ")"; } s = StringUtil.getString(items); } @@ -359,6 +400,13 @@ public SQLConfig setType(int type) { return this; } + public boolean isTest() { + return test; + } + public SQLConfig setTest(boolean test) { + this.test = test; + return this; + } public boolean isCacheStatic() { return cacheStatic; } @@ -429,11 +477,13 @@ public Object getWhere(String key, boolean exactMatch) { Set set = key == null || where == null ? null : where.keySet(); if (set != null) { synchronized (where) { - int index; - for (String k : set) { - index = k.indexOf(key); - if (index > 0 && StringUtil.isWord(k.substring(index)) == false) { - return where.get(k); + if (where != null) { + int index; + for (String k : set) { + index = k.indexOf(key); + if (index >= 0 && StringUtil.isName(k.substring(index)) == false) { + return where.get(k); + } } } } @@ -443,7 +493,7 @@ public Object getWhere(String key, boolean exactMatch) { public SQLConfig addWhere(String key, Object value) { if (key != null) { if (where == null) { - where = new HashMap(); + where = new LinkedHashMap(); } where.put(key, value); } @@ -456,7 +506,7 @@ public SQLConfig addWhere(String key, Object value) { */ @JSONField(serialize = false) public String getWhereString() throws Exception { - return getWhereString(getMethod(), getWhere()); + return getWhereString(getMethod(), getWhere(), ! isTest()); } /**获取WHERE * @param method @@ -464,67 +514,91 @@ public String getWhereString() throws Exception { * @return * @throws Exception */ - public static String getWhereString(RequestMethod method, Map where) throws Exception { + public static String getWhereString(RequestMethod method, Map where, boolean verifyName) throws Exception { Set set = where == null ? null : where.keySet(); - if (set != null && set.size() > 0) { - - String whereString = ""; - boolean isFirst = true; - int keyType = 0;// 0 - =; 1 - $, 2 - {} - Object value; - for (String key : set) { - Log.d(TAG, "getWhereString key = " + key); - //避免筛选到全部 value = key == null ? null : where.get(key); - if (key == null || key.startsWith("@") || key.endsWith("()")) {//关键字||方法, +或-直接报错 - Log.d(TAG, "getWhereString key == null || key.startsWith(@) || key.endsWith(()) >> continue;"); - continue; - } - if (key.endsWith("@")) {//引用 - key = key.substring(0, key.lastIndexOf("@")); - // throw new IllegalArgumentException(TAG + ".getWhereString: 字符 " + key + " 不合法!"); - } - if (key.endsWith("$")) { - keyType = 1; - } else if (key.endsWith("{}")) { - keyType = 2; - } else if (key.endsWith("<>")) { - keyType = 3; - } - value = where.get(key); - key = Parser.getRealKey(method, key, false, true); - - String condition = ""; - switch (keyType) { - case 1: - condition = getSearchString(key, value); - break; - case 2: - condition = getRangeString(key, value); - break; - case 3: - condition = getContainString(key, value); - break; - default: - condition = (key + "='" + value + "'"); - break; - } - if (StringUtil.isEmpty(condition, true)) {//避免SQL条件连接错误 - continue; - } + if (BaseModel.isEmpty(set)) { + return ""; + } + String whereString = ""; + boolean isFirst = true; - whereString += (isFirst ? "" : AND) + condition; + String condition; + for (String key : set) { + condition = getWhereItem(key, where.get(key), method, verifyName); - isFirst = false; + if (StringUtil.isEmpty(condition, true)) {//避免SQL条件连接错误 + continue; } - if (whereString.isEmpty() == false) { - return " WHERE " + whereString; - } + whereString += (isFirst ? "" : AND) + "(" + condition + ")"; + + isFirst = false; } - return ""; + String s = whereString.isEmpty() ? "" : " WHERE " + whereString; + + if (s.isEmpty() && RequestMethod.isQueryMethod(method) == false) { + throw new UnsupportedOperationException("写操作请求必须带条件!!!"); + } + + return s; } + /** + * @param key + * @param value + * @param method + * @param verifyName + * @return + * @throws Exception + */ + private static String getWhereItem(String key, Object value + , RequestMethod method, boolean verifyName) throws Exception { + Log.d(TAG, "getWhereItem key = " + key); + //避免筛选到全部 value = key == null ? null : where.get(key); + if (key == null || value == null || key.startsWith("@") || key.endsWith("()")) {//关键字||方法, +或-直接报错 + Log.d(TAG, "getWhereItem key == null || value == null" + + " || key.startsWith(@) || key.endsWith(()) >> continue;"); + return null; + } + if (key.endsWith("@")) {//引用 + // key = key.substring(0, key.lastIndexOf("@")); + throw new IllegalArgumentException(TAG + ".getWhereItem: 字符 " + key + " 不合法!"); + } + + int keyType; + if (key.endsWith("$")) { + keyType = 1; + } + else if (key.endsWith("?")) { + keyType = 2; + } + else if (key.endsWith("{}")) { + keyType = 3; + } + else if (key.endsWith("<>")) { + keyType = 4; + } + else { //else绝对不能省,避免再次踩坑! keyType = 0; 写在for循环外面都没注意! + keyType = 0; + } + key = getRealKey(method, key, false, true, verifyName); + + switch (keyType) { + case 1: + return getSearchString(key, value); + case 2: + return getRegExpString(key, value); + case 3: + return getRangeString(key, value); + case 4: + return getContainString(key, value); + default: + return (key + "='" + value + "'"); + } + } + + //$ search <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**search key match value * @param in @@ -540,15 +614,11 @@ public static String getSearchString(String key, Object value) throws IllegalArg key = logic.getKey(); Log.i(TAG, "getRangeString key = " + key); - if (value instanceof JSONArray == false) {//TODO 直接掉Like性能最好! - JSONArray array = new JSONArray(); - array.add(value); - value = array; - } - if (((JSONArray) value).isEmpty()) { + JSONArray arr = newJSONArray(value); + if (arr.isEmpty()) { return ""; } - return getSearchString(key, ((JSONArray) value).toArray(), logic.getType()); + return getSearchString(key, arr.toArray(), logic.getType()); } /**search key match values * @param in @@ -568,7 +638,7 @@ public static String getSearchString(String key, Object[] values, int type) thro condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) + getLikeString(key, values[i]); } - return (Logic.isNot(type) ? NOT : "") + "(" + condition + ")"; + return getCondition(Logic.isNot(type), condition); } /**WHERE key LIKE 'value' @@ -582,6 +652,61 @@ public static String getLikeString(String key, Object value) { //$ search >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + //$ search <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /**search key match RegExps value + * @param in + * @return {@link #getRegExpString(String, Object[], int)} + * @throws IllegalArgumentException + */ + public static String getRegExpString(String key, Object value) throws IllegalArgumentException { + if (value == null) { + return ""; + } + + Logic logic = new Logic(key); + key = logic.getKey(); + Log.i(TAG, "getRangeString key = " + key); + + JSONArray arr = newJSONArray(value); + if (arr.isEmpty()) { + return ""; + } + return getRegExpString(key, arr.toArray(), logic.getType()); + } + /**search key match RegExp values + * @param in + * @return LOGIC [ key REGEXP 'values[i]' ] + * @throws IllegalArgumentException + */ + public static String getRegExpString(String key, Object[] values, int type) throws IllegalArgumentException { + if (values == null || values.length <= 0) { + return ""; + } + + String condition = ""; + for (int i = 0; i < values.length; i++) { + if (values[i] instanceof String == false) { + throw new IllegalArgumentException(key + "$\":value 中value只能为String或JSONArray!"); + } + condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) + getRegExpString(key, (String) values[i]); + } + + return getCondition(Logic.isNot(type), condition); + } + + /**WHERE key REGEXP 'value' + * @param key + * @param value + * @return key REGEXP 'value' + */ + public static String getRegExpString(String key, String value) { + return key + " REGEXP '" + value + "'"; + } + //$ search >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //{} range <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /**WHERE key > 'key0' AND key <= 'key1' AND ... * @param key @@ -600,9 +725,9 @@ public static String getRangeString(String key, Object range) throws Exception { key = logic.getKey(); Log.i(TAG, "getRangeString key = " + key); - if (range instanceof JSONArray) { + if (range instanceof List) { if (logic.isOr() || logic.isNot()) { - return key + getInString(key, ((JSONArray) range).toArray(), logic.isNot()); + return key + getInString(key, ((List) range).toArray(), logic.isNot()); } throw new IllegalArgumentException(key + "{}\":[] 中key末尾的逻辑运算符只能用'|','!'中的一种 !"); } @@ -621,8 +746,7 @@ public static String getRangeString(String key, Object range) throws Exception { if (condition.isEmpty()) { return ""; } - condition = "(" + condition + ")"; - return logic.isNot() ? NOT + condition : condition; + return getCondition(logic.isNot(), condition); } throw new IllegalArgumentException(key + "{}:range 类型为" + range.getClass().getSimpleName() @@ -644,7 +768,7 @@ public static String getInString(String key, Object[] in, boolean not) throws No throw new NotExistException(TAG + ".getInString(" + key + ", [], " + not + ") >> condition.isEmpty() >> IN()"); } - return (not ? NOT : "") + " IN " + "(" + condition + ")"; + return (not ? NOT : "") + " IN (" + condition + ")"; } //{} range >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -665,12 +789,8 @@ public static String getContainString(String key, Object value) throws NotExistE key = logic.getKey(); Log.i(TAG, "getRangeString key = " + key); - if (value instanceof JSONArray == false) {//TODO 直接调Like性能最好! - JSONArray array = new JSONArray(); - array.add(value); - value = array; - } - return getContainString(key, ((JSONArray) value).toArray(), logic.getType()); + //TODO 直接调Like性能最好! + return getContainString(key, newJSONArray(value).toArray(), logic.getType()); } /**WHERE key contains childs * @param key @@ -692,7 +812,7 @@ public static String getContainString(String key, Object[] childs, int type) thr childs[i] = "\"" + childs[i] + "\""; } condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) - + getSearchString( + + "(" + getSearchString( key , new String[]{ "[" + childs[i] + "]", //全等 @@ -701,7 +821,7 @@ public static String getContainString(String key, Object[] childs, int type) thr "%, " + childs[i] + "]" //末尾 } , Logic.TYPE_OR - ); + ) + ")"; } } if (condition.isEmpty()) { @@ -711,14 +831,38 @@ public static String getContainString(String key, Object[] childs, int type) thr if (condition.isEmpty()) { return ""; } - return (Logic.isNot(type) ? NOT : "") + "(" + condition + ")"; + return getCondition(Logic.isNot(type), condition); } //<> contain >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + /**拼接条件 + * @param not + * @param condition + * @return + */ + private static String getCondition(boolean not, String condition) { + return not ? NOT + "(" + condition + ")" : condition; + } + - //WHERE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - + /**转为JSONArray + * @param tv + * @return + */ + @NotNull + public static JSONArray newJSONArray(Object obj) { + JSONArray array = new JSONArray(); + if (obj != null) { + if (obj instanceof Collection) { + array.addAll((Collection) obj); + } else { + array.add(obj); + } + } + return array; + } + //WHERE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //SET <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -728,7 +872,7 @@ public static String getContainString(String key, Object[] childs, int type) thr */ @JSONField(serialize = false) public String getSetString() throws Exception { - return getSetString(getMethod(), getContent()); + return getSetString(getMethod(), getContent(), ! isTest()); } /**获取SET * @param method @@ -736,7 +880,7 @@ public String getSetString() throws Exception { * @return * @throws Exception */ - public static String getSetString(RequestMethod method, Map content) throws Exception { + public static String getSetString(RequestMethod method, Map content, boolean verifyName) throws Exception { Set set = content == null ? null : content.keySet(); if (set != null && set.size() > 0) { String setString = ""; @@ -745,7 +889,7 @@ public static String getSetString(RequestMethod method, Map cont Object value; for (String key : set) { //避免筛选到全部 value = key == null ? null : content.get(key); - if (key == null || ID.equals(key)) { + if (key == null || KEY_ID.equals(key)) { continue; } @@ -755,7 +899,7 @@ public static String getSetString(RequestMethod method, Map cont keyType = 2; } value = content.get(key); - key = Parser.getRealKey(method, key, false, true); + key = getRealKey(method, key, false, true, verifyName); setString += (isFirst ? "" : ", ") + (key + "=" + (keyType == 1 ? getAddString(key, value) : (keyType == 2 ? getRemoveString(key, value) : "'" + value + "'") ) ); @@ -785,7 +929,7 @@ public static String getAddString(String key, Object value) throws IllegalArgume } throw new IllegalArgumentException(key + "+ 对应的值 " + value + " 不是Number,String,Array中的任何一种!"); } - /**SET key = REPLACE (key, 'value', '') + /**SET key = replace(key, 'value', '') * @param key * @param value * @return REPLACE (key, 'value', '') @@ -796,7 +940,7 @@ public static String getRemoveString(String key, Object value) throws IllegalArg return key + " - " + value; } if (value instanceof String) { - return " REPLACE (" + key + ", '" + value + "', '') "; + return SQL.replace(key, (String) value, "");// " replace(" + key + ", '" + value + "', '') "; } throw new IllegalArgumentException(key + "- 对应的值 " + value + " 不是Number,String,Array中的任何一种!"); } @@ -822,6 +966,7 @@ public static String getSQL(SQLConfig config) throws Exception { Log.i(TAG, "getSQL StringUtil.isNotEmpty(tablePath, true) == false >> return null;"); return null; } + switch (config.getMethod()) { case POST: return "INSERT INTO " + tablePath + config.getColumnString() + " VALUES" + config.getValuesString(); @@ -880,7 +1025,8 @@ private static String getConditionString(String column, String table, SQLConfig // //order: id+ -> id >= idOfStartIndex; id- -> id <= idOfStartIndex >>>>>>>>>>>>>>>>>> // // - // //结果错误!SELECT * FROM sys.User AS t0 INNER JOIN (SELECT id FROM sys.User ORDER BY date ASC LIMIT 20, 10) AS t1 ON t0.id = t1.id + // //结果错误!SELECT * FROM linking_member.mes_member_user_test AS t0 INNER JOIN + // (SELECT id FROM linking_member.mes_member_user_test ORDER BY date ASC LIMIT 20, 10) AS t1 ON t0.id = t1.id // //common case, inner join // condition += config.getLimitString(); // return table + " AS t0 INNER JOIN (SELECT id FROM " + condition + ") AS t1 ON t0.id = t1.id"; @@ -890,92 +1036,291 @@ private static String getConditionString(String column, String table, SQLConfig * @param table * @param request * @return + * @throws Exception */ - public static synchronized SQLConfig newQueryConfig(RequestMethod method, String table, JSONObject request) { + public static SQLConfig newSQLConfig(RequestMethod method, String table, JSONObject request) throws Exception { + if (request == null) { // User:{} 这种空内容在查询时也有效 + throw new NullPointerException(TAG + ": newSQLConfig request == null!"); + } SQLConfig config = new SQLConfig(method, table); - if (method == POST && request != null && request.get(ID) == null) { - request.put(ID, System.currentTimeMillis()); + boolean isEmpty = request.isEmpty(); + if (isEmpty) { // User:{} 这种空内容在查询时也有效 + return config; //request.remove(key); 前都可以直接return,之后必须保证 put 回去 } - Set set = request == null ? null : request.keySet(); - if (set != null) { - String role = request.getString(KEY_ROLE); - String schema = request.getString(KEY_SCHEMA); - String column = request.getString(KEY_COLUMN); - String group = request.getString(KEY_GROUP); - String having = request.getString(KEY_HAVING); - String order = request.getString(KEY_ORDER); - request.remove(KEY_ROLE); - request.remove(KEY_SCHEMA); - request.remove(KEY_COLUMN); - request.remove(KEY_GROUP); - request.remove(KEY_HAVING); - request.remove(KEY_ORDER); - - if (method == POST) { - config.setColumn(StringUtil.getString(set.toArray(new String[]{}))); - - String valuesString = ""; - Collection valueCollection = request.values(); - Object[] values = valueCollection == null || valueCollection.isEmpty() ? null : valueCollection.toArray(); - if (values != null) { - for (int i = 0; i < values.length; i++) { - valuesString += ((i > 0 ? "," : "") + "'" + values[i] + "'"); + + Object idIn = request.get(KEY_ID_IN); //可能是 id{}:">0" + + if (method == POST) { + if (idIn != null) { //不能在这里确定[]的长度,只能在外面传进来 + if ((idIn instanceof List == false) || ((List)idIn).isEmpty()) { // id{}:[] 表示同时插入多条记录 + throw new IllegalArgumentException("POST请求,生成多条记录请用 id{}:[] ! [] 类型为JSONArray且不能为空!"); + } + } else if (request.get(KEY_ID) == null) { + request.put(KEY_ID, System.currentTimeMillis()); + } + } + + //对id和id{}处理,这两个一定会作为条件 + Long id = request.getLong(KEY_ID); + if (id != null) { //null无效 + if (id <= 0) { //一定没有值 + throw new NotExistException(TAG + ": newSQLConfig " + table + ".id <= 0"); + } + + if (idIn != null && idIn instanceof List) { //共用idArr场景少性能差 + if (idIn != null && ((List) idIn).contains(id) == false) {//empty有效 BaseModel.isEmpty(idArr) == false) { + Log.w(TAG, "newSQLConfig id > 0 >> idInObj != null && idInObj.contains(id) == false >> return null;"); + throw new NotExistException(TAG + ": newSQLConfig idIn != null && ((JSONArray) idIn).contains(id) == false"); + } + } + } + + + String role = request.getString(KEY_ROLE); + String schema = request.getString(KEY_SCHEMA); + boolean about = request.getBooleanValue(KEY_ABOUT); + String condition = request.getString(KEY_CONDITION); + String column = request.getString(KEY_COLUMN); + String group = request.getString(KEY_GROUP); + String having = request.getString(KEY_HAVING); + String order = request.getString(KEY_ORDER); + + //强制作为条件且放在最前面优化性能 + request.remove(KEY_ID); + request.remove(KEY_ID_IN); + //关键词 + request.remove(KEY_ROLE); + request.remove(KEY_SCHEMA); + request.remove(KEY_ABOUT); + request.remove(KEY_CONDITION); + request.remove(KEY_COLUMN); + request.remove(KEY_GROUP); + request.remove(KEY_HAVING); + request.remove(KEY_ORDER); + + + Map tableWhere = new LinkedHashMap();//保证顺序好优化 WHERE id > 1 AND name LIKE... + if (about) { //查询字段属性 + if (RequestMethod.isQueryMethod(method) == false) { + throw new UnsupportedOperationException(config.getTable() + + " 被 " + KEY_ABOUT + " 标注,只能进行 GET,HEAD 等查询操作!"); + } + + tableWhere.put(TABLE_SCHEMA, SQLConfig.getSchema(schema)); + tableWhere.put(TABLE_NAME, config.getSQLTable()); + config.setTable(Column.class.getSimpleName()); + + schema = SCHEMA_INFORMATION; + + column = StringUtil.getString(column); + if (column.isEmpty() && RequestMethod.isHeadMethod(method, true) == false) { + column = "column_name,column_type,is_nullable,column_default,column_comment"; + } + } + + + //已经remove了id和id{},以及@key + Set set = request.keySet(); //前面已经判断request是否为空 + if (method == POST) {//POST操作 + if (BaseModel.isEmpty(set) == false) { //不能直接return,要走完下面的流程 + List idList; + if (id != null) { //单条记录 + if (idIn != null) { + throw new IllegalArgumentException("POST请求中 id 和 id{} 不能同时存在!"); } + + idList = new ArrayList(1); + idList.add(id); + } else { //多条记录 + idList = new ArrayList((JSONArray) idIn); } - config.setValues("(" + valuesString + ")"); - } else { - config.setColumn(column); - - final boolean isWhere = method != PUT;//除了POST,PUT,其它全是条件!!! - - Map tableContent = new HashMap(); - Map tableWhere = new HashMap(); - Object value; - for (String key : set) { - value = request.get(key); - if (value instanceof JSONObject == false) {//只允许常规Object - //解决AccessVerifier新增userId没有作为条件,而是作为内容,导致PUT,DELETE出错 - if (isWhere || ID.equals(key)) { - tableWhere.put(key, value); - } else { - tableContent.put(key, value);//一样 instanceof JSONArray ? JSON.toJSONString(value) : value); - } + + //idIn不为空时,valuesString有多条,唯一的区别就是id + String[] columns = set.toArray(new String[]{}); + + Collection valueCollection = request.values(); + Object[] values = valueCollection == null ? null : valueCollection.toArray(); + + if (values == null || values.length != columns.length) { + throw new Exception("服务器内部错误:\n" + TAG + + " newSQLConfig values == null || values.length != columns.length !"); + } + column = KEY_ID + "," + StringUtil.getString(columns); //set已经判断过不为空 + final int size = columns.length + 1; //以key数量为准 + + String[][] valuess = new String[idList.size()][]; // [idList.size()][] + String[] items; //(item0, item1, ...) + for (int i = 0; i < idList.size(); i++) { + items = new String[size]; + items[0] = "'" + idList.get(i) + "'"; //第0个就是id。所有的值都加 '' 避免SQL注入风险 + for (int j = 1; j < size; j++) { + items[j] = "'" + values[j-1] + "'"; //从第1个开始,允许"null" } + valuess[i] = items; + } + config.setValues(valuess); + } + } + else { //非POST操作 + final boolean isWhere = method != PUT;//除了POST,PUT,其它全是条件!!! + + //条件<<<<<<<<<<<<<<<<<<< + List conditionList = null; + if (isWhere == false) { //减少不必要的步骤 + if (method == PUT || method == DELETE) { + String[] conditions = StringUtil.split(condition); + //Arrays.asList()返回值不支持add方法! + conditionList = BaseModel.isEmpty(conditions) ? null : Arrays.asList(conditions); } + } + //条件>>>>>>>>>>>>>>>>>>> - config.setContent(tableContent); - config.setWhere(tableWhere); + //强制作为条件且放在最前面优化性能 + if (id != null) { + tableWhere.put(KEY_ID, id); + } + if (idIn != null) { + tableWhere.put(KEY_ID_IN, idIn); } - config.setRole(role); - config.setSchema(schema); - config.setGroup(group); - config.setHaving(having); - config.setOrder(order); + Map tableContent = new HashMap(); + Object value; + for (String key : set) { + value = request.get(key); + if (value instanceof JSONObject == false) {//只允许常规Object + //解决AccessVerifier新增userId没有作为条件,而是作为内容,导致PUT,DELETE出错 + if (isWhere || BaseModel.isContain(conditionList, key)) { + tableWhere.put(key, value); + } else { + tableContent.put(key, value);//一样 instanceof JSONArray ? JSON.toJSONString(value) : value); + } + } + } - //后面还可能用到,要还原 - request.put(KEY_ROLE, role); - request.put(KEY_SCHEMA, schema); - request.put(KEY_COLUMN, column); - request.put(KEY_GROUP, group); - request.put(KEY_HAVING, having); - request.put(KEY_ORDER, order); + config.setContent(tableContent); } - try { - config.setId(request.getLongValue(ID)); - } catch (Exception e) { - // empty - } + + config.setWhere(tableWhere); + + config.setId(BaseModel.value(id)); + //在 tableWhere 第0个 config.setIdIn(idIn); + + config.setRole(role); + //TODO condition组合,优先 | config.setCondition(condition); + config.setSchema(schema); + config.setAbout(about); + config.setColumn(column); + config.setGroup(group); + config.setHaving(having); + config.setOrder(order); + + //后面还可能用到,要还原 + //id或id{}条件 + request.put(KEY_ID, id); + request.put(KEY_ID_IN, idIn); + //关键词 + request.put(KEY_ROLE, role); + request.put(KEY_SCHEMA, schema); + request.put(KEY_ABOUT, about); + request.put(KEY_CONDITION, condition); + request.put(KEY_COLUMN, column); + request.put(KEY_GROUP, group); + request.put(KEY_HAVING, having); + request.put(KEY_ORDER, order); + + return config; } - // 导致getSetString,未设置id错误 - // @Override - // public String toString() { - // return JSON.toJSONString(this); - // } + + /**获取客户端实际需要的key + * verifyName = true + * @param method + * @param originKey + * @param isTableKey + * @param saveLogic 保留逻辑运算符 & | ! + * @return + */ + public static String getRealKey(RequestMethod method, String originKey + , boolean isTableKey, boolean saveLogic) throws Exception { + return getRealKey(method, originKey, isTableKey, saveLogic, true); + } + /**获取客户端实际需要的key + * @param method + * @param originKey + * @param isTableKey + * @param saveLogic 保留逻辑运算符 & | ! + * @param verifyName 验证key名是否符合代码变量/常量名 + * @return + */ + public static String getRealKey(RequestMethod method, String originKey + , boolean isTableKey, boolean saveLogic, boolean verifyName) throws Exception { + Log.i(TAG, "getRealKey saveLogic = " + saveLogic + "; originKey = " + originKey); + if (originKey == null || originKey.startsWith("`") || zuo.biao.apijson.JSONObject.isArrayKey(originKey)) { + Log.w(TAG, "getRealKey originKey == null || originKey.startsWith(`)" + + " || zuo.biao.apijson.JSONObject.isArrayKey(originKey) >> return originKey;"); + return originKey; + } + + String key = new String(originKey); + if (key.endsWith("$")) {//搜索,查询时处理 + key = key.substring(0, key.length() - 1); + } + else if (key.endsWith("?")) {//匹配正则表达式,查询时处理 + key = key.substring(0, key.length() - 1); + } + else if (key.endsWith("{}")) {//被包含,或者说key对应值处于value的范围内。查询时处理 + key = key.substring(0, key.length() - 2); + } + else if (key.endsWith("<>")) {//包含,或者说value处于key对应值的范围内。查询时处理 + key = key.substring(0, key.length() - 2); + } + else if (key.endsWith("()")) {//方法,查询完后处理,先用一个Map保存? + key = key.substring(0, key.length() - 2); + } + else if (key.endsWith("@")) {//引用,引用对象查询完后处理。fillTarget中暂时不用处理,因为非GET请求都是由给定的id确定,不需要引用 + key = key.substring(0, key.length() - 1); + } + else if (key.endsWith("+")) {//延长,PUT查询时处理 + if (method == PUT) {//不为PUT就抛异常 + key = key.substring(0, key.length() - 1); + } + } + else if (key.endsWith("-")) {//缩减,PUT查询时处理 + if (method == PUT) {//不为PUT就抛异常 + key = key.substring(0, key.length() - 1); + } + } + + String last = null;//不用Logic优化代码,否则 key 可能变为 key| 导致 key=value 变成 key|=value 而出错 + if (RequestMethod.isQueryMethod(method)) {//逻辑运算符仅供GET,HEAD方法使用 + last = key.isEmpty() ? "" : key.substring(key.length() - 1); + if ("&".equals(last) || "|".equals(last) || "!".equals(last)) { + key = key.substring(0, key.length() - 1); + } else { + last = null;//避免key + StringUtil.getString(last)错误延长 + } + } + + //"User:toUser":User转换"toUser":User, User为查询同名Table得到的JSONObject。交给客户端处理更好 + if (isTableKey) {//不允许在column key中使用Type:key形式 + key = Pair.parseEntry(key, true).getKey();//table以左边为准 + } else { + key = Pair.parseEntry(key).getValue();//column以右边为准 + } + + if (verifyName && StringUtil.isName(key.startsWith("@") ? key.substring(1) : key) == false) { + throw new IllegalArgumentException(TAG + "/" + method + " getRealKey: 字符 " + originKey + " 不合法!"); + } + + if (saveLogic && last != null) { + key = key + last; + } + Log.i(TAG, "getRealKey return key = " + key); + return key; + } } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java similarity index 69% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java index e5a5fa5c4..f77179d49 100755 --- a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/SQLExecutor.java @@ -15,14 +15,13 @@ package zuo.biao.apijson.server.sql; import java.sql.Connection; -import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; +import java.sql.Timestamp; import java.util.HashMap; -import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; @@ -31,7 +30,6 @@ import zuo.biao.apijson.JSONResponse; import zuo.biao.apijson.Log; import zuo.biao.apijson.StringUtil; -import zuo.biao.apijson.server.Pair; import zuo.biao.apijson.server.Parser; /**executor for query(read) or update(write) MySQL database @@ -65,7 +63,8 @@ public class SQLExecutor { */ private synchronized Connection getConnection() throws Exception { Log.i(TAG, "成功加载MySQL驱动!"); - return DriverManager.getConnection(SQLConfig.MYSQL_URI, SQLConfig.MYSQL_ACCOUNT, SQLConfig.MYSQL_PASSWORD); + return DriverManager.getConnection(SQLConfig.MYSQL_URI + "?useUnicode=true&characterEncoding=UTF-8&user=" + + SQLConfig.MYSQL_ACCOUNT + "&password=" + SQLConfig.MYSQL_PASSWORD); } /**保存缓存 @@ -118,7 +117,6 @@ public JSONObject getFromCache(String sql, int position, boolean isStatic) { private Connection connection; private Statement statement; - private DatabaseMetaData metaData; /**关闭连接,释放资源 */ public void close() { @@ -133,7 +131,6 @@ public void close() { } catch (SQLException e) { e.printStackTrace(); } - metaData = null; statement = null; cacheMap = null; } @@ -162,13 +159,12 @@ public JSONObject execute(SQLConfig config) throws Exception { Log.i(TAG, "select connection " + (connection == null ? " = null" : ("isClosed = " + connection.isClosed()))) ; connection = getConnection(); statement = connection.createStatement(); //创建Statement对象 - metaData = connection.getMetaData(); } Log.i(TAG, "成功连接到数据库!"); ResultSet rs = null; switch (config.getMethod()) { case HEAD: - case POST_HEAD: + case HEADS: rs = statement.executeQuery(sql); result = rs.next() ? Parser.newSuccessResult() @@ -183,13 +179,20 @@ public JSONObject execute(SQLConfig config) throws Exception { case DELETE: long updateCount = statement.executeUpdate(sql); - result = Parser.newResult(updateCount > 0 ? 200 : 404 - , updateCount > 0 ? "success" : "可能对象不存在!"); - result.put(JSONResponse.KEY_ID, config.getId());//id一定有,一定会返回,不用抛异常来阻止关联写时前面错误导致后面无条件执行! + result = Parser.newResult(updateCount > 0 ? JSONResponse.CODE_SUCCESS : JSONResponse.CODE_NOT_FOUND + , updateCount > 0 ? JSONResponse.MSG_SUCCEED : "可能对象不存在!"); + + //id或id{}一定有,一定会返回,不用抛异常来阻止关联写操作时前面错误导致后面无条件执行! + if (config.getId() > 0) { + result.put(JSONResponse.KEY_ID, config.getId()); + } else { + result.put(JSONResponse.KEY_ID_IN, config.getWhere(JSONResponse.KEY_ID_IN, true)); + } + result.put(JSONResponse.KEY_COUNT, updateCount);//返回修改的记录数 return result; case GET: - case POST_GET: + case GETS: break; default://OPTIONS, TRACE等 @@ -206,11 +209,6 @@ public JSONObject execute(SQLConfig config) throws Exception { return result; } - String[] columnArray = getColumnArray(config); - if (columnArray == null || columnArray.length <= 0) { - return null; - } - rs = statement.executeQuery(sql); // final boolean cache = config.getCount() != 1; @@ -218,45 +216,43 @@ public JSONObject execute(SQLConfig config) throws Exception { // Log.d(TAG, "select cache = " + cache + "; resultMap" + (resultMap == null ? "=" : "!=") + "null"); int index = -1; + + ResultSetMetaData rsmd = rs.getMetaData(); + final int length = rsmd.getColumnCount(); + while (rs.next()){ index ++; Log.d(TAG, "\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n select while (rs.next()){ index = " + index + "\n\n"); result = new JSONObject(true); Object value; - Object json; - for (int i = 0; i < columnArray.length; i++) { - if (columnArray[i] == null || columnArray[i].isEmpty() || columnArray[i].startsWith("_")) { + + for (int i = 1; i <= length; i++) { + if (rsmd.getColumnName(i).startsWith("_")) { Log.i(TAG, "select while (rs.next()){ ..." - + " >> columnArray[i] == " + columnArray[i] - + " >> continue;"); + + " >> rsmd.getColumnName(i).startsWith(_) >> continue;"); continue; - }//允许 key:_alias, 但不允许_key, _key:alias - columnArray[i] = Pair.parseEntry(columnArray[i]).getValue(); - try { - value = rs.getObject(rs.findColumn(columnArray[i])); - } catch (Exception e) { - value = null; - Log.i(TAG, "select while (rs.next()){ ..." - + " >> try { value = rs.getObject(rs.findColumn(columnArray[i])); ..." - + " >> } catch (Exception e) {"); - e.printStackTrace(); } - // Log.i(TAG, "select while (rs.next()) { >> for (int i = 0; i < columnArray.length; i++) {" - // + "\n >>> columnArray[i]) = " + columnArray[i] + "; value = " + value); - if (value != null && value instanceof String) { - try { - json = JSON.parse((String) value); - if (json != null && StringUtil.isNotEmpty(json, true)) { - value = json; - } - } catch (Exception e) { - //太长 Log.i(TAG, "select while (rs.next()){ >> i = " - // + i + " try { json = JSON.parse((String) value);" - // + ">> } catch (Exception e) {\n" + e.getMessage()); + + value = rs.getObject(i); + // Log.d(TAG, "name:" + rsmd.getColumnName(i)); + // Log.d(TAG, "lable:" + rsmd.getColumnLabel(i)); + // Log.d(TAG, "type:" + rsmd.getColumnType(i)); + // Log.d(TAG, "typeName:" + rsmd.getColumnTypeName(i)); + + // Log.i(TAG, "select while (rs.next()) { >> for (int i = 0; i < length; i++) {" + // + "\n >>> value = " + value); + + if (value != null) { //数据库查出来的null和empty值都有意义,去掉会导致 Moment:{ @column:"content" } 部分无结果及中断数组查询! + if (value instanceof Timestamp) { + value = ((Timestamp) value).toString(); + } + else if (value instanceof String && isJSONType(rsmd, i)) { //json String + value = JSON.parse((String) value); } } - result.put(columnArray[i], value); + + result.put(rsmd.getColumnLabel(i), value); } resultMap.put(index, result); @@ -275,31 +271,19 @@ public JSONObject execute(SQLConfig config) throws Exception { return resultMap.get(position); } - - /**获取要查询的字段名数组 - * @param config + /**判断是否为JSON类型 + * @param rsmd + * @param position * @return - * @throws SQLException */ - private String[] getColumnArray(SQLConfig config) throws SQLException { - if (config == null) { - return null; - } - String column = config.getColumn(); - if (StringUtil.isNotEmpty(column, true)) { - return StringUtil.split(column);//column.contains(",") ? column.split(",") : new String[]{column}; - } - - List list = new ArrayList(); - String table = config.getSQLTable(); - ResultSet rs = metaData.getColumns(config.getSchema(), null, table, "%"); - while (rs.next()) { - Log.i(TAG, rs.getString(4)); - list.add(rs.getString(4)); + private boolean isJSONType(ResultSetMetaData rsmd, int position) { + try { + return rsmd.getColumnType(position) == 1 || rsmd.getColumnTypeName(position).toLowerCase().contains("json"); + } catch (SQLException e) { + e.printStackTrace(); } - rs.close(); - - return list.toArray(new String[]{}); + return false; } + } diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/package-info.java b/APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/package-info.java similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/java/zuo/biao/apijson/server/sql/package-info.java rename to APIJSON-Java-Server/APIJSON-Idea/src/main/java/zuo/biao/apijson/server/sql/package-info.java diff --git a/APIJSON(Server)/APIJSON(Idea)/src/main/resources/application.properties b/APIJSON-Java-Server/APIJSON-Idea/src/main/resources/application.properties similarity index 100% rename from APIJSON(Server)/APIJSON(Idea)/src/main/resources/application.properties rename to APIJSON-Java-Server/APIJSON-Idea/src/main/resources/application.properties diff --git a/APIJSON(Server)/APIJSON(Idea)/src/test/java/zuo/biao/apijson/server/ApplicationTests.java b/APIJSON-Java-Server/APIJSON-Idea/src/test/java/zuo/biao/apijson/server/ApplicationTests.java similarity index 84% rename from APIJSON(Server)/APIJSON(Idea)/src/test/java/zuo/biao/apijson/server/ApplicationTests.java rename to APIJSON-Java-Server/APIJSON-Idea/src/test/java/zuo/biao/apijson/server/ApplicationTests.java index 54df56813..6dcfe9e64 100755 --- a/APIJSON(Server)/APIJSON(Idea)/src/test/java/zuo/biao/apijson/server/ApplicationTests.java +++ b/APIJSON-Java-Server/APIJSON-Idea/src/test/java/zuo/biao/apijson/server/ApplicationTests.java @@ -11,6 +11,7 @@ public class ApplicationTests { @Test public void contextLoads() { + //TODO Test Case,包括GitHub README介绍和简版demo } } diff --git a/APIJSON-JavaScript/.idea/Demo.iml b/APIJSON-JavaScript/.idea/Demo.iml deleted file mode 100644 index 24643cc37..000000000 --- a/APIJSON-JavaScript/.idea/Demo.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON-JavaScript/.idea/modules.xml b/APIJSON-JavaScript/.idea/modules.xml deleted file mode 100644 index dc59b4c77..000000000 --- a/APIJSON-JavaScript/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/APIJSON-JavaScript/.idea/workspace.xml b/APIJSON-JavaScript/.idea/workspace.xml deleted file mode 100644 index 09e92b80c..000000000 --- a/APIJSON-JavaScript/.idea/workspace.xml +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - project - - - - - - - - - - - - - - - - project - - - true - - - - DIRECTORY - - false - - - - - - - - - 1494182410682 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/APIJSON-JavaScript/RequestUtil.js b/APIJSON-JavaScript/RequestUtil.js new file mode 100644 index 000000000..0a707b118 --- /dev/null +++ b/APIJSON-JavaScript/RequestUtil.js @@ -0,0 +1,399 @@ +/** + * Created by Lemon on 17/5/8. + */ +const TAG_REQUEST_UTIL = 'RequestUtil'; + +const URL_BASE = "http://39.108.143.172:8080"; // 基地址 +const URL_GET = URL_BASE + "/get"; // 常规获取数据方式 +const URL_HEAD = URL_BASE + "/head"; // 检查,默认是非空检查,返回数据总数 +const URL_GETS = URL_BASE + "/gets"; // 通过POST来GET数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 +const URL_HEADS = URL_BASE + "/heads"; // 通过POST来HEAD数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 +const URL_POST = URL_BASE + "/post"; // 新增(或者说插入)数据 +const URL_PUT = URL_BASE + "/put"; // 修改数据,只修改传入字段对应的值 +const URL_DELETE = URL_BASE + "/delete"; // 删除数据 + + +/**请求,全走HTTP POST + * @param url + * @param rq + */ +function request(url, json, notAlertRequest, onreadystatechange) { + if (json == null || json instanceof Array || (json instanceof Object) == false) { + alertOfDebug("request json == null || json instanceof Array || (json instanceof Object) == false !!! >> return null;"); + return null; + } + + if (url == null || (typeof url != "string")) { + alertOfDebug("request url == null || typeof url != string !!! >> return null;"); + return null; + } + if (url.length < 3 || url.indexOf(".") < 0) { + alertOfDebug("request url.length < 3 || url.indexOf(.) < 0 !!! >> return null;"); + return null; + } + + + var rqf = format(JSON.stringify(json)); + + var branch = url.substring(URL_BASE.length + 1, url.length); + var end = branch.indexOf("/"); + var method = branch.substring(0, end < 0 ? branch.length : end); + + var METHOD = method.toUpperCase(); + + if (! notAlertRequest) { + alert("Request(" + METHOD + "):\n" + rqf); + } + + var request = new XMLHttpRequest(); + request.open("POST", url, true); + request.setRequestHeader("Content-type", "application/json"); + + request.onreadystatechange = onreadystatechange != null ? onreadystatechange : function () { + if (request.readyState !== 4) { + return; + } + + if (request.status === 200) { + alert("Response(" + METHOD + "):\n" + format(request.responseText)); + } else { + alert("Response(" + METHOD + "):\nstatus" + request.status + "\nerror:" + request.error); + } + } + + request.send(rqf); + //原生请求>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //JQuery ajax请求<<<<<<<<<<<<<<<<<<<<<<<<<< + // $.ajax({ + // type: isGet ? "GET" : "POST", + // url: isGet ? url + "/" + rq : url, + // contentType: "application/json", //必须 + // dataType: "json", //返回值类型,非必须 + // data: isGet ? null : rq, + // success: function (response) { + // alertOfDebug(response); + // } + // }); + //JQuery ajax请求>>>>>>>>>>>>>>>>>>>>>>>>>> + + + //VUE axios请求<<<<<<<<<<<<<<<<<<<<<<<<<< + // if (isGet) { + // axios.get(url + "/" + rq, null) + // .then(function (response) { + // console.log(response); + // }) + // .catch(function (error) { + // console.log(error); + // }); + // } else { + // axios({ + // method: 'post', + // url: url + "/", + // data: json + // }).then(function (response) { + // alertOfDebug(response); + // }).catch(function (error) { + // alertOfDebug(error); + // }); + // } + //VUE axios请求>>>>>>>>>>>>>>>>>>>>>>>>>> + + return request; +} + +/**编码JSON,转义所有String + * @param json 任意类型 + */ +function encode(json) { + // alertOfDebug("encode before:\n" + format(JSON.stringify(json))); + + if (typeof json == "string") { //json instanceof String) { + json = encodeURIComponent(json); + } + else if (json instanceof Array) { + // alertOfDebug("encode json instanceof Array"); + + for (var i = 0; i < json.length; i ++) { + // alertOfDebug("json[" + i + "] = " + format(JSON.stringify(json[i]))); + json[i] = encode(json[i]); + } + } + else if (json instanceof Object) { + // alertOfDebug("encode json instanceof Object"); + for (var key in json) { + // alertOfDebug("encode json[" + key + "] = " + format(JSON.stringify(json[key]))); + json[key] = encode(json[key]); + } + } + // alertOfDebug("encode after:\n" + format(JSON.stringify(json))); + + return json; +} + + +/**格式化JSON串 + * @param json + */ +function format(json) { + try { + return JSON.stringify(JSON.parse(json), null, "\t"); + } catch(e) { + log(TAG_REQUEST_UTIL, 'format try { ... } catch (err) { \n ' + e); + return json; + } + + // 导致格式化后代码很难看,像没格式化一样 + // if (json == null || json == '') { + // console.log('format json == null || json == "" >> return json;'); + // return json; + // } + // + // if (json instanceof Object) { //避免赋值影响传进来的json + // return JSON.stringify(json, null, "\t"); + // } + // + // var jsonObj; + // if (typeof json == 'string'){ + // try { + // jsonObj = JSON.parse(json); + // } catch (err) { + // console.log('format try { jsonObj = JSON.parse(json); } catch (err) { \n ' + err); + // return json; + // } + // } + // else { + // console.log('format json type error !'); + // return json; + // } + // return JSON.stringify(jsonObj, null, "\t"); +} + +function log(tag, msg) { + console.log(tag + '.' + msg); +} + +/**将json字符串转为JSON对象 + * @param s + */ +function parseJSON(s) { + if (s instanceof Object) { + alertOfDebug("parseJSON s instanceof JSON >> return s;"); + return s; + } + + if (typeof s != "string") { + alertOfDebug("parseJSON typeof json != string >> s = \"\" + s;"); + s = "" + s; + } + // alertOfDebug("parseJSON s = \n" + s); + + return JSON.parse(s); +} + +/**测试用的提示 + * @param s + */ +function alertOfDebug(s) { + // alert(s); //注释掉就都不会弹窗了 +} + +/**是否为空 + * @param s + * @returns {boolean} + */ +function isEmpty(s) { + return s == null || s.trim() == ''; +} + + + + + +//常用请求<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +/**获取单个对象 + * @param table String, 对象名,如 "User" + * @param id Long, 对象id,如 1 + * @param notAlert 不弹窗显示 + * @param callBack 请求成功回调 + */ +function getObject(table, id, notAlert, callBack) { + alertOfDebug("getObject table = " + table + "; id = " + id); + + return request(URL_GET, newSingleJSON(table, { "id": id }, null), notAlert, callBack); +} + +/**获取数组 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param count int, 每页数量 + * @param page int, 页码 + * @param notAlert 不弹窗显示 + * @param callBack 请求成功回调 + */ +function getArray(table, json, count, page, notAlert, callBack) { + alertOfDebug("getArray table = " + table + "; count = " + count + "; page = " + page + + "; json = \n" + format(json)); + + return request(URL_GET, newArrayJSON(table, json, count, page), notAlert, callBack); +} + +/**新增单个对象 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param notAlert 不弹窗显示 + * @param callBack 请求成功回调 + */ +function postObject(table, json, notAlert, callBack) { + alertOfDebug("postObject table = " + table + + "; json = \n" + format(json)); + var id = json == null ? null : json['id']; + if (id != null) { + alertOfDebug('postObject POST 请求不能设置 id !'); + return; + } + + return request(URL_POST, newSingleJSON(table, json, table), notAlert, callBack); +} +/**修改单个对象 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param notAlert 不弹窗显示 + * @param callBack 请求成功回调 + */ +function putObject(table, json, notAlert, callBack) { + alertOfDebug("putObject table = " + table + + "; json = \n" + format(json)); + if (json == null) { + alertOfDebug('putObject PUT 请求必须设置 table对象 !'); + return; + } + if (json["id"] == null || json["id"] <= 0) { + alertOfDebug('putObject PUT 请求必须设置 id 且 id > 0 !'); + return; + } + + return request(URL_PUT, newSingleJSON(table, json, table), notAlert, callBack); +} +/**删除单个对象 + * @param table String, 对象名,如 "User" + * @param id Long, 对象id,如 1 + * @param notAlert 不弹窗显示 + * @param callBack 请求成功回调 + */ +function deleteObject(table, id, notAlert, callBack) { + alertOfDebug("deleteObject table = " + table + "; id = " + id); + if (id == null || id <= 0) { + alertOfDebug('deleteObject DELETE 请求必须设置 id 且 id > 0 !'); + return; + } + + return request(URL_DELETE, newSingleJSON(table, { "id": id }, table), notAlert, callBack); +} + +/**修改多个对象 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param notAlert 不弹窗显示 + * @param callBack 请求成功回调 + */ +function putArray(table, json, notAlert, callBack) { + alertOfDebug("putArray table = " + table + + "; json = \n" + format(json)); + var idArray = json == null ? null : json["id{}"]; + if (idArray == null || (idArray instanceof Array) == false) { + alertOfDebug('putArray idArray == null || (idArray instanceof Array) == false' + + ' >> return; PUT 请求必须设置 id{}:[] !'); + return; + } + + return request(URL_PUT, newSingleJSON(table, json, table + "[]"), notAlert, callBack); +} +/**删除多个对象 + * @param table String, 对象名,如 "User" + * @param idArray [], 对象id数组,如 [1, 2, 3] + * @param notAlert 不弹窗显示 + * @param callBack 请求成功回调 + */ +function deleteArray(table, idArray, notAlert, callBack) { + alertOfDebug("deleteArray table = " + table + + "; idArray = \n" + format(idArray)); + if (idArray == null || (idArray instanceof Array) == false) { + alertOfDebug('deleteArray idArray == null ! DELETE 请求必须设置 id{}:[] !'); + return; + } + + return request(URL_DELETE, newSingleJSON(table, { "id{}": idArray }, table + "[]"), notAlert, callBack); +} + + + +/**新建单个对象请求 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param tag String, 写操作标识,一般来说,操作单个对象时和table相同,操作多个对象时是 table[] + */ +function newSingleJSON(table, json, tag) { + // alertOfDebug("newSingleJSON table = " + table + "; tag = " + tag + // + "; json = \n" + format(json)); + + return parseJSON(newSingleString(table, json, tag)); +} +/**新建数组请求 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param count int, 每页数量 + * @param page int, 页码 + */ +function newArrayJSON(table, json, count, page) { + // alertOfDebug("newArrayJSON table = " + table + "; count = " + count + "; page = " + page + // + "; json = \n" + format(json)); + + return parseJSON(newArrayString(table, json, count, page)); +} + + +/**新建单个对象请求 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param tag String, 写操作标识,一般来说,操作单个对象时和table相同,操作多个对象时是 table[] + */ +function newSingleString(table, json, tag) { + if (json == null) { + alertOfDebug('newSingleString json == null >> return;'); + return; + } + // alertOfDebug("newSingleString table = " + table + "; tag = " + tag + // + "; json = \n" + format(json)); + + return "{\"" + + table + "\":" + + JSON.stringify(json) + + (isEmpty(tag) ? "" : ",\"tag\":\"" + tag + "\"") + + "}"; +} +/**新建数组请求 + * @param table String, 对象名,如 "User" + * @param json {}, 对象内容,如 {"sex":1} + * @param count int, 每页数量 + * @param page int, 页码 + */ +function newArrayString(table, json, count, page) { + if (json == null) { + alertOfDebug('newArrayString json == null >> return;'); + return; + } + // alertOfDebug("newArrayString table = " + table + "; count = " + count + "; page = " + page + // + "; json = \n" + format(json)); + + return "{\"" + table + "[]\":{" + "\"count\":" + count + "," + "\"page\":" + page + ",\"" + + table + "\":" + JSON.stringify(json) + "}}"; +} + + +//常用请求>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> \ No newline at end of file diff --git a/APIJSON-JavaScript/ResponseUtil.js b/APIJSON-JavaScript/ResponseUtil.js new file mode 100644 index 000000000..35771aa47 --- /dev/null +++ b/APIJSON-JavaScript/ResponseUtil.js @@ -0,0 +1,172 @@ +/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ + +/**parser for response + * @author Lemon + * @see #getObject + * @see #getList + * @use JSONResponse response = new JSONResponse(json); + *
User user = response.getObject(User.class);//not a must + *
List commentList = response.getList("Comment[]", Comment.class);//not a must + */ + + +//状态信息,非GET请求获得的信息<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +const CODE_SUCCESS = 200; //成功 +const CODE_UNSUPPORTED_ENCODING = 400; //编码错误 +const CODE_ILLEGAL_ACCESS = 401; //权限错误 +const CODE_UNSUPPORTED_OPERATION = 403; //禁止操作 +const CODE_NOT_FOUND = 404; //未找到 +const CODE_ILLEGAL_ARGUMENT = 406; //参数错误 +const CODE_NOT_LOGGED_IN = 407; //未登录 +const CODE_TIME_OUT = 408; //超时 +const CODE_CONFLICT = 409; //重复,已存在 +const CODE_CONDITION_ERROR = 412; //条件错误,如密码错误 +const CODE_UNSUPPORTED_TYPE = 415; //类型错误 +const CODE_OUT_OF_RANGE = 416; //超出范围 +const CODE_NULL_POINTER = 417; //对象为空 +const CODE_SERVER_ERROR = 500; //服务器内部错误 + + +const MSG_SUCCEED = "success"; //成功 +const MSG_SERVER_ERROR = "Internal Server Error!"; //服务器内部错误 + + +const KEY_CODE = "code"; +const KEY_MSG = "msg"; +const KEY_ID = "id"; +const KEY_ID_IN = KEY_ID + "{}"; +const KEY_COUNT = "count"; +const KEY_TOTAL = "total"; + + + +/**是否成功 + * @param code + * @return + */ +function isSuccess(code) { + return code == CODE_SUCCESS; +} + +/**校验服务端是否存在table + * @param count + * @return + */ +function isExist(count) { + return count > 0; +} + +//状态信息,非GET请求获得的信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + + + +/**格式化key名称 + * @param object + * @return + */ +function formatObject(object) { + //太长查看不方便,不如debug log(TAG, "format object = \n" + JSON.toJSONString(object)); + if (object == null || object == '') { + log(TAG, "format object == null || object == '' >> return object;"); + return object; + } + let formattedObject = {}; + + let value; + for (let key in object) { + value = object[key]; + + if (value instanceof Array) { // JSONArray,遍历来format内部项 + formattedObject[replaceArray(key)] = formatArray(value); + } + else if (value instanceof Object) { // JSONObject,往下一级提取 + formattedObject[getSimpleName(key)] = formatObject(value); + } + else { // 其它Object,直接填充 + formattedObject[getSimpleName(key)] = value; + } + } + + //太长查看不方便,不如debug log(TAG, "format return formattedObject = " + JSON.toJSONString(formattedObject)); + return formattedObject; +} + +/**格式化key名称 + * @param array + * @return + */ +function formatArray(array) { + //太长查看不方便,不如debug log(TAG, "format array = \n" + JSON.toJSONString(array)); + if (array == null || array == '') { + log(TAG, "format array == null || array == '' >> return array;"); + return array; + } + let formattedArray = []; + + let value; + for (let i = 0; i < array.length; i++) { + value = array[i]; + if (value instanceof Array) { // JSONArray,遍历来format内部项 + formattedArray.push(formatArray(value)); + } + else if (value instanceof Object) { // JSONObject,往下一级提取 + formattedArray.push(formatObject(value)); + } + else { // 其它Object,直接填充 + formattedArray.push(value); + } + } + + //太长查看不方便,不如debug log(TAG, "format return formattedArray = " + JSON.toJSONString(formattedArray)); + return formattedArray; +} + +/**替换key+KEY_ARRAY为keyList + * @param key + * @return getSimpleName(isArrayKey(key) ? getArrayKey(...) : key) {@link #getSimpleName(String)} + */ +function replaceArray(key) { + if (isArrayKey(key)) { + key = getArrayKey(key.substring(0, key.lastIndexOf('[]'))); + } + return getSimpleName(key); +} +/**获取列表变量名 + * @param key => getNoBlankString(key) + * @return empty ? "list" : key + "List" 且首字母小写 + */ +function getArrayKey(key) { + return addSuffix(key, "list"); +} + +/**获取简单名称 + * @param fullName name 或 name:alias + * @return name => name; name:alias => alias + */ +function getSimpleName(fullName) { + //key:alias -> alias; key:alias[] -> alias[] + let index = fullName == null ? -1 : fullName.indexOf(":"); + if (index >= 0) { + fullName = fullName.substring(index + 1); + } + return fullName; +} + + diff --git a/APIJSON-JavaScript/StringUtil.js b/APIJSON-JavaScript/StringUtil.js new file mode 100644 index 000000000..374209bcc --- /dev/null +++ b/APIJSON-JavaScript/StringUtil.js @@ -0,0 +1,92 @@ +/**获取string,为null则返回'' + * @param s + * @return + */ +function getString(s) { + return s == null ? '' : s; +} + +/**获取去掉前后空格后的string,为null则返回'' + * @param s + * @return + */ +function getTrimmedString(s) { + return this.getString(s).trim(); +} + +/**获取去掉所有空格后的string,为null则返回'' + * @param s + * @return + */ +function getNoBlankString(s) { + return this.getString(s).replace('\\s', ''); +} + +/**判断字符是否为空 + * @param s + * @param trim + * @return + */ +function isEmpty(s, trim) { + if (s == null) { + return true; + } + if (trim) { + s = s.trim(); + } + if (s == '') { + return true; + } + + return false; +} + + +/**添加后缀 + * @param key + * @param suffix + * @return key + suffix,第一个字母小写 + */ +function addSuffix(key, suffix) { + key = this.getNoBlankString(key); + if (key == '') { + return this.firstCase(suffix); + } + return this.firstCase(key) + this.firstCase(suffix, true); +} +/**首字母大写或小写 + * @param key + * @param upper + * @return + */ +function firstCase(key, upper) { + key = this.getString(key); + if (key == '') { + return ''; + } + + const first = key.substring(0, 1); + key = (upper ? first.toUpperCase() : first.toLowerCase()) + key.substring(1, key.length); + + return key; +} + +/**全部大写 + * @param s + * @param trim + * @return + */ +function toUpperCase(s, trim) { + s = trim ? this.getTrimmedString(s) : this.getString(s); + return s.toUpperCase(); +} +/**全部小写 + * @param s + * @return + */ +function toLowerCase(s, trim) { + s = trim ? this.getTrimmedString(s) : this.getString(s); + return s.toLowerCase(); +} + +//校正(自动补全等)字符串>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> \ No newline at end of file diff --git a/APIJSON-JavaScript/access_error.html b/APIJSON-JavaScript/access_error.html index 14692b6d8..d616d77c5 100755 --- a/APIJSON-JavaScript/access_error.html +++ b/APIJSON-JavaScript/access_error.html @@ -1,20 +1,19 @@ + Access Error - + diff --git a/APIJSON-JavaScript/access_permitted.html b/APIJSON-JavaScript/access_permitted.html index 442222834..cfa99c91f 100644 --- a/APIJSON-JavaScript/access_permitted.html +++ b/APIJSON-JavaScript/access_permitted.html @@ -1,22 +1,20 @@ + Access Permitted - + diff --git a/APIJSON-JavaScript/apijson.js b/APIJSON-JavaScript/apijson.js deleted file mode 100644 index df4bea642..000000000 --- a/APIJSON-JavaScript/apijson.js +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Created by Lemon on 17/5/8. - */ - -var url_base = "http://139.196.140.118:8080"; -var url_get = url_base + "/get"; -var url_head = url_base + "/head"; -var url_post_get = url_base + "/post_get"; -var url_post_head = url_base + "/post_head"; -var url_post = url_base + "/post"; -var url_put = url_base + "/put"; -var url_delete = url_base + "/delete"; - - -/**包含 - * @param obj - * @returns {boolean} - */ -Array.prototype.contains = function (obj) { - for (var i = 0; i < this.length; i ++) { - if (this[i] === obj) { - return true; - } - } - return false; -} - -/**请求方法 - * @type {Array} - */ -var Method = new Array( - - /** - * 常规获取数据方式 - */ - "get", - - /** - * 检查,默认是非空检查,返回数据总数 - */ - "head", - - /** - * 通过POST来GET数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 - */ - "post_get", - - /** - * 通过POST来HEAD数据,不显示请求内容和返回结果,一般用于对安全要求比较高的请求 - */ - "post_head", - - /** - * 新增(或者说插入)数据 - */ - "post", - - /** - * 修改数据,只修改传入字段对应的值 - */ - "put", - - /** - * 删除数据 - */ - "delete" -) - - - -/**请求 - * @param url - * @param rq - */ -function request(url, json, notAlertRequest, onreadystatechange) { - var rqf = format(JSON.stringify(json)); - - var rq = encodeURI(JSON.stringify(encode(json))); // JSON.stringify(encode(json)); // - - - var method = url.substring(url.lastIndexOf("/") + 1, url.length); - // alert("method=" + method); - if (method == null || Method.contains(method) == false) { - alert("method is empty! url must endsWith \"/[method]\" !"); - return; - } - var isGet = method === Method[0] || method === Method[1]; - // alert("isGet=" + isGet); - - var METHOD = method.toUpperCase(); - - if (! notAlertRequest) { - alert("Request(" + METHOD + "):\n" + rqf); - } - - - //原生请求<<<<<<<<<<<<<<<<<<<<<<<<<< - var request = new XMLHttpRequest(); - request.open(isGet ? "GET" : "POST", url + (isGet ? "/" + rq : ""), true); - if (isGet == false) { - request.setRequestHeader("Content-type", "application/json"); - } - request.onreadystatechange = onreadystatechange != null ? onreadystatechange : function () { - if (request.readyState !== 4) { - return; - } - - if (request.status === 200) { - alert("Response(" + METHOD + "):\n" + format(request.responseText)); - } else { - alert("Response(" + METHOD + "):\nstatus" + request.status + "\nerror:" + request.error); - } - } - - request.send(isGet ? null : rq); - //原生请求>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //JQuery ajax请求<<<<<<<<<<<<<<<<<<<<<<<<<< - // $.ajax({ - // type: isGet ? "GET" : "POST", - // url: isGet ? url + "/" + rq : url, - // contentType: "application/json", //必须 - // dataType: "json", //返回值类型,非必须 - // data: isGet ? null : rq, - // success: function (response) { - // alert(response); - // } - // }); - //JQuery ajax请求>>>>>>>>>>>>>>>>>>>>>>>>>> - - - //VUE axios请求<<<<<<<<<<<<<<<<<<<<<<<<<< - // if (isGet) { - // axios.get(url + "/" + rq, null) - // .then(function (response) { - // console.log(response); - // }) - // .catch(function (error) { - // console.log(error); - // }); - // } else { - // axios({ - // method: 'post', - // url: url + "/", - // data: json - // }).then(function (response) { - // alert(response); - // }).catch(function (error) { - // alert(error); - // }); - // } - //VUE axios请求>>>>>>>>>>>>>>>>>>>>>>>>>> - - - return request; -} - -/**编码JSON,转义所有String - * @param json - */ -function encode(json) { - // alert("encode before:\n" + format(JSON.stringify(json))); - - if (typeof json == "string") { //json instanceof String) { - json = encodeURIComponent(json); - } - else if (json instanceof Array) { - // alert("encode json instanceof Array"); - - for (var i = 0; i < json.length; i ++) { - // alert("json[" + i + "] = " + format(JSON.stringify(json[i]))); - json[i] = encode(json[i]); - } - } - else if (json instanceof Object) { - // alert("encode json instanceof Object"); - for (var key in json) { - // alert("encode json[" + key + "] = " + format(JSON.stringify(json[key]))); - json[key] = encode(json[key]); - } - } - // alert("encode after:\n" + format(JSON.stringify(json))); - - return json; -} - - -/**格式化JSON串 - * @param json - */ -function format(json) { - return JSON.stringify(JSON.parse(json), null, "\t"); -} \ No newline at end of file diff --git a/APIJSON-JavaScript/delete.html b/APIJSON-JavaScript/delete.html index f0d01a902..965bebaa3 100755 --- a/APIJSON-JavaScript/delete.html +++ b/APIJSON-JavaScript/delete.html @@ -1,20 +1,42 @@ + DELETE - + diff --git a/APIJSON-JavaScript/get/array.html b/APIJSON-JavaScript/get/array.html index f74da1226..69d0f2c1c 100644 --- a/APIJSON-JavaScript/get/array.html +++ b/APIJSON-JavaScript/get/array.html @@ -1,45 +1,52 @@ + GET:Array - + diff --git a/APIJSON-JavaScript/get/column.html b/APIJSON-JavaScript/get/column.html index 37efdd664..275a6c60b 100755 --- a/APIJSON-JavaScript/get/column.html +++ b/APIJSON-JavaScript/get/column.html @@ -1,8 +1,9 @@ + GET:Column - @@ -14,7 +15,7 @@ } }; - request(url_get, json); + request(URL_GET, json); diff --git a/APIJSON-JavaScript/get/complex.html b/APIJSON-JavaScript/get/complex.html index 2853bc236..82c189bd8 100644 --- a/APIJSON-JavaScript/get/complex.html +++ b/APIJSON-JavaScript/get/complex.html @@ -1,8 +1,9 @@ + GET:Complex - @@ -26,12 +27,12 @@ "count":3, "Comment":{ "momentId@":"[]/Moment/id" //已通过encode函数自动转义 encodeURIComponent("[]/Moment/id") - }, + } } } }; - request(url_get, json); + request(URL_GET, json); diff --git a/APIJSON-JavaScript/get/rely.html b/APIJSON-JavaScript/get/rely.html index 2f82cf2c2..ef95db7f2 100755 --- a/APIJSON-JavaScript/get/rely.html +++ b/APIJSON-JavaScript/get/rely.html @@ -1,8 +1,9 @@ + GET:Rely - @@ -16,7 +17,7 @@ } }; - request(url_get, json); + request(URL_GET, json); diff --git a/APIJSON-JavaScript/get/single.html b/APIJSON-JavaScript/get/single.html index 4286925a9..c27715f92 100755 --- a/APIJSON-JavaScript/get/single.html +++ b/APIJSON-JavaScript/get/single.html @@ -1,19 +1,25 @@ + GET:Single - + diff --git a/APIJSON-JavaScript/post.html b/APIJSON-JavaScript/post.html index 0d80b75cd..7298f1a44 100755 --- a/APIJSON-JavaScript/post.html +++ b/APIJSON-JavaScript/post.html @@ -1,25 +1,37 @@ + POST - + diff --git a/APIJSON-JavaScript/put.html b/APIJSON-JavaScript/put.html index d928b077d..b665a3521 100755 --- a/APIJSON-JavaScript/put.html +++ b/APIJSON-JavaScript/put.html @@ -1,25 +1,40 @@ + PUT - + diff --git a/LICENSE b/LICENSE index 8dada3eda..f7597a0c3 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright @2016 TommyLemon(https://github.com/TommyLemon/APIJSON) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README(English).md b/README(English).md deleted file mode 100644 index adb26ff6e..000000000 --- a/README(English).md +++ /dev/null @@ -1,288 +0,0 @@ -# APIJSON [![Java API](https://img.shields.io/badge/Java-1.6%2B-brightgreen.svg?style=flat)](http://www.oracle.com/technetwork/java/api-141528.html) [![Android API](https://img.shields.io/badge/Android-15%2B-brightgreen.svg?style=flat)](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) [![Gradle Version](https://img.shields.io/badge/gradle-2.10-green.svg)](https://docs.gradle.org/current/release-notes) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) - -[查看中文文档](https://github.com/TommyLemon/APIJSON/blob/master/README.md) - -APIJSON is a JSON Transmission Structure Protocol. - -You can set any JSON structure and request your server, and the server will return a JSON String with the structure you had set.
-You can get any data with any JSON structure by requesting server just once. It's very convenient and flexible, and does not require a special interface or multiple requests.
-It provides additions and deletions, fuzzy search, remote function calls and so on. And you can save duplicate data and improve transmission speed as well!
- -Now you can realize JSON Transmissions without any interface or doc anymore!
-Client developers will no longer be suffered from various error in docs, and don't have to communicate with server developers about interfaces or docs anymore!
-And server developers no longer have to write new interfaces and docs for compatibility with legacy apps! And they will no longer be endlessly disturbed by client developers at any time! - -Here is an example(Request an Moment list like Wechat friend circle data): - -### Request: - -

{
-    "[]": {                                               //request an array
-        "page": 1,                                    //array condition
-        "count": 2,        
-        "User": {                                      //request an object from the table named User
-            "sex": 0                                   //object condition
-        },
-        "Work": {
-            "userId@": “/User/id”             //rely path with default parent path,starts from the same level object's path
-        },
-        "Comment[]": {                           //request an array named Comment 
-            "page": 0,
-            "count": 3,
-            "Comment": {
-                 "workId@": “[]/Work/id”   //full rely path
-             }
-        }
-    }
-}

- - - -### Response: - -

{
-    "[]":{
-        "0":{
-            "User":{
-                "picture":"",
-                "id":38710,
-                "sex":0,
-                "phone":"1300038710",
-                "name":"Name-38710",
-                "head":"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000"
-            },
-            "Work":{
-                "id":470,
-                "title":"Title-470",
-                "content":"This is a Content...-470",
-                "userId":38710,
-                "picture":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000"
-            },
-            "Comment[]":{
-                "0":{
-                    "Comment":{
-                        "id":4,
-                        "parentId":0,
-                        "workId":470,
-                        "userId":310,
-                        "targetUserId":14604,
-                        "content":"This is a Content...-4",
-                        "targetUserName":"targetUserName-14604",
-                        "userName":"userName-93781"
-                    }
-                },
-                "1":{
-                    "Comment":{
-                        "id":22,
-                        "parentId":221,
-                        "workId":470,
-                        "userId":332,
-                        "targetUserId":5904,
-                        "content":"This is a Content...-22",
-                        "targetUserName":"targetUserName-5904",
-                        "userName":"userName-11679"
-                    }
-                },
-                "2":{
-                    "Comment":{
-                        "id":47,
-                        "parentId":4,
-                        "workId":470,
-                        "userId":10,
-                        "targetUserId":5477,
-                        "content":"This is a Content...-47",
-                        "targetUserName":"targetUserName-5477",
-                        "userName":"userName-80271"
-                    }
-                }
-            }
-        },
-        "1":{
-            "User":{
-                "picture":"",
-                "id":70793,
-                "sex":0,
-                "phone":"1300070793",
-                "name":"Name-70793",
-                "head":"http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000"
-            },
-            "Work":{
-                "id":170,
-                "title":"Title-73",
-                "content":"This is a Content...-73",
-                "userId":70793,
-                "picture":"http://my.oschina.net/img/portrait.gif?t=1451961935000"
-            },
-            "Comment[]":{
-                "0":{
-                    "Comment":{
-                        "id":44,
-                        "parentId":0,
-                        "workId":170,
-                        "userId":7073,
-                        "targetUserId":6378,
-                        "content":"This is a Content...-44",
-                        "targetUserName":"targetUserName-6378",
-                        "userName":"userName-88645"
-                    }
-                },
-                "1":{
-                    "Comment":{
-                        "id":54,
-                        "parentId":0,
-                        "workId":170,
-                        "userId":3,
-                        "targetUserId":62122,
-                        "content":"This is a Content...-54",
-                        "targetUserName":"targetUserName-62122",
-                        "userName":"userName-82381"
-                    }
-                },
-                "2":{
-                    "Comment":{
-                        "id":99,
-                        "parentId":44,
-                        "workId":170,
-                        "userId":793,
-                        "targetUserId":7166,
-                        "content":"This is a Content...-99",
-                        "targetUserName":"targetUserName-7166",
-                        "userName":"userName-22949"
-                    }
-                }
-            }
-        }
-    }
-}

- - - -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_0.jpg) -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_1.jpg) -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_2.jpg) -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_3.jpg) - -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/server_idea_log_complex.jpg) - -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_request.jpg) -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_user.jpg) -![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_moment.jpg) - -## Compare with Previous HTTP Transmission Way - - Process | Previous way | APIJSON --------- | ------------ | ------------ - Transmission | Server developers edit interfaces and update docs, then client developers request server and parse responses according to the docs | Client developers request server and parse responses for their requirements. No inteface! No doc! No communication for any interface or doc between client and server developers! - Compatibility | Server developers add new interfaces tagged with v2 and update docs | Nothing need to do! - - Client request | Previous way | APIJSON --------- | ------------ | ------------ - Requirement | Client developers append key-value pairs to an url for a request in docs | Client developers append JSON to the url for their requirements - Structure | base_url/lowercase_table_name?key0=value0&key1=value1...
¤tUserId=100&loginPassword=1234

The currentUserId and loginPassword is only for parts of interfaces | base_url/{TableName0:{key0:value0, key1:value1 ...}, TableName1:{...}...
, currentUserId:100, loginPassword:1234}

The currentUserId and loginPassword is only for parts of interfaces - URL | Different urls for different requests | One url for one method(GET,POST...) - Key-Value Pair | key=value | key:value - - Server operation | Previous way | APIJSON --------- | ------------ | ------------ - Parse and response | Get key-value pairs and query the database with them by the default way, then encapsulate a JSON, finally return the JSON to client | Just return what RequestParser#parse returned - Way of setting JSON structure to return | Designed in server and cannot be modified by any client apps | Designed by client apps and cannot be modified by sever - - Client parse | Previous way | APIJSON --------- | ------------ | ------------ - View structure | Search docs or view logs after responses for requests | Just view the requests, and viewing logs after responses for requests is also supported - Operate | Parse JSON String from responses | Parse with JSONResponse or use previous way - - Client requests for different requirements | Previous way | APIJSON --------- | ------------ | ------------ - User | http://localhost:8080/get/user?id=1 | http://localhost:8080/get/{"User":{"id":1}} - User and his Work | Request twice
User: http://localhost:8080/get/user?id=1
Work: http://localhost:8080/get/work?userId=1 | http://localhost:8080/get/{"User":{"id":1}, "Work":{"userId@":"User/id"}} - User list | http://localhost:8080/get/user/list?page=1&count=5&sex=0 | http://localhost:8080/get/{"[]":{"page":1, "count":5, "User":{"sex":0}}} - Work list of which type is 1, each Work contains it's publisher User and top 3 Comments | The Work must contains the User Object and Comment Array
http://localhost:8080/get/work/list?page=1&count=5&type=1&commentCount=3 | http://localhost:8080/get/{"[]":{"page":1, "count":5, "Work":{"type":1}, "User":{"workId@":"/Work/id"}, "[]":{"count":3, "Comment":{"workId@":"[]/Work/id"}}}} - Work list of an User, each Work contains the publisher User and top 3 Comments | Change type=1 to userId=1 above | Here are several ways:
①Change "Work":{"type":1}, "User":{"workId@":"/Work/id"} to "User":{"id":1}, "Work":{"userId@":"/User/id"} above

②Or save 4 repeated User by this way
http://localhost:8080/get/{"User":{"id":1}, "[]":{"page":1, "count":5, "Work":{"userId@":"User/id"}, "[]":{"count":3, "Comment":{"workId@":"[]/Work/id"}}}}

③If the User is already obtained, you can also save all repeated User by this way
http://localhost:8080/get/{"[]":{"page":1, "count":5, "Work":{"userId":1}, "[]":{"count":3, "Comment":{"workId@":"[]/Work/id"}}}} - - Server responses for different requests | Previous way | APIJSON --------- | ------------ | ------------ - User | {"status":200, "message":"success", "data":{"id":1, "name":"xxx"...}} | {"status":200, "message":"success", "User":{"id":1, "name":"xxx"...}} - User and his Work | Reponse twice
User: {"status":200, "message":"success", "data":{"id":1, "name":"xxx"...}}
Work: {"status":200, "message":"success", "data":{"id":1, "name":"xxx"...}} | {"status":200, "message":"success", "User":{"id":1, "name":"xxx"...}, "Work":{"id":1, "content":"xxx"...}} - User list | {"status":200, "message":"success", "data":[{"id":1, "name":"xxx"...}, {"id":2...}...]} | {"status":200, "message":"success", "[]":{"0":{"User":{"id":1, "name":"xxx"...}}, "1":{"User":{"id":2...}}...}} - Work list of which type is 1, each Work contains it's publisher User and top 3 Comments | {"status":200, "message":"success", "data":[{"id":1, "content":"xxx"..., "User":{...}, "Comment":[...]}, {"id":2...}...]} | {"status":200, "message":"success", "[]":{"0":{"Work":{"id":1, "content":"xxx"...}, "User":{...}, "[]":{"0":{"Comment":{...}...}}}, "1":{...}...}} - Work list of an User, each Work contains the publisher User and top 3 Comments | {"status":200, "message":"success", "data":[{"id":1, "content":"xxx"..., "User":{...}, "Comment":[...]}, {"id":2...}...]} | Results for the ways above:
①{"status":200, "message":"success", "[]":{"0":{"User":{"id":1, "name":"xxx"...}, "Work":{...}, "[]":{"0":{"Comment":{...}...}}}, "1":{...}...}}

②{"status":200, "message":"success", "User":{...}, "[]":{"0":{"Work":{"id":1, "content":"xxx"...}, "[]":{"0":{"Comment":{...}...}}}, "1":{...}...}}

③{"status":200, "message":"success", "[]":{"0":{"Work":{"id":1, "content":"xxx"...}, "[]":{"0":{"Comment":{...}...}}}, "1":{...}...}} - -## Usage - -### 1.Download and unzip APIJSON project - -Clone or download > Download ZIP > Unzip to a path and remember it. - -#### You can skip step 2 and 3, and test server response with my server IP address 139.196.140.118:8080.
- -### 2.Import MySQL table files - -This Server project needs MySQL Server and MySQLWorkbench. And you must ensure that both of them were installed.
-My config is Windows 7 + MySQL Community Server 5.7.16 + MySQLWorkbench 6.3.7 and OSX EI Capitan + MySQL Community Server 5.7.16 + MySQLWorkbench 6.3.8. The systems and softwares are all 64 bit. - -Start MySQLWorkbench > Enter a connection > Click Server menu > Data Import > Select the path of APIJSON-Master/table > Start Import > Refresh SCHEMAS, and you'll see the tables were already added. - -### 3.Run Server project with Eclipse for JavaEE or IntellIJ IDEA Ultimate - -If you haven't installed any editor above, please download and install one before run.
-My config is Windows 7 + JDK 1.7.0_71 + Eclipse 4.6.1 + IntellIJ 2016.3 and OSX EI Capitan + JDK 1.8.0_91 + Eclipse 4.6.1 + IntellIJ 2016.2.5. The systems and softwares are all 64 bit. - -#### Eclipse for JavaEE - -1.Import
-File > Import > Maven > Existing Maven Projects > Next > Browse > Select the path of APIJSON-Master/APIJSON(Server)/APIJSON(Eclipse_JEE) > Finish - -2.Run
-Run > Run As > Java Application > Select APIJSONApplication > OK - -#### IntellIJ IDEA Ultimate - -1.Import
-Open > Select the path of APIJSON-Master/APIJSON(Server)/APIJSON(Idea) > OK - -2.Run
-Run > Run APIJSONApplication - -### 4.Run Client project with ADT Bundle or Android Studio - -You can skip this step and download the Client App below. - -If you haven't installed any editor above, please download and install one before run.
-My config is Windows 7 + JDK 1.7.0_71 + ADT Bundle 20140702 + Android Studio 2.2 and OSX EI Capitan + (JDK 1.7.0_71 + ADT Bundle 20140702) + (JDK 1.8.0_91 + Android Studio 2.1.2). The systems and softwares are all 64 bit. - -#### ADT Bundle - -1.Import
-File > Import > Android > Existing Android Code Into Workspace > Next > Browse > Select the path of APIJSON-Master/APIJSON(Android)/APIJSON(ADT) > Finish - -2.Run
-Run > Run As > Android Application - -#### Android Studio - -1.Import
-Open an existing Android Studio project > Select the path of APIJSON-Master/APIJSON(Android)/APIJSON(AndroidStudio) > OK - -2.Run
-Run > Run app - -### 5.Operate Client app - -Select an APIJSON request to send to server and wait. It will show the result received.
-If the default url is not available, change it to an available one, such as an IPV4 address of a computer running APIJSON Server project. Then click the Query button to request again. - -## Download Client App - -[APIJSONClientApp.apk](http://files.cnblogs.com/files/tommylemon/APIJSON%28ADT%29.apk) - -### If you have any questions or suggestions about APIJSON, you can send me an e-mail to tommylemon@qq.com. - -## Update Log -[https://github.com/TommyLemon/APIJSON/commits/master](https://github.com/TommyLemon/APIJSON/commits/master) - -## Welcome star, welcome fork - -[https://github.com/TommyLemon/APIJSON](https://github.com/TommyLemon/APIJSON) - -# APIJSON, let interfaces go to hell ! diff --git a/README-English.md b/README-English.md new file mode 100644 index 000000000..2439dc496 --- /dev/null +++ b/README-English.md @@ -0,0 +1,538 @@ +# APIJSON +[![GitHub release](https://img.shields.io/github/release/TommyLemon/APIJSON.svg)](https://github.com/TommyLemon/APIJSON/releases) +[![Java API](https://img.shields.io/badge/Java-1.6%2B-brightgreen.svg?style=flat)](http://www.oracle.com/technetwork/java/api-141528.html) +[![Android API](https://img.shields.io/badge/Android-15%2B-brightgreen.svg?style=flat)](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) +[![JavaScrpit API](https://img.shields.io/badge/JavaScript-ES5%2B-brightgreen.svg?style=flat)](http://www.ecma-international.org/publications/standards/Standard.htm) +[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) + +
+ +[Java-Server](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Java-Server) [Android](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Android) [JavaScript](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-JavaScript) [Vue.js](https://github.com/TommyLemon/APIJSON-JS-Vue) + +[查看中文文档](https://github.com/TommyLemon/APIJSON/blob/master/README.md) + +[Online Test](http://39.108.143.172) + +
+ +* ### [1.About](#1) +* ### [2.Compare](#2) +* [2.1 Process](#2.1) +* [2.2 Client request](#2.2) +* [2.3 Server operate](#2.3) +* [2.4 Client resolve](#2.4) +* [2.5 Requests](#2.5) +* [2.6 Responses](#2.6) +* ### [3.Overview](#3) +* [3.1 Operation](#3.1) +* [3.2 Function](#3.2) +* ### [4.Usage](#4) +* [4.1 Download and unzip](#4.1) +* [4.2 Import tables](#4.2) +* [4.3 Run server](#4.3) +* [4.4 Run client](#4.4) +* [4.4 Operate app](#4.5) +* ### [5.Extra](#5) +* [5.1 Recommend](#5.1) +* [5.2 Author](#5.2) +* [5.3 Download](#5.3) +* [5.4 Update](#5.4) +* [5.5 Star&Fork](#5.5) + +##

1.About

+ +APIJSON is a JSON Transmission Structure Protocol. + +You can set any JSON structure and request your server, and the server will response a JSON with the structure you had set.
+You can get any data by requesting server just once. It's very convenient and flexible, and does not require a special api or multiple requests.
+It provides CRUD(read and write), Fuzzy Search, Remote Function Calls, Rights Management and so on. And you can save duplicate data and improve transmission speed as well!
+ +Now you can realize JSON Transmissions without any api or document anymore!
+Client developers will no longer be suffered from various error in documents, and don't have to communicate with server developers about apis or documents anymore!
+And server developers no longer have to write new apis and documents for compatibility with legacy apps! And they will no longer be endlessly disturbed by client developers at any time! + + + +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_0.jpg) +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_1.jpg) +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_2.jpg) +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_3.jpg) + +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/server_idea_log_complex.jpg) + +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_request.jpg) +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_user.jpg) +![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_moment.jpg) + +
+
+ +### Here are some examples: + +#### Get an User +Request: +

+{
+  "User":{
+  }
+}
+
+ +[Click here to test](http://39.108.143.172:8080/get/{"User":{}}) + +Response: +

+{
+  "User":{
+    "id":38710,
+    "sex":0,
+    "name":"TommyLemon",
+    "certified":true,
+    "tag":"Android&Java",
+    "phone":13000038710,
+    "head":"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
+    "date":1485948110000,
+    "pictureList":[
+      "http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
+      "http://common.cnblogs.com/images/icon_weibo_24.png"
+    ]
+  },
+  "code":200,
+  "msg":"success"
+}
+
+ +
+ + +#### Get an Array of Users +Request: +

+{
+  "[]":{
+    "count":3,             //just get 3 results
+    "User":{
+      "@column":"id,name"  //just get ids and names
+    }
+  }
+}
+
+ +[Click here to test](http://39.108.143.172:8080/get/{"[]":{"count":3,"User":{"@column":"id,name"}}}) + +Response: +

+{
+  "[]":[
+    {
+      "User":{
+        "id":38710,
+        "name":"TommyLemon"
+      }
+    },
+    {
+      "User":{
+        "id":70793,
+        "name":"Strong"
+      }
+    },
+    {
+      "User":{
+        "id":82001,
+        "name":"Android"
+      }
+    }
+  ],
+  "code":200,
+  "msg":"success"
+}
+
+ +
+ +#### Get an Moment and it's publisher(User) +Request: +

+{
+  "Moment":{
+  },
+  "User":{
+    "id@":"Moment/userId"  //User.id = Moment.userId
+  }
+}
+
+ +[Click here to test](http://39.108.143.172:8080/get/{"Moment":{},"User":{"id@":"Moment%252FuserId"}}) + +Response: +

+{
+  "Moment":{
+    "id":12,
+    "userId":70793,
+    "date":"2017-02-08 16:06:11.0",
+    "content":"1111534034"
+  },
+  "User":{
+    "id":70793,
+    "sex":0,
+    "name":"Strong",
+    "tag":"djdj",
+    "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000",
+    "contactIdList":[
+      38710,
+      82002
+    ],
+    "date":"2017-02-01 19:21:50.0"
+  },
+  "code":200,
+  "msg":"success"
+}
+
+ +
+ + +#### Get an Array of Moments +Request: +

+{
+  "[]":{                             //request an Array
+    "page":0,                        //Array condition
+    "count":2,
+    "Moment":{                       //request an Object named Moment
+      "content$":"%a%"               //Object condition, search the Moments in which their contents contain 'a'
+    },
+    "User":{
+      "id@":"/Moment/userId",        //User.id = Moment.userId, reference path with it's grandfather's path omitted
+      "@column":"id,name,head"       //set the columns in the response
+    },
+    "Comment[]":{                    //request an Array named Comment and extract Comments
+      "count":2,
+      "Comment":{
+        "momentId@":"[]/Moment/id"   //Comment.momentId = Moment.id, full reference path
+      }
+    }
+  }
+}
+
+ +[Click here to test](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":2,"Moment":{"content$":"%2525a%2525"},"User":{"id@":"%252FMoment%252FuserId","@column":"id,name,head"},"Comment[]":{"count":2,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) + +Response: +

+{
+  "[]":[
+    {
+      "Moment":{
+        "id":15,
+        "userId":70793,
+        "date":1486541171000,
+        "content":"APIJSON is a JSON Transmission Structure Protocol…",
+        "praiseUserIdList":[
+          82055,
+          82002,
+          82001
+        ],
+        "pictureList":[
+          "http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
+          "http://common.cnblogs.com/images/icon_weibo_24.png"
+        ]
+      },
+      "User":{
+        "id":70793,
+        "name":"Strong",
+        "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000"
+      },
+      "Comment[]":[
+        {
+          "id":176,
+          "toId":166,
+          "userId":38710,
+          "momentId":15,
+          "date":1490444883000,
+          "content":"thank you"
+        },
+        {
+          "id":1490863469638,
+          "toId":0,
+          "userId":82002,
+          "momentId":15,
+          "date":1490863469000,
+          "content":"Just do it"
+        }
+      ]
+    },
+    {
+      "Moment":{
+        "id":58,
+        "userId":90814,
+        "date":1485947671000,
+        "content":"This is a Content...-435",
+        "praiseUserIdList":[
+          38710,
+          82003,
+          82005,
+          93793,
+          82006,
+          82044,
+          82001
+        ],
+        "pictureList":[
+          "http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg"
+        ]
+      },
+      "User":{
+        "id":90814,
+        "name":7,
+        "head":"http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000"
+      },
+      "Comment[]":[
+        {
+          "id":13,
+          "toId":0,
+          "userId":82005,
+          "momentId":58,
+          "date":1485948050000,
+          "content":"This is a Content...-13"
+        },
+        {
+          "id":77,
+          "toId":13,
+          "userId":93793,
+          "momentId":58,
+          "date":1485948050000,
+          "content":"This is a Content...-77"
+        }
+      ]
+    }
+  ],
+  "code":200,
+  "msg":"success"
+}
+
+ + +
+ +[Online Test](http://39.108.143.172) + +
+
+ + +##

2.Compare with Previous HTTP Transmission Way

+ +###

2.1 Process

+ Process | Previous way | APIJSON +-------- | ------------ | ------------ + Transmission | Server developers edit apis and update documents, then client developers request server and parse responses according to the documents | Client developers request server and parse responses for their requirements. No inteface! No document! No communication for any api or document between client and server developers! + Compatibility | Server developers add new apis tagged with v2 and update documents | Nothing need to do! + +
+ +###

2.2 Client request

+ Client request | Previous way | APIJSON +-------- | ------------ | ------------ + Requirement | Client developers append key-value pairs to an url for a request in documents | Client developers append JSON to the url for their requirements + Structure | base_url/get/table_name?
key0=value0&key1=value1...

Only one table_name can be contained in an URL | base_url/get/
{
   TableName0:{
     key0:value0,
     key1:value1,
     ...
   },
   TableName1:{
     ...
   }
   ...
}

You can add TableNames as many as you want after an URL + URL | Different urls for different requests. The more diffirent kinds of requests, the more different urls | One url for one method(GET,POST...), most requests use the same URL of the 7 common ones + Key-Value Pair | key=value | key:value + +
+ + ###

2.3 Server operate

+ Server operate | Previous way | APIJSON +-------- | ------------ | ------------ + Parse and response | Get key-value pairs and query the database with them by the default way, then encapsulate a JSON, finally return the JSON to clients | Just return what Parser#parse returned + Way of setting JSON structure of Response | Designed in servers and cannot be modified by clients | Designed by clients and cannot be modified by servers + +
+ + ###

2.4 Client resolve

+ Client resolve | Previous way | APIJSON +-------- | ------------ | ------------ + View structure | Search documents or view logs after responses for requests | Just view the requests, and viewing logs after responses for requests is also supported + Operate | Parse JSON String from responses | Parse with JSONResponse or use previous way + +
+ +###

2.5 Requests

+ Requests | Previous way | APIJSON +-------- | ------------ | ------------ + User | base_url/get/user?id=38710 | [base_url/get/
{
   "User":{
     "id":38710
   }
}](http://39.108.143.172:8080/get/{"User":{"id":38710}}) + Moment and it's publisher(User) | Request twice
Moment:
base_url/get/moment?userId=38710

User:
base_url/get/user?id=38710 | Just request once
[base_url/get/
{
   "Moment":{
     "userId":38710
   },
   "User":{
     "id":38710
   }
}](http://39.108.143.172:8080/get/{"Moment":{"userId":38710},"User":{"id":38710}}) + User list | base_url/get/user/list?
page=0&count=3&sex=0 | [base_url/get/
{
   "User[]":{
     "page":0,
     "count":3,
     "User":{
       "sex":0
     }
   }
}](http://39.108.143.172:8080/get/{"User[]":{"page":0,"count":3,"User":{"sex":0}}}) + A list, each item contains
a Moment, a publisher(User)
and a list of top 3 Comments | The Moment must contains an User Object and a Comment Array

base_url/get/moment/list?
page=0&count=3&commentCount=3 | [base_url/get/
{
   "[]":{
     "page":0,
     "count":3,
     "Moment":{},
     "User":{
       "id@":"/Moment/userId"
     },
     "Comment[]":{
       "count":3,
       "Comment":{
         "momentId@":"[]/Moment/id"
       }
     }
   }
}](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":3,"Moment":{},"User":{"id@":"%252FMoment%252FuserId"},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) + A list, each item contains
a Moment, the same publisher(User)
and a list of top 3 Comments | Each Moment must contains an User Object and a Comment Array

base_url/get/moment/list?
page=0&count=3
&commentCount=3&userId=38710 | Here are several ways:
① Change
"Moment":{}, "User":{"id@":"/Moment/userId"}
to
["Moment":{"userId":38710}, "User":{"id":38710}](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":3,"Moment":{"userId":38710},"User":{"id":38710},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}})

② Or save repeated Users by this way
[base_url/get/
{
   "User":{
     "id":38710
   },
   "[]":{
     "page":0,
     "count":3,
     "Moment":{
       "userId":38710
     },
     "Comment[]":{
       "count":3,
       "Comment":{
         "momentId@":"[]/Moment/id"
       }
     }
   }
}](http://39.108.143.172:8080/get/{"User":{"id":38710},"[]":{"page":0,"count":3,"Moment":{"userId":38710},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}})

③ If the User is already obtained, you can also save all repeated User by this way
[base_url/get/
{
   "[]":{
     "page":0,
     "count":3,
     "Moment":{
       "userId":38710
     },
     "Comment[]":{
       "count":3,
       "Comment":{
         "momentId@":"[]/Moment/id"
       }
     }
   }
}](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":3,"Moment":{"userId":38710},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) + +
+ + ###

2.6 Responses

+ Responses | Previous way | APIJSON +-------- | ------------ | ------------ + User | {
   "data":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} | {
   "User":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} + Moment and it's publisher(User) | Get the Moment from the first response,
and take it's userId as the value of User's id,
then send the second request to get the User

Moment:
{
   "data":{
     "id":235,
     "content":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
}

User:
{
   "data":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} | Response only once, and no longer needs to waiting too long, relating 2 responses, switching threads and so on

{
   "Moment":{
     "id":235,
     "content":"xxx",
     ...
   },
   "User":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} + User list | {
   "data":[
     {
       "id":38710,
       "name":"xxx",
       ...
     },
     {
       "id":82001,
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} | {
   "User[]":[
     {
       "id":38710,
       "name":"xxx",
       ...
     },
     {
       "id":82001,
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} + A list, each item contains
a Moment, a publisher(User)
and a list of top 3 Comments | Eech Moment must contains
it's publisher(User)
and a list of top 3 Comments

{
   "data":[
     {
       "id":235,
       "content":"xxx",
       ...,
       "User":{
         ...
       },
       "Comment":[
         ...
       ]
     },
     {
       "id":301,
       "content":"xxx",
       ...,
       "User":{
         ...
       },
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} | 1.Flexible structures, you can combine the Objects and Arrays as you want
2.Loose couplings, the structure is clearer

{
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "User":{
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     {
       "Moment":{
         "id":301,
         "content":"xxx",
         ...
       },
       "User":{
         ...
       },
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} + A list, each item contains
a Moment, the same publisher(User)
and a list of top 3 Comments | 1.Many repeated Users, a waste of data traffic and server performance
2.Difficult to optimize since the needs of expanding apis and writing documents, and then calling the apis according to the documents

{
   "data":[
     {
       "id":235,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     {
       "id":470,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     {
       "id":511,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     {
       "id":595,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} | Differences responses for the requests above:

① Common request
{
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     ...
   ],
   "code":200,
   "msg":"success"
}

② Save repeated Users
{
   "User":{
     "id":38710,
     "name":"Tommy",
     ...
   },
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     ...
   ],
   "code":200,
   "msg":"success"
}

③ Save all repeated Users
{
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     ...
   ],
   "code":200,
   "msg":"success"
} + + +1.base_url指基地址,一般是顶级域名,其它分支url都是在base_url后扩展。如base_url:http://www.google.com/ ,对应的GET分支url:http://www.google.com/get/ 。下同。
+2.请求中的key或value任意一个为null值时,这个 key:value键值对 被视为无效。下同。
+3.请求中的 / 需要转义。JSONRequest.java已经用URLEncoder.encode转义,不需要再写;但如果是浏览器或Postman等直接输入url/request,需要把request中的所有 / 都改成 %252F 。下同。
+4.code,指返回结果中的状态码,200表示成功,其它都是错误码,值全部都是HTTP标准状态码。下同。
+5.msg,指返回结果中的状态信息,对成功结果或错误原因的详细说明。下同。
+6.code和msg总是在返回结果的同一层级成对出现。对所有请求的返回结果都会在最外层有一对总结式code和msg。对非GET类型的请求,返回结果里面的每个JSONObject里都会有一对code和msg说明这个JSONObject的状态。下同。
+7.id等字段对应的值仅供说明,不一定是数据库里存在的,请求里用的是真实存在的值。下同。 + +
+
+ +##

3.Overview

+ +###

3.1 Operation

+ +  Method | URL | Request | Response +------------ | ------------ | ------------ | ------------ +GET:
common query | base_url/get/ | {
   TableName:{
     …
   }
}
{…}内为限制条件

例如获取一个id为235的Moment:
{
   "Moment":{
     "id":235
   }
} | {
   TableName:{
     ...
   },
   "code":200,
   "msg":"success"
}
例如
{
   "Moment":{
     "id":235,
     "userId":38710,
     "content":"APIJSON,let interfaces and documents go to hell !"
   },
   "code":200,
   "msg":"success"
} +HEAD:
common count | base_url/head/ | {
   TableName:{
     …
   }
}
{…}内为限制条件

例如获取一个id为38710的User所发布的Moment总数:
{
   "Moment":{
     "userId":38710
   }
} | {
   TableName:{
     "code":200,
     "msg":"success",
     "count":10
   },
   "code":200,
   "msg":"success"
}
例如
{
   "Moment":{
     "code":200,
     "msg":"success",
     "count":10
   },
   "code":200,
   "msg":"success"
} +GETS:
safe, single, simple GET | base_url/gets/ | 最外层加一个"tag":tag,其它同GET | 同GET +HEADS:
safe, single, simple HEAD | base_url/heads/ | 最外层加一个"tag":tag,其它同HEAD | 同HEAD +POST:
create new data | base_url/post/ | {
   TableName:{
     …
   },
   "tag":tag
}
{…}中id由服务端生成,不能传

例如一个id为38710的User发布一个新Moment:
{
   "Moment":{
     "userId":38710,
     "content":"APIJSON,let interfaces and documents go to hell !"
   },
   "tag":"Moment"
} | {
   TableName:{
     "code":200,
     "msg":"success",
     "id":38710
   },
   "code":200,
   "msg":"success"
}
例如
{
   "Moment":{
     "code":200,
     "msg":"success",
     "id":120
   },
   "code":200,
   "msg":"success"
} +PUT:
modify values of keys | base_url/put/ | {
   TableName:{
     "id":id,
     …
   },
   "tag":tag
}
{…}中id必传

例如修改id为235的Moment的content:
{
   "Moment":{
     "id":235,
     "content":"APIJSON,let interfaces and documents go to hell !"
   },
   "tag":"Moment"
} | 同POST +DELETE:
delete data | base_url/delete/ | {
   TableName:{
     "id":id
   },
   "tag":tag
}
{…}中id必传,一般只传id

例如删除id为120的Moment:
{
   "Moment":{
     "id":120
   },
   "tag":"Moment"
} | 同POST + + +1.TableName指要查询的数据库表Table的名称字符串。第一个字符为大写字母,剩下的字符要符合英语字母、数字、下划线中的任何一种。对应的值的类型为JSONObject,结构是 {...},里面放的是Table的字段(列名)。下同。
+2."tag":tag 后面的tag是非GET、HEAD请求中匹配请求的JSON结构的key,一般是要查询的table的名称,由服务端Request表中指定。下同。
+3.GET、HEAD请求是开放请求,可任意组合任意嵌套。其它请求为受限制的安全/私密请求,对应的 方法、tag、结构 都必须和 服务端Request表中所指定的 一一对应,否则请求将不被通过。下同。
+4.GETS与GET、HEADS与HEAD分别为同一类型的操作方法,请求稍有不同但返回结果相同。下同。
+5.在HTTP通信中,GET、HEAD方法一般用HTTP GET请求,其它一般用HTTP POST请求。下同。
+6.所有JSONObject都视为容器(或者文件夹),结构为 {...} ,里面可以放普通对象或子容器。下同。
+7.每个对象都有一个唯一的路径(或者叫地址),假设对象名为refKey,则用 key0/key1/.../refKey 表示。下同。 + +
+ +###

3.2 Function

+ + Function | Key-Value | Example +------------ | ------------ | ------------ + Array | "key[]":{},后面是JSONObject,key可省略。当key和里面的Table名相同时,Table会被提取出来,即 {Table:{Content}} 会被转化为 {Content} | [{"User[]":{"User":{}}}](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{}}}),查询一个User数组。这里key和Table名都是User,User会被提取出来,即 {"User":{"id", ...}} 会被转化为 {"id", ...} + Options | "key{}":[],后面是JSONArray,作为key可取的值的选项 | ["id{}":[38710,82001,70793]](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"id{}":[38710,82001,70793]}}}),查询id符合38710,82001,70793中任意一个的一个User数组 + Conditions | "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a' | ["id{}":"<=80000,\>90000"](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"id{}":"<=80000,\>90000"}}}),查询id符合id\<=80000 \| id>90000的一个User数组 + Contain | "key<\>":Object => "key<\>":[Object],key对应值的类型必须为JSONArray,Object类型不能为JSON | ["contactIdList<\>":38710](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"contactIdList<\>":38710}}}),查询contactIdList包含38710的一个User数组 + Function | "key()":"函数表达式",函数表达式为 function(Type0:value0,Type1:value1...)。函数参数类型为Object或泛型时可省略类型,即 Object:value 改写为 value | ["isPraised()":"isContain(Collection:praiseUserIdList,userId)"](http://39.108.143.172:8080/get/{"Moment":{"id":301,"isPraised()":"isContain(Collection:praiseUserIdList,userId)"}}),请求完成后会调用 boolean isContain(Collection collection, Object object) 函数,然后变为 "isPraised":true 这种(假设点赞用户id列表包含了userId,即这个User点了赞) + Reference | "key@":"引用路径",引用路径为用/分隔的字符串。以/开头的是缺省引用路径,从声明key所处容器的父容器路径开始;其它是完整引用路径,从最外层开始。
被引用的refKey必须在声明key的上面。如果对refKey的容器指定了返回字段,则被引用的refKey必须写在@column对应的值内,例如 "@column":"refKey,key1,..." | ["Moment":{
   "userId":38710
},
"User":{
   "id@":"/Moment/userId"
}](http://39.108.143.172:8080/get/{"Moment":{"userId":38710},"User":{"id@":"%252FMoment%252FuserId"}})
User内的id引用了与User同级的Moment内的userId,
即User.id = Moment.userId,请求完成后
"id@":"/Moment/userId" 会变成 "id":38710 + Search | "key$":"SQL搜索表达式" => "key$":["SQL搜索表达式"],任意SQL搜索表达式字符串,如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等,%表示任意字符 | ["name$":"%m%"](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"name$":"%2525m%2525"}}}),查询name包含"m"的一个User数组 + RegEx | "key?":"正则表达式" => "key?":["正则表达式"],任意正则表达式字符串,如 ^[0-9]+$ ,可用于高级搜索 | ["name?":"^[0-9]+$"](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"name%253F":"^[0-9]%252B$"}}}),查询name中字符全为数字的一个User数组 + Alias | "name:alias",name映射为alias,用alias替代name。可用于 column,Table,SQL函数 等。只用于GET类型、HEAD类型的请求 | ["@column":"toId:parentId"](http://39.108.143.172:8080/get/{"Comment":{"@column":"id,toId:parentId","id":51}}),将查询的字段toId变为parentId返回 + Add | "key+":Object,Object的类型由key指定,且类型为Number,String,JSONArray中的一种。如 82001,"apijson",["url0","url1"] 等。只用于PUT请求 | "praiseUserIdList+":[82001],添加一个点赞用户id,即这个用户点了赞 + Remove | "key-":Object,与"key+"相反 | "balance-":100.00,余额减少100.00,即花费了100元 + Logic | &, \|, ! 逻辑运算符。
① & 可用于"key&{}":"条件"等
② \| 可用于"key\|{}":"条件", "key\|{}":[]等,一般可省略
③ ! 可单独使用,如"key!":Object,也可像&,\|一样配合其他功能符使用 | ① ["id&{}":">80000,<=90000"](http://39.108.143.172:8080/head/{"User":{"id&{}":">80000,<=90000"}}),即id满足id>80000 & id<=90000
② ["id\|{}":">90000,<=80000"](http://39.108.143.172:8080/head/{"User":{"id\|{}":">90000,<=80000"}}),同"id{}":">90000,<=80000",即id满足id>90000 \| id<=80000
③ ["id!{}":[82001,38710]](http://39.108.143.172:8080/head/{"User":{"id!{}":[82001,38710]}}),即id满足 ! (id=82001 \| id=38710),可过滤黑名单的消息 + Keywords in array | "key":Object,key为 "[]":{} 中{}内的关键词,Object的类型由key指定
① "count":Integer,指定查询数量,假设允许查询数组的最大数量为max,则当count在1~max范围内时,查询count个;否则查询max个
② "page":Integer,指定查询页码,从0开始,一般和count一起用
③ "query":Integer,指定查询内容
0-对象,1-总数,2-以上全部
总数关键词为total,和query同级,通过引用赋值得到,如 "total@":"/[]/total"
这里query及total仅为GET类型的请求提供方便,一般可直接用HEAD类型的请求获取总数 | ① 查询User数组,最多5个:
["count":5](http://39.108.143.172:8080/get/{"[]":{"count":5,"User":{}}})
② 查询第3页的User数组,每页5个:
["count":5,
"page":3](http://39.108.143.172:8080/get/{"[]":{"count":5,"page":3,"User":{}}})
③ 查询User数组和对应的User总数:
["[]":{
   "query":2,
   "User":{}
},
"total@":"/[]/total"](http://39.108.143.172:8080/get/{"[]":{"query":2,"count":5,"User":{}},"total@":"%252F[]%252Ftotal"}) + Keywords in object | "@key":Object,@key为 Table:{} 中{}内的关键词,Object的类型由@key指定
① "@about":true, 查询字段属性
② "@column":"key0,key1...", 指定返回字段
③ "@order":"key0,key1+,key2-...",指定排序方式
④ "@group":"key0,key1,key2...",指定分组方式。如果@column里声明了Table的id,则id也必须在@group中声明;其它情况下必须满足至少一个条件:
1.分组的key在@column里声明
2.Table主键在@group中声明
⑤ "@having":"function0(...)?valu0,function1(...)?valu1,function2(...)?value2...",指定SQL函数条件,一般和@group一起用,函数一般在@column里声明 | ① 查询User表中字段的属性:
["@about":true](http://39.108.143.172:8080/get/{"User[]":{"User":{"@about":true}}})
② 只查询id,sex,name这几列并且请求结果也按照这个顺序:
["@column":"id,sex,name"](http://39.108.143.172:8080/get/{"User":{"@column":"id,sex,name","id":38710}})
③ 查询按 name降序、id默认顺序 排序的User数组:
["@order":"name-,id"](http://39.108.143.172:8080/get/{"[]":{"count":10,"User":{"@column":"name,id","@order":"name-,id"}}})
④ 查询按userId分组的Moment数组:
["@group":"userId,id"](http://39.108.143.172:8080/get/{"[]":{"count":10,"Moment":%7B"@column":"userId,id","@group":"userId,id"}}})
⑤ 查询 按userId分组、id最大值>=100 的Moment数组:
["@column":"userId,max(id)",
"@group":"userId",
"@having":"max(id)>=100"](http://39.108.143.172:8080/get/{"[]":{"count":10,"Moment":{"@column":"userId,max(id)","@group":"userId","@having":"max(id)>=100"}}})
还可以指定函数返回名:
["@column":"userId,max(id):maxId",
"@group":"userId",
"@having":"maxId>=100"](http://39.108.143.172:8080/get/{"[]":{"count":10,"Moment":{"@column":"userId,max(id):maxId","@group":"userId","@having":"maxId>=100"}}})
⑥ 从pictureList获取第0张图片:
["@position":0, //这里@position为自定义关键词
"firstPicture()":"get(Collection:pictureList,int:@position)"](http://39.108.143.172:8080/get/{"User":{"id":38710,"@position":0,"firstPicture()":"get(Collection:pictureList,int:@position)"}})
... + +
+
+ + +##

4.Usage

+ +###

4.1 Download and unzip APIJSON project

+ +Clone or download > Download ZIP > Unzip to a path and remember it. + +#### You can skip step 2 and 3, and test server response with my server IP address 39.108.143.172:8080.
+ +###

4.2 Import MySQL table files

+ +This Server project needs MySQL Server and MySQLWorkbench. And you must ensure that both of them were installed.
+My config is Windows 7 + MySQL Community Server 5.7.16 + MySQLWorkbench 6.3.7 and OSX EI Capitan + MySQL Community Server 5.7.16 + MySQLWorkbench 6.3.8. The systems and softwares are all 64 bit. + +Start MySQLWorkbench > Enter a connection > Click Server menu > Data Import > Select the path of APIJSON-Master/table > Start Import > Refresh SCHEMAS, and you'll see the tables were already added. + + +###

4.3 Run Server project with Eclipse for JavaEE or IntellIJ IDEA Ultimate

+ +If you haven't installed any editor above, please download and install one before run.
+My config is Windows 7 + JDK 1.7.0_71 + Eclipse 4.6.1 + IntellIJ 2016.3 and OSX EI Capitan + JDK 1.8.0_91 + Eclipse 4.6.1 + IntellIJ 2016.2.5. The systems and softwares are all 64 bit. + +#### Eclipse for JavaEE + +1.Import
+File > Import > Maven > Existing Maven Projects > Next > Browse > Select the path of APIJSON-Master/APIJSON(Server)/APIJSON(Eclipse_JEE) > Finish + +2.Run
+Run > Run As > Java Application > Select APIJSONApplication > OK + +#### IntellIJ IDEA Ultimate + +1.Import
+Open > Select the path of APIJSON-Master/APIJSON(Server)/APIJSON(Idea) > OK + +2.Run
+Run > Run APIJSONApplication + +###

4.4 Run Client project with ADT Bundle or Android Studio

+ +You can skip this step and download the Client App below. + +If you haven't installed any editor above, please download and install one before run.
+My config is Windows 7 + JDK 1.7.0_71 + ADT Bundle 20140702 + Android Studio 2.2 and OSX EI Capitan + (JDK 1.7.0_71 + ADT Bundle 20140702) + (JDK 1.8.0_91 + Android Studio 2.1.2). The systems and softwares are all 64 bit. + +#### ADT Bundle + +1.Import
+File > Import > Android > Existing Android Code Into Workspace > Next > Browse > Select the path of APIJSON-Master/APIJSON(Android)/APIJSON(ADT) > Finish + +2.Run
+Run > Run As > Android Application + +#### Android Studio + +1.Import
+Open an existing Android Studio project > Select the path of APIJSON-Master/APIJSON(Android)/APIJSON(AndroidStudio) > OK + +2.Run
+Run > Run app + +###

4.5 Operate app

+ +Select an APIJSON request to send to server and wait. It will show the result received.
+If the default url is not available, change it to an available one, such as an IPV4 address of a computer running APIJSON Server project. Then click the Query button to request again. + +
+
+ +##

5.Extra

+ +###

5.1 Recommend

+[APIJSON, 让接口和文档见鬼去吧!](https://my.oschina.net/tommylemon/blog/805459) + +[仿QQ空间和微信朋友圈,高解耦高复用高灵活](https://my.oschina.net/tommylemon/blog/885787) + +[3步创建APIJSON服务端新表及配置](https://my.oschina.net/tommylemon/blog/889074) + +###

5.2 Author

+### TommyLemon:[https://github.com/TommyLemon](https://github.com/TommyLemon)
+ +If you have any questions or suggestions, you can [create an issue](https://github.com/TommyLemon/APIJSON/issues) or [send me an e-mail](mailto:tommylemon@qq.com).
+If you fixed some bugs or added some functions, I would greatly appreciate it if you [contribute your code](https://github.com/TommyLemon/APIJSON/pulls). + + +###

5.3 Download

+ +App
+[APIJSONApp.apk](http://files.cnblogs.com/files/tommylemon/APIJSONApp.apk) + +Test
+[APIJSONTest.apk](http://files.cnblogs.com/files/tommylemon/APIJSONTest.apk) + + +###

5.4 Update

+[https://github.com/TommyLemon/APIJSON/commits/master](https://github.com/TommyLemon/APIJSON/commits/master) + +###

5.5 Star & Fork

+ +[https://github.com/TommyLemon/APIJSON](https://github.com/TommyLemon/APIJSON) diff --git a/README.md b/README.md index f6b3a4e3a..6e423e122 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,18 @@ -# APIJSON [![Java API](https://img.shields.io/badge/Java-1.6%2B-brightgreen.svg?style=flat)](http://www.oracle.com/technetwork/java/api-141528.html) [![Android API](https://img.shields.io/badge/Android-15%2B-brightgreen.svg?style=flat)](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) [![Gradle Version](https://img.shields.io/badge/gradle-2.10-green.svg)](https://docs.gradle.org/current/release-notes) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) +# APIJSON +[![Java API](https://img.shields.io/badge/Java-1.6%2B-brightgreen.svg?style=flat)](http://www.oracle.com/technetwork/java/api-141528.html) +[![Android API](https://img.shields.io/badge/Android-15%2B-brightgreen.svg?style=flat)](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) +[![JavaScrpit API](https://img.shields.io/badge/JavaScript-ES5%2B-brightgreen.svg?style=flat)](http://www.ecma-international.org/publications/standards/Standard.htm) +[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) +
-[Java](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON(Server)) [Android](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON(Android)) [JavaScript](https://github.com/TommyLemon/APIJSON-JS) +[Java-Server](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Java-Server) [Android](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-Android) [JavaScript](https://github.com/TommyLemon/APIJSON/tree/master/APIJSON-JavaScript) [Vue.js](https://github.com/TommyLemon/APIJSON-JS-Vue) -[English Document](https://github.com/TommyLemon/APIJSON/blob/master/README(English).md) +[English Document](https://github.com/TommyLemon/APIJSON/blob/master/README-English.md) + +[在线测试](http://39.108.143.172) + +
* ### [1.简介](#1) * ### [2.对比传统方式](#2) @@ -14,31 +23,34 @@ * [2.5 对应不同需求的请求](#2.5) * [2.6 对应不同请求的结果](#2.6) * ### [3.对应关系总览](#3) -* ### [4.功能符](#4) -* ### [5.使用方法](#5) -* [5.1 下载解压](#5.1) -* [5.2 导入table](#5.2) -* [5.3 运行服务端工程](#5.3) -* [5.4 运行客户端工程](#5.4) -* [5.5 操作客户端App](#5.5) -* ### [6.其它](#6) -* [6.1 相关推荐](#6.1) -* [6.2 关于作者](#6.2) -* [6.3 下载试用](#6.3) -* [6.4 更新日志](#6.4) -* [6.5 Star&Fork](#6.5) +* [3.1 操作方法](#3.1) +* [3.2 功能符](#3.2) +* ### [4.快速上手](#4) +* [4.1 下载解压](#4.1) +* [4.2 导入数据库表](#4.2) +* [4.3 运行服务端工程](#4.3) +* [4.4 运行客户端工程](#4.4) +* [4.4 操作客户端App](#4.5) +* ### [5.其它](#5) +* [5.1 相关推荐](#5.1) +* [5.2 关于作者](#5.2) +* [5.3 下载试用](#5.3) +* [5.4 更新日志](#5.4) +* [5.5 Star&Fork](#5.5) ##

1.简介

APIJSON是一种JSON传输结构协议。
-客户端可以定义任何JSON结构去向服务端发起请求,服务端就会返回对应结构的JSON字符串,所求即所得。
+客户端可以定义任何JSON结构去向服务端发起请求,服务端就会返回对应结构的JSON,所求即所得。
一次请求任意结构任意数据,方便灵活,不需要专门接口或多次请求。
-支持增删改查、模糊搜索、远程函数调用等。还能去除重复数据,节省流量提高速度!
+支持增删改查、模糊搜索、正则匹配、远程函数、自动化权限校验、自动化版本管理等。还能去除重复数据,节省流量提高速度!
-从此HTTP传输JSON数据没有接口,更不需要文档!
+从此HTTP请求不用写接口,更不用写文档!
客户端再也不用和服务端沟通接口或文档问题了!再也不会被文档各种错误坑了!
服务端再也不用为了兼容旧版客户端写新版接口和文档了!再也不会被客户端随时随地没完没了地烦了! +
+[为什么要用APIJSON?](https://github.com/TommyLemon/APIJSON/wiki) ![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_0.jpg) ![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/apijson_all_pages_1.jpg) @@ -51,8 +63,10 @@ APIJSON是一种JSON传输结构协议。
![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_user.jpg) ![](https://raw.githubusercontent.com/TommyLemon/APIJSON/master/picture/mysql_workbench_moment.jpg) +
+
-### 举几个栗子: +### 举几个例子: #### 查询用户 请求: @@ -63,7 +77,7 @@ APIJSON是一种JSON传输结构协议。
} -[点击这里测试](http://139.196.140.118:8080/get/{"User":{}}) +[点击这里测试](http://39.108.143.172:8080/get/{"User":{}}) 返回:

@@ -82,25 +96,27 @@ APIJSON是一种JSON传输结构协议。
"http://common.cnblogs.com/images/icon_weibo_24.png" ] }, - "status":200, - "message":"success" + "code":200, + "msg":"success" }
+
+ #### 查询用户列表 请求:

 {
   "[]":{
-    "count":3,
-    "User":{
-      "@column":"id,name"
+    "count":3,             //只要3个
+    "User":{
+      "@column":"id,name"  //只要id,name这两个字段
     }
   }
 }
 
-[点击这里测试](http://139.196.140.118:8080/get/{"[]":{"count":3,"User":{"@column":"id,name"}}}) +[点击这里测试](http://39.108.143.172:8080/get/{"[]":{"count":3,"User":{"@column":"id,name"}}}) 返回:

@@ -125,125 +141,181 @@ APIJSON是一种JSON传输结构协议。
} } ], - "status":200, - "message":"success" + "code":200, + "msg":"success" +} +
+ +
+ +#### 查询动态及发布者用户 +请求: +

+{
+  "Moment":{
+  },
+  "User":{
+    "id@":"Moment/userId"  //User.id = Moment.userId
+  }
 }
 
+[点击这里测试](http://39.108.143.172:8080/get/{"Moment":{},"User":{"id@":"Moment%252FuserId"}}) + +返回: +

+{
+  "Moment":{
+    "id":12,
+    "userId":70793,
+    "date":"2017-02-08 16:06:11.0",
+    "content":"1111534034"
+  },
+  "User":{
+    "id":70793,
+    "sex":0,
+    "name":"Strong",
+    "tag":"djdj",
+    "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000",
+    "contactIdList":[
+      38710,
+      82002
+    ],
+    "date":"2017-02-01 19:21:50.0"
+  },
+  "code":200,
+  "msg":"success"
+}
+
+ +
+ #### 查询类似微信朋友圈的动态列表 请求:

 {
-  "[]":{                             //请求一个数组
-    "page":0,                        //数组条件
+  "[]":{                             //请求一个数组
+    "page":0,                        //数组条件
     "count":2,
-    "User":{                         //请求一个名为User的对象
-      "sex":0,                       //对象条件
-      "@column":"id,name,head"       //指定返回字段
-    },
-    "Moment":{
-      "userId@":"/User/id"           //缺省依赖路径,从所处容器的父容器路径开始
+    "Moment":{                       //请求一个名为Moment的对象
+      "content$":"%a%"               //对象条件,搜索content中包含a的动态
+    },
+    "User":{
+      "id@":"/Moment/userId",        //User.id = Moment.userId  缺省引用赋值路径,从所处容器的父容器路径开始
+      "@column":"id,name,head"       //指定返回字段
     },
-    "Comment[]":{                    //请求一个名为Comment的数组
+    "Comment[]":{                    //请求一个名为Comment的数组,并去除Comment包装
       "count":2,
       "Comment":{
-        "momentId@":"[]/Moment/id"   //完整依赖路径
+        "momentId@":"[]/Moment/id"   //Comment.momentId = Moment.id  完整引用赋值路径
       }
     }
   }
 }
 
-[点击这里测试](http://139.196.140.118:8080/get/{"[]":{"page":0,"count":2,"User":{"sex":0,"@column":"id,name,head"},"Moment":{"userId@":"%252FUser%252Fid"},"Comment[]":{"count":2,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) +[点击这里测试](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":2,"Moment":{"content$":"%2525a%2525"},"User":{"id@":"%252FMoment%252FuserId","@column":"id,name,head"},"Comment[]":{"count":2,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) 返回:

 {
   "[]":[
     {
-      "User":{
-        "id":38710,
-        "name":"TommyLemon",
-        "head":"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000"
-      },
       "Moment":{
-        "id":235,
-        "userId":38710,
+        "id":15,
+        "userId":70793,
         "date":1486541171000,
+        "content":"APIJSON is a JSON Transmission Structure Protocol…",
+        "praiseUserIdList":[
+          82055,
+          82002,
+          82001
+        ],
         "pictureList":[
-          "http://static.oschina.net/uploads/img/201604/22172508_mpwj.jpg"
+          "http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
+          "http://common.cnblogs.com/images/icon_weibo_24.png"
         ]
       },
+      "User":{
+        "id":70793,
+        "name":"Strong",
+        "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000"
+      },
       "Comment[]":[
         {
-          "Comment":{
-            "id":160,
-            "toId":0,
-            "userId":82001,
-            "momentId":235,
-            "date":1488434166000,
-            "content":"This is a Content...-160"
-          }
+          "id":176,
+          "toId":166,
+          "userId":38710,
+          "momentId":15,
+          "date":1490444883000,
+          "content":"thank you"
         },
         {
-          "Comment":{
-            "id":163,
-            "toId":0,
-            "userId":82001,
-            "momentId":235,
-            "date":1488434166000,
-            "content":"This is a Content...-163"
-          }
+          "id":1490863469638,
+          "toId":0,
+          "userId":82002,
+          "momentId":15,
+          "date":1490863469000,
+          "content":"Just do it"
         }
       ]
     },
     {
-      "User":{
-        "id":70793,
-        "name":"Strong",
-        "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000"
-      },
       "Moment":{
-        "id":12,
-        "userId":70793,
-        "date":1486541171000,
-        "content":1111534034,
+        "id":58,
+        "userId":90814,
+        "date":1485947671000,
+        "content":"This is a Content...-435",
+        "praiseUserIdList":[
+          38710,
+          82003,
+          82005,
+          93793,
+          82006,
+          82044,
+          82001
+        ],
         "pictureList":[
-          "http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg",
-          "http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg"
+          "http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg"
         ]
       },
+      "User":{
+        "id":90814,
+        "name":7,
+        "head":"http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000"
+      },
       "Comment[]":[
         {
-          "Comment":{
-            "id":162,
-            "toId":0,
-            "userId":93793,
-            "momentId":12,
-            "date":1488776625000,
-            "content":"This is a Content...-162"
-          }
+          "id":13,
+          "toId":0,
+          "userId":82005,
+          "momentId":58,
+          "date":1485948050000,
+          "content":"This is a Content...-13"
         },
         {
-          "Comment":{
-            "id":164,
-            "toId":0,
-            "userId":93793,
-            "momentId":12,
-            "date":1488776625000,
-            "content":"This is a Content...-164"
-          }
+          "id":77,
+          "toId":13,
+          "userId":93793,
+          "momentId":58,
+          "date":1485948050000,
+          "content":"This is a Content...-77"
         }
       ]
     }
   ],
-  "status":200,
-  "message":"success"
+  "code":200,
+  "msg":"success"
 }
 
+
+ +[在线测试](http://39.108.143.172) +
+
##

2.对比传统RESTful方式

@@ -253,107 +325,129 @@ APIJSON是一种JSON传输结构协议。
接口传输 | 等服务端编辑接口,然后更新文档,客户端再按照文档编辑请求和解析代码 | 客户端按照自己的需求编辑请求和解析代码。
没有接口,更不需要文档!客户端再也不用和服务端沟通接口或文档问题了! 兼容旧版 | 服务端增加新接口,用v2表示第2版接口,然后更新文档 | 什么都不用做! +
+ ###

2.2 客户端请求

客户端请求 | 传统方式 | APIJSON -------- | ------------ | ------------ - 要求 | 客户端按照文档在对应url后面拼接键值对 | 客户端按照自己的需求在固定url后拼接JSON - 结构 | base_url/lowercase_table_name?key0=value0&key1=value1...
¤tUserId=100&loginPassword=1234

其中currentUserId和loginPassword只在请求部分接口时需要 | base_url/{TableName0:{key0:value0, key1:value1 ...}, TableName1:{...}...
, currentUserId:100, loginPassword:1234}

其中currentUserId和loginPassword只在请求部分接口时需要 - URL | 不同的请求对应不同的url | 相同的请求方法(GET,POST等)都用同一个url + 要求 | 客户端按照文档在对应URL后面拼接键值对 | 客户端按照自己的需求在固定URL后拼接JSON + 结构 | 同一个URL内table_name只能有一个

base_url/get/table_name?
key0=value0&key1=value1... | 同一个URL后TableName可传任意数量个

base_url/get/
{
   TableName0:{
     key0:value0,
     key1:value1,
     ...
   },
   TableName1:{
     ...
   }
   ...
} + URL | 不同的请求对应不同的URL,基本上有多少个不同的请求就得有多少个接口URL | 相同的操作方法(增删改查)都用同一个URL,
大部分请求都用7个通用接口URL的其中一个 键值对 | key=value | key:value +
+ ###

2.3 服务端操作

服务端操作 | 传统方式 | APIJSON -------- | ------------ | ------------ 解析和返回 | 取出键值对,把键值对作为条件用预设的的方式去查询数据库,最后封装JSON并返回给客户端 | 把Parser#parse方法的返回值返回给客户端就行 返回JSON结构的设定方式 | 由服务端设定,客户端不能修改 | 由客户端设定,服务端不能修改 +
+ ###

2.4 客户端解析

客户端解析 | 传统方式 | APIJSON -------- | ------------ | ------------ - 查看方式 | 查文档或等请求成功后看log | 看请求就行,所求即所得。也可以等请求成功后看log - 方法 | 解析JSONObject | 可以用JSONResponse解析JSONObject或传统方式 + 查看方式 | 查文档或问后端,或等请求成功后看日志 | 看请求就行,所求即所得,不用查、不用问、不用等。也可以等请求成功后看日志 + 解析方法 | 用JSON解析器来解析JSONObject | 可以用JSONResponse解析JSONObject,或使用传统方式 + +
###

2.5 客户端对应不同需求的请求

- 客户端对应不同需求的请求 | 传统方式 | APIJSON + 客户端的请求 | 传统方式 | APIJSON -------- | ------------ | ------------ - User | base_url/get/user?id=1 | [base_url/get/{"User":{"id":1}}](http://139.196.140.118:8080/get/{"User":{"id":38710}}) - Moment和对应的User | 分两次请求
Moment: base_url/get/moment?userId=1
User: base_url/get/user?id=1 | [base_url/get/{"Moment":{"userId":1}, "User":{"id":1}}](http://139.196.140.118:8080/get/{"Moment":{"userId":38710},"User":{"id":38710}}) - User列表 | base_url/get/user/list?page=0&count=3&sex=0 | [base_url/get/{"[]":{"page":0, "count":3, "User":{"sex":0}}}](http://139.196.140.118:8080/get/{"[]":{"page":0,"count":3,"User":{"sex":0}}}) - Moment列表,每个Moment包括发布者User和前3条Comment | Moment里必须有User的Object和Comment的Array
base_url/get/moment/list?page=0&count=3&commentCount=3 | [base_url/get/{"[]":{"page":0, "count":3, "Moment":{}, "User":{"id@":"/Moment/userId"}, "[]":{"count":3, "Comment":{"momentId@":"[]/Moment/id"}}}}](http://139.196.140.118:8080/get/{"[]":{"page":0,"count":3,"Moment":{},"User":{"id@":"%252FMoment%252FuserId"},"[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) - User发布的Moment列表,每个Moment包括发布者User和前3条Comment | Moment里必须有User的Object和Comment的Array
base_url/get/moment/list?page=0&count=3&commentCount=3&userId=1 | 有以下几种方法:
① 把以上请求里的"Moment":{}, "User":{"id@":"/Moment/userId"}改为["Moment":{"userId":1}, "User":{"id":1}](http://139.196.140.118:8080/get/{"[]":{"page":0,"count":3,"Moment":{"userId":38710},"User":{"id":38710},"[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}})

② 或这样省去重复的User
[base_url/get/{"User":{"id":1}, "[]":{"page":0, "count":3, "Moment":{"userId":1}, "[]":{"count":3, "Comment":{"momentId@":"[]/Moment/id"}}}}](http://139.196.140.118:8080/get/{"User":{"id":38710},"[]":{"page":0,"count":3,"Moment":{"userId":38710},"[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}})

③ 如果User之前已经获取到了,还可以这样省去所有重复User
[base_url/get/{"[]":{"page":0, "count":3, "Moment":{"userId":1}, "[]":{"count":3, "Comment":{"momentId@":"[]/Moment/id"}}}}](http://139.196.140.118:8080/get/{"[]":{"page":0,"count":3,"Moment":{"userId":38710},"[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) + User | base_url/get/user?id=38710 | [base_url/get/
{
   "User":{
     "id":38710
   }
}](http://39.108.143.172:8080/get/{"User":{"id":38710}}) + Moment和对应的User | 分两次请求
Moment:
base_url/get/moment?userId=38710

User:
base_url/get/user?id=38710 | [base_url/get/
{
   "Moment":{
     "userId":38710
   },
   "User":{
     "id":38710
   }
}](http://39.108.143.172:8080/get/{"Moment":{"userId":38710},"User":{"id":38710}}) + User列表 | base_url/get/user/list?
page=0&count=3&sex=0 | [base_url/get/
{
   "User[]":{
     "page":0,
     "count":3,
     "User":{
       "sex":0
     }
   }
}](http://39.108.143.172:8080/get/{"User[]":{"page":0,"count":3,"User":{"sex":0}}}) + Moment列表,
每个Moment包括
1.发布者User
2.前3条Comment | Moment里必须有
1.User对象
2.Comment数组

base_url/get/moment/list?
page=0&count=3&commentCount=3 | [base_url/get/
{
   "[]":{
     "page":0,
     "count":3,
     "Moment":{},
     "User":{
       "id@":"/Moment/userId"
     },
     "Comment[]":{
       "count":3,
       "Comment":{
         "momentId@":"[]/Moment/id"
       }
     }
   }
}](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":3,"Moment":{},"User":{"id@":"%252FMoment%252FuserId"},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) + User发布的Moment列表,
每个Moment包括
1.发布者User
2.前3条Comment | 1.Moment里必须有User对象和Comment数组
2.字段名必须查接口文档,例如评论数量字段名可能是
commentCount,comment_count或者简写cmt_count等各种奇葩写法...

base_url/get/moment/list?
page=0&count=3
&commentCount=3&userId=38710 | 有以下几种方式:

① 把以上请求里的
"Moment":{}, "User":{"id@":"/Moment/userId"}
改为
["Moment":{"userId":38710}, "User":{"id":38710}](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":3,"Moment":{"userId":38710},"User":{"id":38710},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}})

② 或把User放在上面的最外层省去重复的User
[base_url/get/
{
   "User":{
     "id":38710
   },
   "[]":{
     "page":0,
     "count":3,
     "Moment":{
       "userId":38710
     },
     "Comment[]":{
       "count":3,
       "Comment":{
         "momentId@":"[]/Moment/id"
       }
     }
   }
}](http://39.108.143.172:8080/get/{"User":{"id":38710},"[]":{"page":0,"count":3,"Moment":{"userId":38710},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}})

③ 如果User之前已经获取到了,还可以不传User来节省请求和返回数据的流量并提升速度
[base_url/get/
{
   "[]":{
     "page":0,
     "count":3,
     "Moment":{
       "userId":38710
     },
     "Comment[]":{
       "count":3,
       "Comment":{
         "momentId@":"[]/Moment/id"
       }
     }
   }
}](http://39.108.143.172:8080/get/{"[]":{"page":0,"count":3,"Moment":{"userId":38710},"Comment[]":{"count":3,"Comment":{"momentId@":"[]%252FMoment%252Fid"}}}}) + +
###

2.6 服务端对应不同请求的返回结果

- 服务端对应不同请求的返回结果 | 传统方式 | APIJSON + 服务端的返回结果 | 传统方式 | APIJSON -------- | ------------ | ------------ - User | {"status":200, "message":"success", "data":{"id":1, "name":"xxx"...}} | {"status":200, "message":"success", "User":{"id":1, "name":"xxx"...}} - Moment和对应的User | 分别返回两次请求的结果
Moment: {"status":200, "message":"success", "data":{"id":1, "name":"xxx"...}}
User: {"status":200, "message":"success", "data":{"id":1, "name":"xxx"...}} | {"status":200, "message":"success", "Moment":{"id":1, "content":"xxx"...}, "User":{"id":1, "name":"xxx"...}} - User列表 | {"status":200, "message":"success", "data":[{"id":1, "name":"xxx"...}, {"id":2...}...]} | {"status":200, "message":"success", "[]":[{"User":{"id":1, "name":"xxx"...}}, {"User":{"id":2...}}...]} - Moment列表,每个Moment包括发布者User和前3条Comment | {"status":200, "message":"success", "data":[{"id":1, "content":"xxx"..., "User":{...}, "Comment":[...]}, {"id":2...}...]} | {"status":200, "message":"success", "[]":[{"Moment":{"id":1, "content":"xxx", ...}, "User":{...}, "[]":[{"Comment":{...}}, ...]}, ...]} - User发布的Moment列表,每个Moment包括发布者User和前3条Comment | {"status":200, "message":"success", "data":[{"id":1, "content":"xxx"..., "User":{...}, "Comment":[...]}, {"id":2...} ...]} | 以上不同请求方法的结果:
① {"status":200, "message":"success", "[]":[{"User":{"id":1, "name":"xxx", ...}, "Moment":{...}, "[]":[{"Comment":{...}}, ...]}, ...]}

② {"status":200, "message":"success", "User":{...}, "[]":[{"Moment":{"id":1, "content":"xxx", ...}, "[]":[{"Comment":{...}, ...}, ...]}, ...]}

③ {"status":200, "message":"success", "[]":[{"Moment":{"id":1, "content":"xxx", ...}, "[]":[{"Comment":{}}, ...]}, ...]} - + User | {
   "data":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} | {
   "User":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} + Moment和对应的User | 分别返回两次请求的结果,获取到Moment后取出userId作为User的id条件去查询User

Moment:
{
   "data":{
     "id":235,
     "content":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
}

User:
{
   "data":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} | 一次性返回,没有传统方式导致的 长时间等待结果、两次结果间关联、线程多次切换 等问题

{
   "Moment":{
     "id":235,
     "content":"xxx",
     ...
   },
   "User":{
     "id":38710,
     "name":"xxx",
     ...
   },
   "code":200,
   "msg":"success"
} + User列表 | {
   "data":[
     {
       "id":38710,
       "name":"xxx",
       ...
     },
     {
       "id":82001,
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} | {
   "User[]":[
     {
       "id":38710,
       "name":"xxx",
       ...
     },
     {
       "id":82001,
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} + Moment列表,每个Moment包括发布者User和前3条Comment | Moment里必须有
1.User对象
2.Comment数组

{
   "data":[
     {
       "id":235,
       "content":"xxx",
       ...,
       "User":{
         ...
       },
       "Comment":[
         ...
       ]
     },
     {
       "id":301,
       "content":"xxx",
       ...,
       "User":{
         ...
       },
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} | 1.高灵活,可任意组合
2.低耦合,逻辑很清晰

{
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "User":{
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     {
       "Moment":{
         "id":301,
         "content":"xxx",
         ...
       },
       "User":{
         ...
       },
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} + User发布的Moment列表,每个Moment包括发布者User和前3条Comment | 1.大量重复User,浪费流量和服务器性能
2.优化很繁琐,需要后端扩展接口、写好文档,前端/客户端再配合优化

{
   "data":[
     {
       "id":235,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     {
       "id":470,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     {
       "id":511,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     {
       "id":595,
       "content":"xxx",
       ...,
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment":[
         ...
       ]
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
} | 以上不同请求方式的结果:

① 常规请求
{
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "User":{
         "id":38710,
         "name":"Tommy"
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     ...
   ],
   "code":200,
   "msg":"success"
}

② 省去重复的User
{
   "User":{
     "id":38710,
     "name":"Tommy",
     ...
   },
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     ...
   ],
   "code":200,
   "msg":"success"
}

③ 不查询已获取到的User
{
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     ...
   ],
   "code":200,
   "msg":"success"
} -1.base_url指基地址,一般是顶级域名,其它分支url都是在base_url后扩展。如base_url:http://www.google.com/ ,对应的GET分支url:http://www.google.com/get/ ,下同。
-2.请求中的 / 需要转义。JSONRequest.java已经用URLEncoder.encode转义,不需要再写;但如果是浏览器或Postman等直接输入url/request,需要把request中的所有 / 都改成 %252F ,下同。
-3.status,指返回结果中的状态码,200表示成功,其它都是错误码,值全部都是HTTP标准状态码。下同。
-4.message,指返回结果中的状态信息,对成功结果或错误原因的详细说明。下同。
-5.status和message总是在返回结果的同一层级成对出现。对所有请求的返回结果都会在最外层有一对总结式status和message。对非GET类请求,返回结果里面的每个JSONObject里都会有一对status和message说明这个JSONObject的状态。下同。
-6.id等字段对应的值仅供说明,不一定是数据库里存在的,请求里用的是真实存在的值。下同。 -##

3.请求方法、URL、Request、Response对应关系总览

+1.base_url指基地址,一般是顶级域名,其它分支url都是在base_url后扩展。如base_url:http://www.google.com/ ,对应的GET分支url:http://www.google.com/get/ 。下同。
+2.请求中的key或value任意一个为null值时,这个 key:value键值对 被视为无效。下同。
+3.请求中的 / 需要转义。JSONRequest.java已经用URLEncoder.encode转义,不需要再写;但如果是浏览器或Postman等直接输入url/request,需要把request中的所有 / 都改成 %252F 。下同。
+4.code,指返回结果中的状态码,200表示成功,其它都是错误码,值全部都是HTTP标准状态码。下同。
+5.msg,指返回结果中的状态信息,对成功结果或错误原因的详细说明。下同。
+6.code和msg总是在返回结果的同一层级成对出现。对所有请求的返回结果都会在最外层有一对总结式code和msg。对非GET类型的请求,返回结果里面的每个JSONObject里都会有一对code和msg说明这个JSONObject的状态。下同。
+7.id等字段对应的值仅供说明,不一定是数据库里存在的,请求里用的是真实存在的值。下同。 -  方法及说明 | URL | Request | Response ------------- | ------------ | ------------ | ------------ -GET:普通获取请求,明文,可用浏览器调试 | base_url/get/ | {TableName:{…}},{…}内为限制条件。
例如获取一个id为1的Moment:
{"Moment":{"id":1}} | {TableName:{...}, "status":200, "message":"success"}
例如
{"Moment":{"id":1, "userId":1, "content":"APIJSON,let interfaces and documents go to hell !"}, "status":200, "message":"success"} -HEAD:普通获取数量请求,明文,可用浏览器调试 | base_url/head/ | {TableName:{…}},{…}内为限制条件。
例如获取一个id为1的User所发布的Moment总数:
{"Moment":{"userId":1}} | {TableName:{"status":200, "message":"success", "count":10}, "status":200, "message":"success"}
例如
{"Moment":{"status":200, "message":"success", "count":10}, "status":200, "message":"success"} -POST_GET:安全/私密获取请求,非明文,用于获取钱包等对安全性要求高的数据 | base_url/post_get/ | 最外层加一个"tag":tag,其它同GET | 同GET -POST_HEAD:安全/私密获取数量请求,非明文,用于获取银行卡数量等对安全性要求高的数据 | base_url/post_head/ | 最外层加一个"tag":tag,其它同HEAD | 同HEAD -POST:新增数据,非明文 | base_url/post/ | {TableName:{…}, "tag":tag},{…}中id由服务端生成,客户端不能传。
例如一个id为1的User发布一个新Moment:
{"Moment":{"userId":1, "content":"APIJSON,let interfaces and documents go to hell !"}, "tag":"Moment"} | {TableName:{"status":200, "message":"success", "id":1}, "status":200, "message":"success"}
例如
{"Moment":{"status":200, "message":"success", "id":1}, "status":200, "message":"success"} -PUT:修改数据,非明文,只修改所传的字段 | base_url/put/ | {TableName:{"id":id,…}, "tag":tag},{…}中id必传。
例如修改id为1的Moment的content:
{"Moment":{"id":1,"content":"APIJSON,let interfaces and documents go to hell !"}, "tag":"Moment"} | 同POST -DELETE:删除数据,非明文 | base_url/delete/ | {TableName:{"id":id}, "tag":tag},{…}中id必传,一般只传id。
例如删除id为1的Moment:
{"Moment":{"id":1}, "tag":"Moment"} | 同POST +
+
+##

3.对应关系总览

-1.TableName指要查询的table的名称字符串。第一个字符为大写字母,剩下的字符要符合英语字母、数字、下划线中的任何一种。对应的值为内部所传字段符合对应Table的JSONObject,结构是{...}
-2."tag":tag 后面的tag是非GET、HEAD请求中匹配请求的JSON结构的key,一般是要查询的table的名称,由服务端Request表中指定。
-3.非GET、HEAD请求,其对应的 方法、tag、结构 必须和 服务端Request表中指定的 一一对应,否则请求将不被通过。
-4.POST_GET与GET、POST_HEAD与HEAD分别为同类方法,请求方式不同但返回结果相同。下同。
-5.在HTTP通信中,GET、HEAD方法一般用HTTP GET请求,其它一般用HTTP POST请求。下同。 +###

3.1 操作方法

- - - -##

4.功能符

+  方法及说明 | URL | Request | Response +------------ | ------------ | ------------ | ------------ +GET:
普通获取数据,
明文,
可用浏览器调试 | base_url/get/ | {
   TableName:{
     …
   }
}
{…}内为限制条件

例如获取一个id为235的Moment:
{
   "Moment":{
     "id":235
   }
} | {
   TableName:{
     ...
   },
   "code":200,
   "msg":"success"
}
例如
{
   "Moment":{
     "id":235,
     "userId":38710,
     "content":"APIJSON,let interfaces and documents go to hell !"
   },
   "code":200,
   "msg":"success"
} +HEAD:
普通获取数量,
明文,
可用浏览器调试 | base_url/head/ | {
   TableName:{
     …
   }
}
{…}内为限制条件

例如获取一个id为38710的User所发布的Moment总数:
{
   "Moment":{
     "userId":38710
   }
} | {
   TableName:{
     "code":200,
     "msg":"success",
     "count":10
   },
   "code":200,
   "msg":"success"
}
例如
{
   "Moment":{
     "code":200,
     "msg":"success",
     "count":10
   },
   "code":200,
   "msg":"success"
} +GETS:
安全/私密获取数据,
非明文,
用于获取钱包等
对安全性要求高的数据 | base_url/gets/ | 最外层加一个"tag":tag,其它同GET | 同GET +HEADS:
安全/私密获取数量,
非明文,
用于获取银行卡数量等
对安全性要求高的数据总数 | base_url/heads/ | 最外层加一个"tag":tag,其它同HEAD | 同HEAD +POST:
新增数据,
非明文 | base_url/post/ | {
   TableName:{
     …
   },
   "tag":tag
}
{…}中id由服务端生成,不能传

例如一个id为38710的User发布一个新Moment:
{
   "Moment":{
     "userId":38710,
     "content":"APIJSON,let interfaces and documents go to hell !"
   },
   "tag":"Moment"
} | {
   TableName:{
     "code":200,
     "msg":"success",
     "id":38710
   },
   "code":200,
   "msg":"success"
}
例如
{
   "Moment":{
     "code":200,
     "msg":"success",
     "id":120
   },
   "code":200,
   "msg":"success"
} +PUT:
修改数据,
非明文,
只修改所传的字段 | base_url/put/ | {
   TableName:{
     "id":id,
     …
   },
   "tag":tag
}
{…}中id必传

例如修改id为235的Moment的content:
{
   "Moment":{
     "id":235,
     "content":"APIJSON,let interfaces and documents go to hell !"
   },
   "tag":"Moment"
} | 同POST +DELETE:
删除数据,
非明文 | base_url/delete/ | {
   TableName:{
     "id":id
   },
   "tag":tag
}
{…}中id必传,一般只传id

例如删除id为120的Moment:
{
   "Moment":{
     "id":120
   },
   "tag":"Moment"
} | 同POST + + +1.TableName指要查询的数据库表Table的名称字符串。第一个字符为大写字母,剩下的字符要符合英语字母、数字、下划线中的任何一种。对应的值的类型为JSONObject,结构是 {...},里面放的是Table的字段(列名)。下同。
+2."tag":tag 后面的tag是非GET、HEAD请求中匹配请求的JSON结构的key,一般是要查询的table的名称,由服务端Request表中指定。下同。
+3.GET、HEAD请求是开放请求,可任意组合任意嵌套。其它请求为受限制的安全/私密请求,对应的 方法、tag、结构 都必须和 服务端Request表中所指定的 一一对应,否则请求将不被通过。下同。
+4.GETS与GET、HEADS与HEAD分别为同一类型的操作方法,请求稍有不同但返回结果相同。下同。
+5.在HTTP通信中,GET、HEAD方法一般用HTTP GET请求,其它一般用HTTP POST请求。下同。
+6.所有JSONObject都视为容器(或者文件夹),结构为 {...} ,里面可以放普通对象或子容器。下同。
+7.每个对象都有一个唯一的路径(或者叫地址),假设对象名为refKey,则用 key0/key1/.../refKey 表示。下同。 + +
+ +###

3.2 功能符

功能 | 键值对格式 | 使用示例 ------------ | ------------ | ------------ - 查询数组 | "key[]":{},后面是JSONObject,key可省略。当key和内部Table名相同时,JSONResponse#format会把Table提取出来,即将 {Table:{Content}} 转化为 {Content} | [{"User[]":{"User":{}}}](http://139.196.140.118:8080/get/{"User[]":{"count":3,"User":{}}}),查询一个User数组。这里key和Table名都是User,会提取User,即将 {"User":{"id", ...}} 转化为 {"id", ...} - 匹配选项范围 | "key{}":[],后面是JSONArray,作为key可取的值的选项 | ["id{}":[38710,82001,70793]](http://139.196.140.118:8080/get/{"User[]":{"count":3,"User":{"id{}":[38710,82001,70793]}}}),查询id符合38710,82001,70793中任意一个的一个User数组 - 匹配条件范围 | "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a' | ["id{}":"<=80000,\>90000"](http://139.196.140.118:8080/get/{"User[]":{"count":3,"User":{"id{}":"<=80000,\>90000"}}}),查询id符合id\<=80000 \| id>90000的一个User数组 - 包含选项范围 | "key<\>":Object => "key<\>":[Object],key对应值的类型必须为JSONArray,Object类型不能为JSON | ["friendIdList<\>":38710](http://139.196.140.118:8080/get/{"User[]":{"count":3,"User":{"friendIdList<\>":38710}}}),查询friendIdList包含38710的一个User数组 - 远程调用函数 | "key()":"函数表达式",函数表达式为 function(Type0:value0,Type1:value1...)。函数参数类型为Object或泛型时可省略类型,即 Object:value 改写为 value | ["isPraised()":"isContain(Collection:praiseUserIdList,userId)"](http://139.196.140.118:8080/get/{"Moment":{"id":301,"isPraised()":"isContain(Collection:praiseUserIdList,userId)"}}),请求完成后会调用 boolean isContain(Collection collection, Object object) 函数,然后变为 "isPraised":true 这种(假设点赞用户id列表包含了userId,即这个User点了赞) - 依赖引用 | "key@":"依赖路径",依赖路径为用/分隔的字符串。以/开头的是缺省依赖路径,从声明key所处容器的父容器路径开始;其它是完整依赖路径,从最外层开始。被依赖的对象必须在声明key的上面 | ["userId@":"/User/id"](http://139.196.140.118:8080/get/{"User":{"id":38710},"Moment":{"userId@":"%252FUser%252Fid"}}),userId依赖引用与所处容器同级的User内的id值,假设id=1,则请求完成后会变成 "userId":1 - 模糊搜索 | "key$":"SQL搜索表达式" => "key$":["SQL搜索表达式"],任意SQL搜索表达式字符串,如 %key%, %k%e%y% 等 | ["name$":"%m%"](http://139.196.140.118:8080/get/{"User[]":{"count":3,"User":{"name$":"%2525m%2525"}}}),查询name包含"m"的一个User数组 - 新建别名 | "name:alias",name映射为alias,用alias替代name。可用于 column,Table,SQL函数 等。只用于GET类方法、HEAD类方法的请求 | ["@column":"toId:parentId"](http://139.196.140.118:8080/get/{"Comment":{"@column":"id,toId:parentId","id":51}}),将查询的字段toId变为parentId返回 - 增加 或 扩展 | "key+":key指定类型的Object,且类型为Number,String,JSONArray中的一种。如 1,"apijson",["url0","url1"] 等。只用于PUT请求 | "praiseUserIdList+":[1],添加一个点赞用户id,即该用户点了赞 - 减少 或 去除 | "key-":key指定类型的Object,同"key+" | "balance-":100.00,余额减少100.00,即花费了100元 - 逻辑运算 | &, \|, ! 逻辑运算符。
① & 可用于"key&{}":"条件"等
② \| 可用于"key\|{}":"条件", "key\|{}":[]等,一般可省略
③ ! 可单独使用,如"key!":Object,也可像&,\|一样配合其他功能符使用 | ① ["id&{}":">80000,<=90000"](http://139.196.140.118:8080/head/{"User":{"id&{}":">80000,<=90000"}}),即id满足id>80000 & id<=90000
② ["id\|{}":">90000,<=80000"](http://139.196.140.118:8080/head/{"User":{"id\|{}":">90000,<=80000"}}),同"id{}":">90000,<=80000",即id满足id>90000 \| id<=80000
③ ["id!{}":[82001,38710]](http://139.196.140.118:8080/head/{"User":{"id!{}":[82001,38710]}}),即id满足 ! (id=82001 \| id=38710),可过滤黑名单的消息 - 关键词,可自定义 | "@key":key指定类型的Object,@key为JSONObject中的关键词
① "@column":"key0,key1...", 指定返回字段
② "@order":"key0,key1+,key2-...",指定排序方式
③ "@group":"key0,key1,key2...",指定分组方式。如果@column里声明了Table主键(一般是id),则该主键也必须在@group中声明;其它情况下必须满足至少一个条件:1.分组的key在@column里声明;2.Table主键在@group中声明
④ "@having":"function0(...)?valu0,function1(...)?valu1,function2(...)?value2...",指定函数条件,一般和@group一起用,函数一般在@column里声明 | ① 只查询id,sex,name这几列并且请求结果也按照这个顺序:
["@column":"id,sex,name"](http://139.196.140.118:8080/get/{"User":{"@column":"id,sex,name","id":38710}})
② 查询按 name降序、id默认顺序 排序的User数组:
["@order":"name-,id"](http://139.196.140.118:8080/get/{"[]":{"count":10,"User":%7B"@column":"name,id","@order":"name-,id"}}})
③ 查询按userId分组的Moment数组:
["@group"="userId,id"](http://139.196.140.118:8080/get/{"[]":{"count":10,"Moment":%7B"@column":"userId,id","@group":"userId,id"}}})
④ 查询 按userId分组、id最大值>=100 的Moment数组:
["@column":"userId,max(id)",
"@group":"userId",
"@having":"max(id)>=100"](http://139.196.140.118:8080/get/{"[]":{"count":10,"Moment":{"@column":"userId,max(id)","@group":"userId","@having":"max(id)>=100"}}})
还可以指定函数返回名:
["@column":"userId,max(id):maxId",
"@group":"userId",
"@having":"maxId>=100"](http://139.196.140.118:8080/get/{"[]":{"count":10,"Moment":{"@column":"userId,max(id):maxId","@group":"userId","@having":"maxId>=100"}}})
⑤ 从pictureList获取第0张图片:
["@position":0, //这里@position为自定义关键词
"firstPicture()":"get(Collection:pictureList,int:@position)"](http://139.196.140.118:8080/get/{"User":{"id":38710,"@position":0,"firstPicture()":"get(Collection:pictureList,int:@position)"}})
... - -##

5.使用方法

- -###

5.1 下载后解压APIJSON工程

+ 查询数组 | "key[]":{},后面是JSONObject,key可省略。当key和里面的Table名相同时,Table会被提取出来,即 {Table:{Content}} 会被转化为 {Content} | [{"User[]":{"User":{}}}](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{}}}),查询一个User数组。这里key和Table名都是User,User会被提取出来,即 {"User":{"id", ...}} 会被转化为 {"id", ...} + 匹配选项范围 | "key{}":[],后面是JSONArray,作为key可取的值的选项 | ["id{}":[38710,82001,70793]](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"id{}":[38710,82001,70793]}}}),查询id符合38710,82001,70793中任意一个的一个User数组 + 匹配条件范围 | "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a' | ["id{}":"<=80000,\>90000"](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"id{}":"<=80000,\>90000"}}}),查询id符合id\<=80000 \| id>90000的一个User数组 + 包含选项范围 | "key<\>":Object => "key<\>":[Object],key对应值的类型必须为JSONArray,Object类型不能为JSON | ["contactIdList<\>":38710](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"contactIdList<\>":38710}}}),查询contactIdList包含38710的一个User数组 + 远程调用函数 | "key()":"函数表达式",函数表达式为 function(Type0:value0,Type1:value1...)。函数参数类型为Object或泛型时可省略类型,即 Object:value 改写为 value | ["isPraised()":"isContain(Collection:praiseUserIdList,userId)"](http://39.108.143.172:8080/get/{"Moment":{"id":301,"isPraised()":"isContain(Collection:praiseUserIdList,userId)"}}),请求完成后会调用 boolean isContain(Collection collection, Object object) 函数,然后变为 "isPraised":true 这种(假设点赞用户id列表包含了userId,即这个User点了赞) + 引用赋值 | "key@":"引用路径",引用路径为用/分隔的字符串。以/开头的是缺省引用路径,从声明key所处容器的父容器路径开始;其它是完整引用路径,从最外层开始。
被引用的refKey必须在声明key的上面。如果对refKey的容器指定了返回字段,则被引用的refKey必须写在@column对应的值内,例如 "@column":"refKey,key1,..." | ["Moment":{
   "userId":38710
},
"User":{
   "id@":"/Moment/userId"
}](http://39.108.143.172:8080/get/{"Moment":{"userId":38710},"User":{"id@":"%252FMoment%252FuserId"}})
User内的id引用了与User同级的Moment内的userId,
即User.id = Moment.userId,请求完成后
"id@":"/Moment/userId" 会变成 "id":38710 + 模糊搜索 | "key$":"SQL搜索表达式" => "key$":["SQL搜索表达式"],任意SQL搜索表达式字符串,如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等,%表示任意字符 | ["name$":"%m%"](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"name$":"%2525m%2525"}}}),查询name包含"m"的一个User数组 + 正则匹配 | "key?":"正则表达式" => "key?":["正则表达式"],任意正则表达式字符串,如 ^[0-9]+$ ,可用于高级搜索 | ["name?":"^[0-9]+$"](http://39.108.143.172:8080/get/{"User[]":{"count":3,"User":{"name%253F":"^[0-9]%252B$"}}}),查询name中字符全为数字的一个User数组 + 新建别名 | "name:alias",name映射为alias,用alias替代name。可用于 column,Table,SQL函数 等。只用于GET类型、HEAD类型的请求 | ["@column":"toId:parentId"](http://39.108.143.172:8080/get/{"Comment":{"@column":"id,toId:parentId","id":51}}),将查询的字段toId变为parentId返回 + 增加 或 扩展 | "key+":Object,Object的类型由key指定,且类型为Number,String,JSONArray中的一种。如 82001,"apijson",["url0","url1"] 等。只用于PUT请求 | "praiseUserIdList+":[82001],添加一个点赞用户id,即这个用户点了赞 + 减少 或 去除 | "key-":Object,与"key+"相反 | "balance-":100.00,余额减少100.00,即花费了100元 + 逻辑运算 | &, \|, ! 逻辑运算符。
① & 可用于"key&{}":"条件"等
② \| 可用于"key\|{}":"条件", "key\|{}":[]等,一般可省略
③ ! 可单独使用,如"key!":Object,也可像&,\|一样配合其他功能符使用 | ① ["id&{}":">80000,<=90000"](http://39.108.143.172:8080/head/{"User":{"id&{}":">80000,<=90000"}}),即id满足id>80000 & id<=90000
② ["id\|{}":">90000,<=80000"](http://39.108.143.172:8080/head/{"User":{"id\|{}":">90000,<=80000"}}),同"id{}":">90000,<=80000",即id满足id>90000 \| id<=80000
③ ["id!{}":[82001,38710]](http://39.108.143.172:8080/head/{"User":{"id!{}":[82001,38710]}}),即id满足 ! (id=82001 \| id=38710),可过滤黑名单的消息 + 数组关键词 | "key":Object,key为 "[]":{} 中{}内的关键词,Object的类型由key指定
① "count":Integer,指定查询数量,假设允许查询数组的最大数量为max,则当count在1~max范围内时,查询count个;否则查询max个
② "page":Integer,指定查询页码,从0开始,一般和count一起用
③ "query":Integer,指定查询内容
0-对象,1-总数,2-以上全部
总数关键词为total,和query同级,通过引用赋值得到,如 "total@":"/[]/total"
这里query及total仅为GET类型的请求提供方便,一般可直接用HEAD类型的请求获取总数 | ① 查询User数组,最多5个:
["count":5](http://39.108.143.172:8080/get/{"[]":{"count":5,"User":{}}})
② 查询第3页的User数组,每页5个:
["count":5,
"page":3](http://39.108.143.172:8080/get/{"[]":{"count":5,"page":3,"User":{}}})
③ 查询User数组和对应的User总数:
["[]":{
   "query":2,
   "User":{}
},
"total@":"/[]/total"](http://39.108.143.172:8080/get/{"[]":{"query":2,"count":5,"User":{}},"total@":"%252F[]%252Ftotal"}) + 对象关键词,可自定义 | "@key":Object,@key为 Table:{} 中{}内的关键词,Object的类型由@key指定
① "@about":true, 查询字段属性
② "@column":"key0,key1...", 指定返回字段
③ "@order":"key0,key1+,key2-...",指定排序方式
④ "@group":"key0,key1,key2...",指定分组方式。如果@column里声明了Table的id,则id也必须在@group中声明;其它情况下必须满足至少一个条件:
1.分组的key在@column里声明
2.Table主键在@group中声明
⑤ "@having":"function0(...)?valu0,function1(...)?valu1,function2(...)?value2...",指定SQL函数条件,一般和@group一起用,函数一般在@column里声明 | ① 查询User表中字段的属性:
["@about":true](http://39.108.143.172:8080/get/{"User[]":{"User":{"@about":true}}})
② 只查询id,sex,name这几列并且请求结果也按照这个顺序:
["@column":"id,sex,name"](http://39.108.143.172:8080/get/{"User":{"@column":"id,sex,name","id":38710}})
③ 查询按 name降序、id默认顺序 排序的User数组:
["@order":"name-,id"](http://39.108.143.172:8080/get/{"[]":{"count":10,"User":{"@column":"name,id","@order":"name-,id"}}})
④ 查询按userId分组的Moment数组:
["@group":"userId,id"](http://39.108.143.172:8080/get/{"[]":{"count":10,"Moment":%7B"@column":"userId,id","@group":"userId,id"}}})
⑤ 查询 按userId分组、id最大值>=100 的Moment数组:
["@column":"userId,max(id)",
"@group":"userId",
"@having":"max(id)>=100"](http://39.108.143.172:8080/get/{"[]":{"count":10,"Moment":{"@column":"userId,max(id)","@group":"userId","@having":"max(id)>=100"}}})
还可以指定函数返回名:
["@column":"userId,max(id):maxId",
"@group":"userId",
"@having":"maxId>=100"](http://39.108.143.172:8080/get/{"[]":{"count":10,"Moment":{"@column":"userId,max(id):maxId","@group":"userId","@having":"maxId>=100"}}})
⑥ 从pictureList获取第0张图片:
["@position":0, //这里@position为自定义关键词
"firstPicture()":"get(Collection:pictureList,int:@position)"](http://39.108.143.172:8080/get/{"User":{"id":38710,"@position":0,"firstPicture()":"get(Collection:pictureList,int:@position)"}})
... + +
+
+ +##

4.快速上手

+ +###

4.1 下载后解压APIJSON工程

Clone or download > Download ZIP > 解压到一个路径并记住这个路径。 -#### 你可以跳过步骤5.2和步骤5.3,用我的服务器IP地址 139.196.140.118:8080 来测试服务端对客户端请求的返回结果。 +#### 你可以跳过步骤4.2和步骤4.3,用我的服务器IP地址 39.108.143.172:8080 来测试服务端对客户端请求的返回结果。 -###

5.2 导入MySQL table文件

+###

4.2 导入表文件到数据库

服务端需要MySQL Server和MySQLWorkbench,没有安装的都先下载安装一个。
我的配置是Windows 7 + MySQL Community Server 5.7.16 + MySQLWorkbench 6.3.7 和 OSX EI Capitan + MySQL Community Server 5.7.16 + MySQLWorkbench 6.3.8,其中系统和软件都是64位的。 启动MySQLWorkbench > 进入一个Connection > 点击Server菜单 > Data Import > 选择刚才解压路径下的APIJSON-Master/table > Start Import > 刷新SCHEMAS, 左下方sys/tables会出现添加的table。 -###

5.3 用Eclipse for JavaEE或IntellIJ IDEA Ultimate运行服务端工程

+###

4.3 用Eclipse for JavaEE或IntellIJ IDEA Ultimate运行服务端工程

如果以上编辑器一个都没安装,运行前先下载安装一个。
我的配置是Windows 7 + JDK 1.7.0_71 + Eclipse 4.6.1 + IntellIJ 2016.3 和 OSX EI Capitan + JDK 1.8.0_91 + Eclipse 4.6.1 + IntellIJ 2016.2.5 @@ -374,7 +468,7 @@ Open > 选择刚才解压路径下的APIJSON-Master/APIJSON(Server)/APIJSON(Idea 2.运行
Run > Run APIJSONApplication -###

5.4 用ADT Bundle或Android Studio运行客户端工程

+###

4.4 用ADT Bundle或Android Studio运行客户端工程

可以跳过这个步骤,直接下载下方提供的客户端App。 @@ -397,27 +491,33 @@ Open an existing Android Studio project > 选择刚才解压路径下的APIJSON- 2.运行
Run > Run app -###

5.5 操作客户端App

+###

4.5 操作客户端App

选择发送APIJSON请求并等待显示结果。
如果默认url不可用,修改为一个可用的,比如正在运行APIJSON服务端工程的电脑的IPV4地址,然后点击查询按钮重新请求。 -##

6.其它

+
+
+ +##

5.其它

-###

6.1 相关推荐

+###

5.1 相关推荐

[APIJSON, 让接口和文档见鬼去吧!](https://my.oschina.net/tommylemon/blog/805459) [仿QQ空间和微信朋友圈,高解耦高复用高灵活](https://my.oschina.net/tommylemon/blog/885787) +[后端开挂:3行代码写出8个接口!](https://my.oschina.net/tommylemon/blog/1574430) + [3步创建APIJSON服务端新表及配置](https://my.oschina.net/tommylemon/blog/889074) -###

6.2 关于作者

+###

5.2 关于作者

TommyLemon:[https://github.com/TommyLemon](https://github.com/TommyLemon)
+QQ群:607020115 -如果有什么问题或建议可以[提ISSUE](https://github.com/TommyLemon/APIJSON/issues)或者[发我邮件](https://github.com/TommyLemon),交流技术,分享经验。
+如果有什么问题或建议可以[提ISSUE](https://github.com/TommyLemon/APIJSON/issues)、加群或者[发我邮件](https://github.com/TommyLemon),交流技术,分享经验。
如果你解决了某些bug,或者新增了一些通用性强的功能,欢迎[贡献代码](https://github.com/TommyLemon/APIJSON/pulls),感激不尽^_^ -###

6.3 下载试用客户端App

+###

5.3 下载试用客户端App

仿微信朋友圈动态实战项目
[APIJSONApp.apk](http://files.cnblogs.com/files/tommylemon/APIJSONApp.apk) @@ -425,9 +525,9 @@ TommyLemon:[https://github.com/TommyLemon](https://github.com/TommyLemon)
[APIJSONTest.apk](http://files.cnblogs.com/files/tommylemon/APIJSONTest.apk) -###

6.4 更新日志

+###

5.4 更新日志

[https://github.com/TommyLemon/APIJSON/commits/master](https://github.com/TommyLemon/APIJSON/commits/master) -###

6.5 点Star支持我,点Fork研究它

+###

5.5 点Star支持我,点Fork研究它

[https://github.com/TommyLemon/APIJSON](https://github.com/TommyLemon/APIJSON) diff --git a/table/sys_Comment.sql b/table/sys_Comment.sql index 500bd72cf..c22c93db6 100644 --- a/table/sys_Comment.sql +++ b/table/sys_Comment.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,14 +23,14 @@ DROP TABLE IF EXISTS `Comment`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Comment` ( - `id` bigint(15) NOT NULL, - `toId` bigint(15) DEFAULT NULL, - `userId` bigint(15) NOT NULL, - `momentId` bigint(15) NOT NULL, - `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `content` varchar(1000) NOT NULL, + `id` bigint(15) NOT NULL COMMENT '唯一标识', + `toId` bigint(15) DEFAULT NULL COMMENT '被回复的id', + `userId` bigint(15) NOT NULL COMMENT '评论人id', + `momentId` bigint(15) NOT NULL COMMENT '动态id', + `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期', + `content` varchar(1000) NOT NULL COMMENT '内容', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='评论'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -39,7 +39,7 @@ CREATE TABLE `Comment` ( LOCK TABLES `Comment` WRITE; /*!40000 ALTER TABLE `Comment` DISABLE KEYS */; -INSERT INTO `Comment` VALUES (3,0,82002,371,'2017-02-01 11:20:50','This is a Content...-3'),(4,0,38710,470,'2017-02-01 11:20:50','This is a Content...-4'),(13,0,82005,58,'2017-02-01 11:20:50','This is a Content...-13'),(22,221,82001,470,'2017-02-01 11:20:50','This is a Content...-22'),(44,0,82003,170,'2017-02-01 11:20:50','This is a Content...-44'),(45,0,93793,301,'2017-02-01 11:20:50','This is a Content...-45'),(47,4,70793,470,'2017-02-01 11:20:50','This is a Content...-47'),(51,45,82003,301,'2017-02-01 11:20:50','This is a Content...-51'),(54,0,82004,170,'2017-02-01 11:20:50','This is a Content...-54'),(68,0,82005,371,'2017-02-01 11:20:50','This is a Content...-68'),(76,45,93793,301,'2017-02-01 11:20:50','This is a Content...-76'),(77,13,93793,58,'2017-02-01 11:20:50','This is a Content...-77'),(97,13,82006,58,'2017-02-01 11:20:50','This is a Content...-97'),(99,44,70793,170,'2017-02-01 11:20:50','This is a Content...-99'),(110,0,93793,371,'2017-02-01 11:23:24','This is a Content...-110'),(114,0,82001,371,'2017-03-02 05:56:06','This is a Content...-114'),(115,0,38710,371,'2017-03-02 05:56:06','This is a Content...-115'),(116,0,70793,371,'2017-03-02 05:56:06','This is a Content...-116'),(120,0,93793,301,'2017-03-02 05:56:06','This is a Content...-110'),(124,0,82001,301,'2017-03-02 05:56:06','This is a Content...-114'),(157,NULL,93793,371,'2017-02-01 11:20:50','This is a Content...-157'),(158,0,93793,301,NULL,'This is a Content...-157'),(160,0,82001,235,'2017-03-02 05:56:06','This is a Content...-160'),(162,0,93793,12,'2017-03-06 05:03:45','This is a Content...-162'),(163,0,82001,235,'2017-03-02 05:56:06','This is a Content...-163'),(164,0,93793,12,'2017-03-06 05:03:45','This is a Content...-164'),(167,NULL,82001,58,'2017-03-25 11:48:41','Nice!'),(168,1490442545077,82001,235,'2017-03-25 11:49:14','???'),(172,162,82001,12,'2017-03-25 12:22:58','OK'),(173,NULL,38710,58,'2017-03-25 12:25:13','Good'),(174,172,38710,1488691759538,'2017-03-25 12:26:00','what?'),(175,0,38710,12,'2017-03-25 12:26:53','Java is the best program language!'),(176,166,38710,15,'2017-03-25 12:28:03','thank you'),(178,NULL,38710,511,'2017-03-25 12:30:55','wbw'),(182,110,82001,371,'2017-03-26 06:12:52','hahaha'),(188,97,82001,58,'2017-03-26 07:21:32','1646'),(190,0,82001,58,'2017-03-26 07:22:13','dbdj'),(191,176,82001,592,'2017-03-26 07:49:29','zbsj'),(192,0,82001,592,'2017-03-26 07:49:35','sjsj'),(200,0,82001,592,'2017-03-27 03:20:16','oooo'),(201,0,82001,594,'2017-03-29 03:00:44','come on!'),(202,166,82001,592,'2017-03-29 03:01:08','eej'),(203,178,82001,592,'2017-03-29 03:01:14','znsk'),(204,169,82001,592,'2017-03-29 03:01:32','ghh'),(205,177,82001,592,'2017-03-29 03:01:37','hhh'),(206,54,82001,170,'2017-03-29 03:04:23','ejej'),(209,13,82001,58,'2017-03-29 03:05:59','hehj'),(300,97,82001,58,'2017-03-29 03:06:07','hj'),(301,194,82001,235,'2017-03-29 03:06:24','jj'),(304,195,82001,592,'2017-03-29 04:48:28','eej'),(305,188,82001,592,'2017-03-29 04:48:32','ssh'),(307,161,82001,592,'2017-03-29 04:48:51','ejej'),(308,0,82001,592,'2017-03-29 04:49:02','eheh'),(4001,0,82001,58,'2017-03-29 08:39:52','I would like to say …'),(1490776944301,0,82001,58,'2017-03-29 08:42:24','hello'),(1490776966828,173,82001,58,'2017-03-29 08:42:46','me too'),(1490777876202,192,82001,592,'2017-03-29 08:57:56','ghh'),(1490777905437,0,82001,543,'2017-03-29 08:58:25','rr'),(1490778122719,175,82001,12,'2017-03-29 09:02:02','Yeah! I think so!'),(1490778494751,1490778122719,82001,12,'2017-03-29 09:08:14','reply Android82001'),(1490778681337,166,82001,12,'2017-03-29 09:11:21','gg'),(1490780672012,164,82001,12,'2017-03-29 09:44:32','93793'),(1490780759866,99,82001,170,'2017-03-29 09:45:59','99'),(1490781009548,51,82001,301,'2017-03-29 09:50:09','3'),(1490781032005,45,82001,301,'2017-03-29 09:50:32','93793'),(1490781817044,209,38710,58,'2017-03-29 10:03:37','82001'),(1490781850893,1490776966828,38710,58,'2017-03-29 10:04:10','haha!'),(1490781857242,190,38710,58,'2017-03-29 10:04:17','nice'),(1490781865407,1490781857242,38710,58,'2017-03-29 10:04:25','wow'),(1490781899147,197,38710,12,'2017-03-29 10:04:59','kaka'),(1490781914528,1490780672012,38710,12,'2017-03-29 10:05:14','ops'),(1490794439561,1490778681337,82001,12,'2017-03-29 13:33:59','gg?'),(1490794610632,172,82001,12,'2017-03-29 13:36:50','All right'),(1490794937137,1490794919957,82001,12,'2017-03-29 13:42:17','All right ok ok'),(1490794953438,1490794937137,82001,12,'2017-03-29 13:42:33','All right ok ok ll'),(1490796241178,0,38710,58,'2017-03-29 14:04:01','Anything else?'),(1490796629591,175,38710,12,'2017-03-29 14:10:29','well'),(1490798710678,110,38710,371,'2017-03-29 14:45:10','110'),(1490800971064,175,38710,12,'2017-03-29 15:22:51','I do'),(1490848396072,175,82001,12,'2017-03-30 04:33:16','Lemon'),(1490848581424,166,82001,12,'2017-03-30 04:36:21','82001ejej'),(1490850764448,162,82001,12,'2017-03-30 05:12:44','-162'),(1490850844016,0,82001,12,'2017-03-30 05:14:04','I like it'),(1490850876656,1490800971064,82001,12,'2017-03-30 05:14:36','I do so'),(1490854894566,175,82001,12,'2017-03-30 06:21:34','it does be a good lang'),(1490863443219,1490850844016,82002,12,'2017-03-30 08:44:03','me too!'),(1490863469638,0,82002,15,'2017-03-30 08:44:29','Just do it'),(1490863507114,4,82003,470,'2017-03-30 08:45:07','yes'),(1490863563124,0,82003,704,'2017-03-30 08:46:03','I want one'),(1490863651493,0,70793,595,'2017-03-30 08:47:31','wow'),(1490863661426,1490780759866,70793,170,'2017-03-30 08:47:41','66'),(1490863676989,0,70793,12,'2017-03-30 08:47:56','Shy'),(1490863711703,0,70793,511,'2017-03-30 08:48:31','I hope I can join'),(1490863717947,178,70793,511,'2017-03-30 08:48:37','what?'),(1490863783276,1490863711703,93793,511,'2017-03-30 08:49:43','haha welcome'),(1490863903900,0,82006,470,'2017-03-30 08:51:43','SOGA'),(1490863915675,0,82006,235,'2017-03-30 08:51:55','Good boy'),(1490863938712,0,82006,12,'2017-03-30 08:52:18','Handsome!'),(1490863978239,1490796241178,82006,58,'2017-03-30 08:52:58','there still remains a question…'),(1490864016738,0,82006,511,'2017-03-30 08:53:36','I want to have a try!'),(1490864023700,0,82006,543,'2017-03-30 08:53:43','oops'),(1490864039264,0,82006,551,'2017-03-30 08:53:59','Wonderful!'),(1490864060358,308,82006,592,'2017-03-30 08:54:20','I an little girl'),(1490864075725,1490864060358,82006,592,'2017-03-30 08:54:35','do you like me?'),(1490864152008,0,82006,58,'2017-03-30 08:55:52','U R ugly( ´?` )'),(1490864254400,1490863915675,82044,235,'2017-03-30 08:57:34','And I have no idea'),(1490864276824,0,82044,12,'2017-03-30 08:57:56','Oh my God!'),(1490864292184,1490864152008,82044,58,'2017-03-30 08:58:12','haha!'),(1490864379424,1490863938712,82001,12,'2017-03-30 08:59:39','Thank you~'),(1490864400210,1490864276824,82001,12,'2017-03-30 09:00:00','Amazing, isnt it?'),(1490874908570,1490864023700,82055,543,'2017-03-30 11:55:08','yeah'),(1490874930994,1490777905437,82055,543,'2017-03-30 11:55:30','yy'),(1490874968779,0,82055,12,'2017-03-30 11:56:08','I love it'),(1490875033494,0,82055,301,'2017-03-30 11:57:13','More Comments'),(1490875040761,158,82055,301,'2017-03-30 11:57:20','157'),(1490875046704,120,82055,301,'2017-03-30 11:57:26','110'),(1490875660259,1490863469638,82055,15,'2017-03-30 12:07:40','I prove wht you said(??????)'),(1490879678127,0,82001,543,'2017-03-30 13:14:38','Baby you are a firework!'),(1490972390235,1490863903900,82001,470,'2017-03-31 14:59:50','HaHa'),(1490973736662,1490973715568,70793,170,'2017-03-31 15:22:16','Hello, I am a fresh man'),(1490973890875,1490864039264,93793,551,'2017-03-31 15:24:50','While I donot think so…'),(1491014830404,1490864016738,82001,511,'2017-04-01 02:47:10','Have a nice day!'),(1491119615611,1490864023700,82001,543,'2017-04-02 07:53:35','$$'),(1491119670185,68,82001,371,'2017-04-02 07:54:30','Leave a word'),(1491119695580,0,82001,371,'2017-04-02 07:54:55','leave a word'),(1491130701902,0,38710,511,'2017-04-02 10:58:21','Thanks for your supports (-^?^-)'),(1491209763162,0,82001,1491200468898,'2017-04-03 08:56:03','How do you do'),(1491277552385,0,82001,58,'2017-04-04 03:45:52','Seven'),(1491312382941,0,82001,1491200468898,'2017-04-04 13:26:22','Wow'),(1491312438951,1490863651493,82001,595,'2017-04-04 13:27:18','WaKaKa!'),(1491357607389,0,82001,594,'2017-04-05 02:00:07','Why not have a try?'),(1491709064513,0,82001,551,'2017-04-09 03:37:44','soga'),(1491740899179,0,82001,470,'2017-04-09 12:28:19','www'),(1491798370749,0,82002,551,'2017-04-10 04:26:10','Nice!'),(1491798499667,115,82002,371,'2017-04-10 04:28:19','I do not understand…'),(1491830543193,0,82001,170,'2017-04-10 13:22:23','What is the hell?'),(1492932228287,1491209763162,38710,1491200468898,'2017-04-23 07:23:48','fine,thanks'),(1493094307810,0,82001,551,'2017-04-25 04:25:04','删除或修改数据请先创建,不要动原来的,谢谢'),(1493094307910,0,82001,551,'2017-04-25 04:26:04','用POST新增数据'),(1493186363132,1490850764448,82001,12,'2017-04-26 05:59:23','sndnd'),(1493655944016,1491357607389,82001,594,'2017-05-01 16:25:44','good'),(1493835048580,1493834818490,82001,594,'2017-05-03 18:10:48','p'); +INSERT INTO `Comment` VALUES (3,0,82002,15,'2017-02-01 11:20:50','This is a Content...-3'),(4,0,38710,470,'2017-02-01 11:20:50','This is a Content...-4'),(13,0,82005,58,'2017-02-01 11:20:50','This is a Content...-13'),(22,221,82001,470,'2017-02-01 11:20:50','测试修改评论'),(44,0,82003,170,'2017-02-01 11:20:50','This is a Content...-44'),(45,0,93793,301,'2017-02-01 11:20:50','This is a Content...-45'),(47,4,70793,470,'2017-02-01 11:20:50','This is a Content...-47'),(51,45,82003,301,'2017-02-01 11:20:50','This is a Content...-51'),(54,0,82004,170,'2017-02-01 11:20:50','This is a Content...-54'),(68,0,82005,371,'2017-02-01 11:20:50','This is a Content...-68'),(76,45,93793,301,'2017-02-01 11:20:50','This is a Content...-76'),(77,13,93793,58,'2017-02-01 11:20:50','This is a Content...-77'),(97,13,82006,58,'2017-02-01 11:20:50','This is a Content...-97'),(99,44,70793,170,'2017-02-01 11:20:50','This is a Content...-99'),(110,0,93793,371,'2017-02-01 11:23:24','This is a Content...-110'),(114,0,82001,371,'2017-03-02 05:56:06','This is a Content...-114'),(115,0,38710,371,'2017-03-02 05:56:06','This is a Content...-115'),(116,0,70793,371,'2017-03-02 05:56:06','This is a Content...-116'),(120,0,93793,301,'2017-03-02 05:56:06','This is a Content...-110'),(124,0,82001,301,'2017-03-02 05:56:06','This is a Content...-114'),(157,NULL,93793,371,'2017-02-01 11:20:50','This is a Content...-157'),(158,0,93793,301,NULL,'This is a Content...-157'),(160,0,82001,235,'2017-03-02 05:56:06','This is a Content...-160'),(162,0,93793,12,'2017-03-06 05:03:45','This is a Content...-162'),(163,0,82001,235,'2017-03-02 05:56:06','This is a Content...-163'),(164,0,93793,12,'2017-03-06 05:03:45','This is a Content...-164'),(167,NULL,82001,58,'2017-03-25 11:48:41','Nice!'),(168,1490442545077,82001,235,'2017-03-25 11:49:14','???'),(172,162,82001,12,'2017-03-25 12:22:58','OK'),(173,NULL,38710,58,'2017-03-25 12:25:13','Good'),(174,172,38710,1488691759538,'2017-03-25 12:26:00','what?'),(175,0,38710,12,'2017-03-25 12:26:53','Java is the best program language!'),(176,166,38710,15,'2017-03-25 12:28:03','thank you'),(178,NULL,38710,511,'2017-03-25 12:30:55','wbw'),(182,110,82001,371,'2017-03-26 06:12:52','hahaha'),(188,97,82001,58,'2017-03-26 07:21:32','1646'),(190,0,82001,58,'2017-03-26 07:22:13','dbdj'),(191,176,82001,592,'2017-03-26 07:49:29','zbsj'),(192,0,82001,592,'2017-03-26 07:49:35','sjsj'),(200,0,82001,592,'2017-03-27 03:20:16','oooo'),(201,0,82001,594,'2017-03-29 03:00:44','come on!'),(202,166,82001,592,'2017-03-29 03:01:08','eej'),(203,178,82001,592,'2017-03-29 03:01:14','znsk'),(204,169,82001,592,'2017-03-29 03:01:32','ghh'),(205,177,82001,592,'2017-03-29 03:01:37','hhh'),(206,54,82001,170,'2017-03-29 03:04:23','ejej'),(209,13,82001,58,'2017-03-29 03:05:59','hehj'),(300,97,82001,58,'2017-03-29 03:06:07','hj'),(301,194,82001,235,'2017-03-29 03:06:24','jj'),(304,195,82001,592,'2017-03-29 04:48:28','eej'),(305,188,82001,592,'2017-03-29 04:48:32','ssh'),(307,161,82001,592,'2017-03-29 04:48:51','ejej'),(308,0,82001,592,'2017-03-29 04:49:02','eheh'),(4001,0,82001,58,'2017-03-29 08:39:52','I would like to say …'),(1490776944301,0,82001,58,'2017-03-29 08:42:24','hello'),(1490776966828,173,82001,58,'2017-03-29 08:42:46','me too'),(1490777876202,192,82001,592,'2017-03-29 08:57:56','ghh'),(1490777905437,0,82001,543,'2017-03-29 08:58:25','rr'),(1490778122719,175,82001,12,'2017-03-29 09:02:02','Yeah! I think so!'),(1490778494751,1490778122719,82001,12,'2017-03-29 09:08:14','reply Android82001'),(1490778681337,166,82001,12,'2017-03-29 09:11:21','gg'),(1490780672012,164,82001,12,'2017-03-29 09:44:32','93793'),(1490780759866,99,82001,170,'2017-03-29 09:45:59','99'),(1490781009548,51,82001,301,'2017-03-29 09:50:09','3'),(1490781032005,45,82001,301,'2017-03-29 09:50:32','93793'),(1490781817044,209,38710,58,'2017-03-29 10:03:37','82001'),(1490781850893,1490776966828,38710,58,'2017-03-29 10:04:10','haha!'),(1490781857242,190,38710,58,'2017-03-29 10:04:17','nice'),(1490781865407,1490781857242,38710,58,'2017-03-29 10:04:25','wow'),(1490781899147,197,38710,12,'2017-03-29 10:04:59','kaka'),(1490781914528,1490780672012,38710,12,'2017-03-29 10:05:14','ops'),(1490794439561,1490778681337,82001,12,'2017-03-29 13:33:59','gg?'),(1490794610632,172,82001,12,'2017-03-29 13:36:50','All right'),(1490794937137,1490794919957,82001,12,'2017-03-29 13:42:17','All right ok ok'),(1490794953438,1490794937137,82001,12,'2017-03-29 13:42:33','All right ok ok ll'),(1490796241178,0,38710,58,'2017-03-29 14:04:01','Anything else?'),(1490796629591,175,38710,12,'2017-03-29 14:10:29','well'),(1490798710678,110,38710,371,'2017-03-29 14:45:10','110'),(1490800971064,175,38710,12,'2017-03-29 15:22:51','I do'),(1490848396072,175,82001,12,'2017-03-30 04:33:16','Lemon'),(1490848581424,166,82001,12,'2017-03-30 04:36:21','82001ejej'),(1490850764448,162,82001,12,'2017-03-30 05:12:44','-162'),(1490850844016,0,82001,12,'2017-03-30 05:14:04','I like it'),(1490850876656,1490800971064,82001,12,'2017-03-30 05:14:36','I do so'),(1490854894566,175,82001,12,'2017-03-30 06:21:34','it does be a good lang'),(1490863443219,1490850844016,82002,12,'2017-03-30 08:44:03','me too!'),(1490863469638,0,82002,15,'2017-03-30 08:44:29','Just do it'),(1490863507114,4,82003,470,'2017-03-30 08:45:07','yes'),(1490863563124,0,82003,704,'2017-03-30 08:46:03','I want one'),(1490863651493,0,70793,595,'2017-03-30 08:47:31','wow'),(1490863661426,1490780759866,70793,170,'2017-03-30 08:47:41','66'),(1490863676989,0,70793,12,'2017-03-30 08:47:56','Shy'),(1490863711703,0,70793,511,'2017-03-30 08:48:31','I hope I can join'),(1490863717947,178,70793,511,'2017-03-30 08:48:37','what?'),(1490863783276,1490863711703,93793,511,'2017-03-30 08:49:43','haha welcome'),(1490863903900,0,82006,470,'2017-03-30 08:51:43','SOGA'),(1490863915675,0,82006,235,'2017-03-30 08:51:55','Good boy'),(1490863938712,0,82006,12,'2017-03-30 08:52:18','Handsome!'),(1490863978239,1490796241178,82006,58,'2017-03-30 08:52:58','there still remains a question…'),(1490864016738,0,82006,511,'2017-03-30 08:53:36','I want to have a try!'),(1490864023700,0,82006,543,'2017-03-30 08:53:43','oops'),(1490864039264,0,82006,551,'2017-03-30 08:53:59','Wonderful!'),(1490864060358,308,82006,592,'2017-03-30 08:54:20','I an little girl'),(1490864075725,1490864060358,82006,592,'2017-03-30 08:54:35','do you like me?'),(1490864152008,0,82006,58,'2017-03-30 08:55:52','U R ugly( ´?` )'),(1490864254400,1490863915675,82044,235,'2017-03-30 08:57:34','And I have no idea'),(1490864276824,0,82044,12,'2017-03-30 08:57:56','Oh my God!'),(1490864292184,1490864152008,82044,58,'2017-03-30 08:58:12','haha!'),(1490864379424,1490863938712,82001,12,'2017-03-30 08:59:39','Thank you~'),(1490864400210,1490864276824,82001,12,'2017-03-30 09:00:00','Amazing, isnt it?'),(1490874908570,1490864023700,82055,543,'2017-03-30 11:55:08','yeah'),(1490874930994,1490777905437,82055,543,'2017-03-30 11:55:30','yy'),(1490874968779,0,82055,12,'2017-03-30 11:56:08','I love it'),(1490875033494,0,82055,301,'2017-03-30 11:57:13','More Comments'),(1490875040761,158,82055,301,'2017-03-30 11:57:20','157'),(1490875046704,120,82055,301,'2017-03-30 11:57:26','110'),(1490875660259,1490863469638,82055,15,'2017-03-30 12:07:40','I prove wht you said(??????)'),(1490879678127,0,82001,543,'2017-03-30 13:14:38','Baby you are a firework!'),(1490972390235,1490863903900,82001,470,'2017-03-31 14:59:50','HaHa'),(1490973736662,1490973715568,70793,170,'2017-03-31 15:22:16','Hello, I am a fresh man'),(1490973890875,1490864039264,93793,551,'2017-03-31 15:24:50','While I donot think so…'),(1491014830404,1490864016738,82001,511,'2017-04-01 02:47:10','Have a nice day!'),(1491119615611,1490864023700,82001,543,'2017-04-02 07:53:35','$$'),(1491119670185,68,82001,371,'2017-04-02 07:54:30','Leave a word'),(1491119695580,0,82001,371,'2017-04-02 07:54:55','leave a word'),(1491130701902,0,38710,511,'2017-04-02 10:58:21','Thanks for your supports (-^?^-)'),(1491209763162,0,82001,1491200468898,'2017-04-03 08:56:03','How do you do'),(1491277552385,0,82001,58,'2017-04-04 03:45:52','Seven'),(1491312382941,0,82001,1491200468898,'2017-04-04 13:26:22','Wow'),(1491312438951,1490863651493,82001,595,'2017-04-04 13:27:18','WaKaKa!'),(1491357607389,0,82001,594,'2017-04-05 02:00:07','Why not have a try?'),(1491709064513,0,82001,551,'2017-04-09 03:37:44','soga'),(1491740899179,0,82001,470,'2017-04-09 12:28:19','www'),(1491798370749,0,82002,551,'2017-04-10 04:26:10','Nice!'),(1491798499667,115,82002,371,'2017-04-10 04:28:19','I do not understand…'),(1491830543193,0,82001,170,'2017-04-10 13:22:23','What is the hell?'),(1492932228287,1491209763162,38710,1491200468898,'2017-04-23 07:23:48','fine,thanks'),(1493094307810,0,82001,551,'2017-04-25 04:25:04','删除或修改数据请先创建,不要动原来的,谢谢'),(1493094307910,0,82001,551,'2017-04-25 04:26:04','用POST新增数据'),(1493186363132,1490850764448,82001,12,'2017-04-26 05:59:23','sndnd'),(1493655944016,1491357607389,82001,594,'2017-05-01 16:25:44','good'),(1493835048580,1493834818490,82001,594,'2017-05-03 18:10:48','p'),(1502632433970,0,82002,1493835799335,'2017-08-13 13:53:53','just have fun!'),(1508053722718,0,82003,1508053625493,'2017-10-15 07:48:42','天凉好个秋'),(1508053783278,0,82001,1508053762227,'2017-10-15 07:49:43','可以的'),(1508072438663,0,70793,594,'2017-10-15 13:00:38','代码不错哦'),(1508072695833,0,82003,1508072633830,'2017-10-15 13:04:55','心疼地抱住自己(๑´ㅂ`๑)'),(1508227456407,0,82001,15,'2017-10-17 08:04:16','hsh'),(1508227498578,1491798370749,82001,551,'2017-10-17 08:04:58','g'),(1508461493442,0,82001,1508072491570,'2017-10-20 01:04:53','hi'),(1508461508559,1508461493442,82001,1508072491570,'2017-10-20 01:05:08','她'),(1508461916367,1508053722718,82001,1508053625493,'2017-10-20 01:11:56','HOHO'),(1508462026394,1490850844016,82001,12,'2017-10-20 01:13:46','欧'),(1508492585904,1508462026394,82001,12,'2017-10-20 09:43:05','my god'),(1508557912189,0,82002,1508053625493,'2017-10-21 03:51:52','冷~'),(1509003045509,0,82001,1508072633830,'2017-10-26 07:30:45','hhh'),(1509345475016,0,82001,1508053649532,'2017-10-30 06:37:55','测试'),(1509346549158,0,82001,170,'2017-10-30 06:55:49','呵呵'),(1509346556395,0,82001,170,'2017-10-30 06:55:56','测试'),(1509346606036,0,82001,15,'2017-10-30 06:56:46','测'),(1509518079106,0,82001,1508073178489,'2017-11-01 06:34:39','哦哦哦'),(1510300859529,1493655944016,82001,594,'2017-11-10 08:00:59','你好'),(1510302804588,1510300859529,82002,594,'2017-11-10 08:33:24','大家好才是真的好^_^'),(1510394480987,NULL,82001,15,'2017-11-11 10:01:20','测试发评论'),(1510394804925,NULL,82001,15,'2017-11-11 10:06:44','测试发评论'); /*!40000 ALTER TABLE `Comment` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -52,4 +52,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:26 +-- Dump completed on 2017-11-12 21:45:12 diff --git a/table/sys_Login.sql b/table/sys_Login.sql index 014e133ae..c64c86b98 100644 --- a/table/sys_Login.sql +++ b/table/sys_Login.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,10 +23,10 @@ DROP TABLE IF EXISTS `Login`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Login` ( - `id` bigint(10) NOT NULL AUTO_INCREMENT, - `userId` bigint(15) NOT NULL, - `type` tinyint(1) NOT NULL, - `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '唯一标识', + `userId` bigint(15) NOT NULL COMMENT '用户id', + `type` tinyint(1) NOT NULL COMMENT '类型\n0-密码登录\n1-验证码登录', + `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1493891806373 DEFAULT CHARSET=utf8 COMMENT='@deprecated,登录信息存session'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -50,4 +50,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:15 diff --git a/table/sys_Moment.sql b/table/sys_Moment.sql index 806c18863..505f27b5d 100644 --- a/table/sys_Moment.sql +++ b/table/sys_Moment.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,14 +23,14 @@ DROP TABLE IF EXISTS `Moment`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Moment` ( - `id` bigint(15) NOT NULL, - `userId` int(5) NOT NULL, - `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `content` varchar(300) DEFAULT NULL, - `praiseUserIdList` json DEFAULT NULL, - `pictureList` json DEFAULT NULL, + `id` bigint(15) NOT NULL COMMENT '唯一标识', + `userId` int(5) NOT NULL COMMENT '用户id', + `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期', + `content` varchar(300) DEFAULT NULL COMMENT '内容', + `praiseUserIdList` json NOT NULL COMMENT '点赞的用户id列表', + `pictureList` json NOT NULL COMMENT '图片列表', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='动态'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -39,7 +39,7 @@ CREATE TABLE `Moment` ( LOCK TABLES `Moment` WRITE; /*!40000 ALTER TABLE `Moment` DISABLE KEYS */; -INSERT INTO `Moment` VALUES (12,70793,'2017-02-08 08:06:11','1111534034','[38710, 82003, 70793, 93793, 82006, 82044, 82040, 82055, 82002, 90814, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/788c0a7e11a4f5aadef3c886f028c79b4808613a/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343932353935372d313732303737333630382e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_Pz9Y.png\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\"]'),(15,70793,'2017-02-08 08:06:11','APIJSON is a JSON Transmission Structure Protocol…','[82055, 82002, 82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(32,82002,'2017-02-08 08:06:11',NULL,'[38710, 82002, 82001]','[\"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\", \"https://camo.githubusercontent.com/5f5c4e0c4dc539c34e8eae8ac0cbc6dccdfee5d3/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343533333831362d323032373434343231382e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172508_mpwj.jpg\"]'),(58,90814,'2017-02-01 11:14:31','This is a Content...-435','[38710, 82003, 82005, 93793, 82006, 82044, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\"]'),(170,70793,'2017-02-01 11:14:31','This is a Content...-73','[82044, 82002, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_mpwj.jpg\"]'),(235,38710,'2017-02-08 08:06:11',NULL,'[]','[\"http://static.oschina.net/uploads/img/201604/22172508_mpwj.jpg\", \"http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000\"]'),(301,93793,'2017-02-01 11:14:31','This is a Content...-301','[38710, 93793, 82003, 82005, 82040, 82055, 82002, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\"]'),(371,82002,'2017-02-01 11:14:31','This is a Content...-371','[90814, 82002, 93793, 82003, 82005, 82006, 82040]','[\"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\"]'),(470,38710,'2017-02-01 11:14:31','This is a Content...-470','[]','[\"http://static.oschina.net/uploads/img/201604/22172507_Pz9Y.png\"]'),(511,38710,'2017-02-08 08:06:11',NULL,'[70793, 93793, 82001]','[\"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\"]'),(543,93793,'2017-02-08 08:06:11',NULL,'[]','[\"https://camo.githubusercontent.com/5f5c4e0c4dc539c34e8eae8ac0cbc6dccdfee5d3/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343533333831362d323032373434343231382e6a7067\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\"]'),(551,70793,'2017-02-08 08:06:11','test','[]','[\"http://static.oschina.net/uploads/img/201604/22172507_Pz9Y.png\"]'),(594,82001,'2017-03-08 09:11:11','JSON!','[38710, 82002]','[\"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\"]'),(595,38710,'2017-03-05 05:29:19',NULL,'[70793, 82002, 82001]','[\"http://common.cnblogs.com/images/icon_weibo_24.png\", \"http://static.oschina.net/uploads/user/19/39085_50.jpg\"]'),(704,38710,'2017-03-12 09:39:44','APIJSON is a JSON Transmission Structure Protocol…','[82003, 82002, 82001]','[\"http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000\", \"http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000\"]'),(1491200468898,38710,'2017-04-03 06:21:08','APIJSON, let interfaces go to hell!','[]','[\"http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000\", \"http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000\"]'),(1491277116776,38710,'2017-04-04 03:38:36','APIJSON, let interfaces go to hell!','[82001, 38710]','[\"http://common.cnblogs.com/images/wechat.png\", \"http://common.cnblogs.com/images/icon_weibo_24.png\", \"http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000\"]'),(1493835799335,38710,'2017-05-03 18:23:19','APIJSON is a JSON Transmission Structure Protocol…','[82001, 82002]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'); +INSERT INTO `Moment` VALUES (12,70793,'2017-02-08 08:06:11','1111534034','[82003, 70793, 93793, 82006, 82044, 82040, 82055, 90814, 82001, 38710, 82002]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/788c0a7e11a4f5aadef3c886f028c79b4808613a/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343932353935372d313732303737333630382e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_Pz9Y.png\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\"]'),(15,70793,'2017-02-08 08:06:11','APIJSON is a JSON Transmission Structure Protocol…','[82055, 82002, 82001, 38710]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(32,82002,'2017-02-08 08:06:11',NULL,'[38710, 82002, 82001]','[\"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\", \"https://camo.githubusercontent.com/5f5c4e0c4dc539c34e8eae8ac0cbc6dccdfee5d3/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343533333831362d323032373434343231382e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172508_mpwj.jpg\"]'),(58,90814,'2017-02-01 11:14:31','This is a Content...-435','[38710, 82003, 82005, 93793, 82006, 82044, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\"]'),(170,70793,'2017-02-01 11:14:31','This is a Content...-73','[82044, 82002, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_mpwj.jpg\"]'),(235,38710,'2017-02-08 08:06:11',NULL,'[]','[\"http://static.oschina.net/uploads/img/201604/22172508_mpwj.jpg\", \"http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000\"]'),(301,93793,'2017-02-01 11:14:31','This is a Content...-301','[38710, 93793, 82003, 82005, 82040, 82055, 82002, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\"]'),(371,82002,'2017-02-01 11:14:31','This is a Content...-371','[90814, 93793, 82003, 82005, 82006, 82040, 82002, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\"]'),(470,38710,'2017-02-01 11:14:31','This is a Content...-470','[]','[\"http://static.oschina.net/uploads/img/201604/22172507_Pz9Y.png\"]'),(511,38710,'2017-02-08 08:06:11',NULL,'[70793, 93793, 82001]','[\"https://camo.githubusercontent.com/f513fa631bd780dc0ec3cf2663777e356dc3664f/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343733323232332d3337333933303233322e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\"]'),(543,93793,'2017-02-08 08:06:11',NULL,'[]','[\"https://camo.githubusercontent.com/5f5c4e0c4dc539c34e8eae8ac0cbc6dccdfee5d3/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343533333831362d323032373434343231382e6a7067\", \"https://camo.githubusercontent.com/c98b1c86af136745cc4626c6ece830f76de9ee83/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3636303036372f3230313630342f3636303036372d32303136303431343232343930383036362d313837323233393236352e6a7067\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\"]'),(551,70793,'2017-02-08 08:06:11','test','[82001]','[\"http://static.oschina.net/uploads/img/201604/22172507_Pz9Y.png\"]'),(594,82001,'2017-03-08 09:11:11','JSON!','[38710, 82002, 70793, 82001]','[\"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\"]'),(595,38710,'2017-03-05 05:29:19',NULL,'[70793, 82002, 82001]','[\"http://common.cnblogs.com/images/icon_weibo_24.png\", \"http://static.oschina.net/uploads/user/19/39085_50.jpg\"]'),(704,38710,'2017-03-12 09:39:44','APIJSON is a JSON Transmission Structure Protocol…','[82003, 82002, 82001]','[\"http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000\", \"http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000\"]'),(1491200468898,38710,'2017-04-03 06:21:08','APIJSON, let interfaces go to hell!','[]','[\"http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000\", \"http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000\"]'),(1493835799335,38710,'2017-05-03 18:23:19','APIJSON is a JSON Transmission Structure Protocol…','[82002, 82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(1508053625493,82001,'2017-10-15 07:47:05','秋高气爽','[82002, 82003, 70793, 82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(1508053649532,82001,'2017-10-15 07:47:29','测试发动态','[82005, 82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(1508053762227,82003,'2017-10-15 07:49:22','我也试试','[82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(1508072491570,82002,'2017-10-15 13:01:31','有点冷~','[82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(1508072633830,93793,'2017-10-15 13:03:53','天凉了\n有男朋友的抱男盆友\n有女朋友的抱女朋友\n而我就比较牛逼了\n我不冷。','[82001, 82005, 82002, 70793, 38710, 82045]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(1508073178489,82045,'2017-10-15 13:12:58','发动态','[82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(1510379916315,82001,'2017-11-11 05:58:36','双十一没花钱。。。','[82001]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'); /*!40000 ALTER TABLE `Moment` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -52,4 +52,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:14 diff --git a/table/sys_Pair.sql b/table/sys_Pair.sql index eabafb555..d8123f9e0 100644 --- a/table/sys_Pair.sql +++ b/table/sys_Pair.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -49,4 +49,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:15 diff --git a/table/sys_Password.sql b/table/sys_Password.sql deleted file mode 100644 index 2d43bfeeb..000000000 --- a/table/sys_Password.sql +++ /dev/null @@ -1,55 +0,0 @@ --- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) --- --- Host: localhost Database: sys --- ------------------------------------------------------ --- Server version 5.7.16 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `Password` --- - -DROP TABLE IF EXISTS `Password`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `Password` ( - `_index` int(11) NOT NULL AUTO_INCREMENT, - `id` bigint(15) NOT NULL, - `type` varchar(20) DEFAULT NULL, - `password` varchar(20) NOT NULL, - `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`_index`), - UNIQUE KEY `_index_UNIQUE` (`_index`) -) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8 COMMENT='@deprecated,合并至UserPrivacy'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `Password` --- - -LOCK TABLES `Password` WRITE; -/*!40000 ALTER TABLE `Password` DISABLE KEYS */; -INSERT INTO `Password` VALUES (1,12345678900,'0','123456','2017-02-01 11:21:50'),(2,12345678901,'0','123456','2017-02-01 11:21:50'),(3,12345678902,'0','123456','2017-02-01 11:21:50'),(4,12345678903,'0','123456','2017-02-01 11:21:50'),(5,12345678904,'0','apijson','2017-02-01 11:21:50'),(6,12345678905,'0','apijson','2017-02-01 11:21:50'),(7,12345678906,'0','123456','2017-02-01 11:21:50'),(8,12345678907,'0','123456','2017-02-01 11:21:50'),(9,12345678908,'0','123456','2017-02-01 11:21:50'),(10,12345678909,'0','123456','2017-02-01 11:21:50'),(11,12345678910,'0','123456','2017-02-01 11:21:50'),(12,12345678911,'0','123456','2017-02-01 11:21:50'),(13,12345678912,'0','123456','2017-02-01 11:21:50'),(14,12345678913,'0','123456','2017-02-01 11:21:50'),(15,12345678914,'0','123456','2017-02-01 11:21:50'),(16,12345678915,'0','123456','2017-02-01 11:21:50'),(17,12345678916,'0','123456','2017-02-01 11:21:50'),(18,12345678917,'0','123456','2017-02-01 11:21:50'),(19,12345678918,'0','123456','2017-02-01 11:21:50'),(20,12345678919,'0','123456','2017-02-19 13:57:56'),(21,13000038710,'1','666666','2017-02-01 11:21:50'),(22,13000038711,NULL,'123456','2017-03-04 16:04:02'),(23,13000038712,NULL,'123456','2017-03-05 09:51:51'),(24,13000038713,NULL,'123456','2017-03-05 09:52:52'),(25,13000038714,NULL,'123456','2017-03-05 09:53:37'),(26,13000038715,NULL,'123456','2017-03-05 09:57:54'),(27,13000038716,NULL,'123456','2017-03-25 05:44:11'),(28,13000038717,NULL,'123456','2017-03-25 07:32:19'),(29,13000038720,NULL,'123456','2017-03-05 15:25:42'),(30,13000038721,NULL,'123456','2017-03-06 12:29:03'),(31,13000038730,NULL,'123456','2017-03-12 06:01:23'),(32,13000038750,NULL,'123456','2017-03-12 11:23:04'),(33,13000038790,NULL,'123456','2017-03-27 03:22:32'),(34,13000070793,'0','apijson','2017-02-01 11:21:50'),(35,13000082001,'1','123456','2017-02-01 11:21:50'),(36,13000082002,'1','123456','2017-02-01 11:21:50'),(37,13000082003,'1','123456','2017-02-01 11:21:50'),(38,13000082004,'0','123456','2017-02-01 11:21:50'),(39,13000082005,'0','123456','2017-02-01 11:21:50'),(40,13000082006,'0','123456','2017-02-01 11:21:50'),(41,13000082010,NULL,'123456','2017-03-04 15:11:17'),(42,13000082012,'0','123456','2017-02-01 11:21:50'),(43,13000082015,'0','123456','2017-03-04 09:59:34'),(44,13000082016,'0','123456','2017-03-04 10:04:33'),(45,13000082017,'0','123456','2017-03-04 10:05:04'),(46,13000082018,'0','123456','2017-03-04 10:20:27'),(47,13000082019,'0','123456','2017-03-02 16:44:26'),(48,13000082020,'0','123456','2017-03-04 10:22:39'),(49,13000082021,NULL,'123456','2017-03-04 16:02:05'),(50,13000082030,NULL,'123456','2017-03-11 15:04:00'),(51,13000082033,NULL,'123456','2017-03-19 14:49:15'),(52,13000082040,NULL,'123456','2017-03-11 15:32:25'),(53,13000082050,NULL,'123456','2017-03-21 14:10:18'),(54,13000082051,NULL,'123456','2017-03-31 15:21:10'),(55,13000082100,NULL,'123456','2017-03-21 15:22:22'),(56,13000082101,NULL,'123456','2017-03-21 15:24:05'),(57,13000082102,NULL,'123456','2017-03-25 07:39:37'),(58,13000090814,'1','123456','2017-02-01 11:21:50'),(59,13000093793,'1','123456','2017-02-01 11:21:50'),(60,99999999999,'0','123456','2017-02-01 11:21:50'),(61,13000093794,NULL,'123456','2017-04-23 08:29:29'),(62,13000038888,NULL,'123456','2017-04-29 15:35:42'),(63,13000038777,NULL,'123456','2017-05-02 17:51:52'),(64,13000038778,NULL,'123456','2017-05-02 17:56:17'),(65,13000038779,NULL,'123456','2017-05-02 18:09:54'),(66,13000038780,NULL,'123456','2017-05-02 18:10:15'),(67,13000038781,NULL,'123456','2017-05-02 18:18:10'),(68,13000038999,NULL,'123456','2017-05-03 18:27:23'),(69,13000039999,NULL,'123456','2017-05-04 07:31:50'),(70,13000031000,NULL,'123456','2017-05-04 09:30:14'),(71,13000031001,NULL,'123456','2017-05-04 09:31:43'),(72,13000038788,NULL,'123456','2017-05-09 13:59:22'),(73,13000038789,NULL,'123456','2017-05-09 14:01:04'),(75,13000082009,NULL,'666666','2017-05-12 16:01:35'); -/*!40000 ALTER TABLE `Password` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2017-06-18 21:37:27 diff --git a/table/sys_Praise.sql b/table/sys_Praise.sql index 2c97edaa1..fef69091a 100644 --- a/table/sys_Praise.sql +++ b/table/sys_Praise.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,8 +23,8 @@ DROP TABLE IF EXISTS `Praise`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Praise` ( - `id` bigint(15) NOT NULL, - `userIdList` json NOT NULL, + `id` bigint(15) NOT NULL COMMENT '唯一标识', + `userIdList` json NOT NULL COMMENT '用户id列表', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='如果对Moment写安全要求高,可以将Moment内praiserUserIdList分离到Praise表中,作为userIdList。\n权限注解也改下:\n@MethodAccess(\n PUT = {OWNER, ADMIN}\n )\nclass Moment {\n …\n}\n\n@MethodAccess(\n PUT = {LOGIN, CONTACT, CIRCLE, OWNER, ADMIN}\n )\n class Praise {\n …\n }\n'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -48,4 +48,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:15 diff --git a/table/sys_Request.sql b/table/sys_Request.sql index 587799be9..5129af365 100644 --- a/table/sys_Request.sql +++ b/table/sys_Request.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,15 +23,15 @@ DROP TABLE IF EXISTS `Request`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Request` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `version` tinyint(4) DEFAULT '0' COMMENT 'GET,HEAD可用任意结构访问任意开放内容,不需要这个字段。\n其它的操作因为写入了结构和内容,所以都需要,按照不同的version选择对应的structure。\n\n自动化版本管理:\nRequest JSON最外层可以传 “version”:Integer 。\n1.未传或 <= 0,用最新版。 “@order”:”version-“\n2.已传且 > 0,用version以上的可用版本的最低版本。 “@order”:”version+”, “version{}”:”>={version}”', - `tag` varchar(20) NOT NULL, - `method` varchar(10) DEFAULT 'GET' COMMENT '只限于GET,HEAD外的操作方法。', - `structure` json NOT NULL, - `description` varchar(10000) DEFAULT NULL, - `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一标识', + `version` tinyint(4) NOT NULL DEFAULT '1' COMMENT 'GET,HEAD可用任意结构访问任意开放内容,不需要这个字段。\n其它的操作因为写入了结构和内容,所以都需要,按照不同的version选择对应的structure。\n\n自动化版本管理:\nRequest JSON最外层可以传 “version”:Integer 。\n1.未传或 <= 0,用最新版。 “@order”:”version-“\n2.已传且 > 0,用version以上的可用版本的最低版本。 “@order”:”version+”, “version{}”:”>={version}”', + `method` varchar(10) DEFAULT 'GETS' COMMENT '只限于GET,HEAD外的操作方法。', + `tag` varchar(20) NOT NULL COMMENT '标签', + `structure` json NOT NULL COMMENT '结构', + `description` varchar(10000) DEFAULT NULL COMMENT '描述', + `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8 COMMENT='最好编辑完后删除主键,这样就是只读状态,不能随意更改。需要更改就重新加上主键。\n\n每次启动服务器时加载整个表到内存。\n这个表不可省略,model内注解的权限只是客户端能用的,其它可以保证即便服务端代码错误时也不会误删数据。'; +) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8 COMMENT='最好编辑完后删除主键,这样就是只读状态,不能随意更改。需要更改就重新加上主键。\n\n每次启动服务器时加载整个表到内存。\n这个表不可省略,model内注解的权限只是客户端能用的,其它可以保证即便服务端代码错误时也不会误删数据。'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -40,7 +40,7 @@ CREATE TABLE `Request` ( LOCK TABLES `Request` WRITE; /*!40000 ALTER TABLE `Request` DISABLE KEYS */; -INSERT INTO `Request` VALUES (1,0,'User','POST','{\"User\": {\"disallow\": \"id\"}, \"necessary\": \"phone,password,verify\"}','\"User:toUser\":{}转化为\"toUser\":User的JSONObject ?','2017-02-01 11:19:51'),(2,0,'Moment','POST','{\"disallow\": \"id\", \"necessary\": \"userId,pictureList\"}',NULL,'2017-02-01 11:19:51'),(3,0,'Comment','POST','{\"disallow\": \"id\", \"necessary\": \"userId,momentId,content\"}',NULL,'2017-02-01 11:19:51'),(4,0,'User','PUT','{\"add\": {\"@role\": \"owner\"}, \"disallow\": \"phone\", \"necessary\": \"id\"}',NULL,'2017-02-01 11:19:51'),(6,0,'Moment','DELETE','{\"put\": {\"Comment\": {\"@role\": \"admin\", \"momentId@\": \"Moment/id\"}}, \"Moment\": {\"add\": {\"@role\": \"owner\"}, \"necessary\": \"id\"}}','所有删除都要有currentUserId和loginPassword?','2017-02-01 11:19:51'),(7,0,'Comment','DELETE','{\"put\": {\"Comment:child\": {\"@role\": \"admin\", \"toId@\": \"Comment/id\"}}, \"Comment\": {\"add\": {\"@role\": \"owner\"}, \"necessary\": \"id\"}}','disallow没必要用于DELETE','2017-02-01 11:19:51'),(8,0,'Password','PUT','{\"Password\": {\"disallow\": \"!\", \"necessary\": \"id,password\"}, \"necessary\": \"oldPassword\"}','对安全要求高,不允许客户端改type,date等字段','2017-02-01 11:19:51'),(9,0,'User.phone','PUT','{\"User\": {\"add\": {\"@role\": \"owner\"}, \"disallow\": \"!\", \"necessary\": \"id,phone\"}}','! 表示其它所有,这里指necessary所有未包含的字段','2017-02-01 11:19:51'),(10,0,'MomentWithComment','POST','{\"Moment\": {\"Comment\": {\"disallow\": \"id\", \"necessary\": \"userId,workId,content\"}, \"disallow\": \"id\", \"necessary\": \"userId,title,content,picture\"}}','用的极少,可能根本用不上','2017-02-01 11:19:51'),(12,0,'Password','POST_GET','{\"disallow\": \"!\", \"necessary\": \"id,model\"}','String:table, Long: tableId 限制类型?','2017-02-18 12:03:17'),(13,0,'Wallet','POST_GET','{\"Wallet\": {\"disallow\": \"!\", \"necessary\": \"id\"}}',NULL,'2017-02-18 14:20:43'),(14,0,'Login','POST_GET','{\"User\": {\"necessary\": \"phone\"}, \"Password\": {\"disallow\": \"!\", \"necessary\": \"table,phone,value\"}}',NULL,'2017-02-18 14:20:43'),(15,0,'Login','POST','{\"disallow\": \"!\", \"necessary\": \"userId,type\"}',NULL,'2017-02-18 14:20:43'),(16,0,'Verify','POST','{\"disallow\": \"!\", \"necessary\": \"id,code\"}',NULL,'2017-02-18 14:20:43'),(17,0,'Verify','POST_GET','{\"necessary\": \"id\"}',NULL,'2017-02-18 14:20:43'),(19,0,'Verify','POST_HEAD','{}','允许任意内容','2017-02-18 14:20:43'),(20,0,'Moment','PUT','{\"disallow\": \"userId,date\", \"necessary\": \"id\"}',NULL,'2017-02-01 11:19:51'),(30,0,'Wallet','POST','{\"Wallet\": {\"disallow\": \"!\", \"necessary\": \"id\"}, \"necessary\": \"payPassword\"}',NULL,'2017-02-18 14:20:43'),(31,0,'Wallet','PUT','{\"Wallet\": {\"verify\": {\"balance+&{}\": \">=-10000,<=10000\"}, \"disallow\": \"!\", \"necessary\": \"id,balance+\"}, \"Password\": {\"disallow\": \"!\", \"necessary\": \"id,password,type\"}}',NULL,'2017-02-18 14:20:43'),(32,0,'Wallet','DELETE','{\"Wallet\": {\"disallow\": \"!\", \"necessary\": \"id\"}, \"necessary\": \"payPassword\"}',NULL,'2017-02-18 14:20:43'),(33,0,'Login','POST_HEAD','{\"disallow\": \"!\", \"necessary\": \"userId,type\"}',NULL,'2017-02-18 14:20:43'),(34,0,'User','POST_GET','{}','允许任意内容',NULL),(35,0,'UserPrivacy','PUT','{\"add\": {\"@role\": \"owner\"}, \"necessary\": \"id\"}',NULL,'2017-02-01 11:19:51'),(37,0,'UserPrivacy','POST_GET','{\"add\": {\"@role\": \"owner\"}, \"necessary\": \"id\"}',NULL,'2017-06-12 16:05:51'),(38,0,'Praise','PUT','{\"necessary\": \"id\"}',NULL,'2017-02-01 11:19:51'); +INSERT INTO `Request` VALUES (1,1,'POST','register','{\"User\": {\"ADD\": {\"pictureList\": [], \"contactIdList\": []}, \"PUT\": {\"id@\": \"Privacy/id\"}, \"DISALLOW\": \"id\", \"NECESSARY\": \"name\"}, \"Privacy\": {\"UNIQUE\": \"phone\", \"VERIFY\": {\"phone?\": \"phone\"}, \"DISALLOW\": \"id\", \"NECESSARY\": \"_password,phone\"}}','\"User:toUser\":{}转化为\"toUser\":User的JSONObject ?','2017-02-01 11:19:51'),(2,1,'POST','Moment','{\"ADD\": {\"pictureList\": [], \"praiseUserIdList\": []}, \"DISALLOW\": \"id\", \"NECESSARY\": \"userId,pictureList\"}',NULL,'2017-02-01 11:19:51'),(3,1,'POST','Comment','{\"DISALLOW\": \"id\", \"NECESSARY\": \"userId,momentId,content\"}',NULL,'2017-02-01 11:19:51'),(4,1,'PUT','User','{\"ADD\": {\"@role\": \"owner\"}, \"DISALLOW\": \"phone\", \"NECESSARY\": \"id\"}',NULL,'2017-02-01 11:19:51'),(5,1,'DELETE','Moment','{\"PUT\": {\"Comment\": {\"@role\": \"admin\", \"momentId@\": \"Moment/id\"}}, \"Moment\": {\"ADD\": {\"@role\": \"owner\"}, \"NECESSARY\": \"id\"}}','所有删除都要有currentUserId和loginPassword?','2017-02-01 11:19:51'),(6,1,'DELETE','Comment','{\"PUT\": {\"Comment:child\": {\"@role\": \"admin\", \"toId@\": \"Comment/id\"}}, \"Comment\": {\"ADD\": {\"@role\": \"owner\"}, \"NECESSARY\": \"id\"}}','disallow没必要用于DELETE','2017-02-01 11:19:51'),(8,1,'PUT','User-phone','{\"User\": {\"ADD\": {\"@role\": \"owner\"}, \"PUT\": {\"@condition\": \"_password\"}, \"DISALLOW\": \"!\", \"NECESSARY\": \"id,phone,_password\"}}','! 表示其它所有,这里指necessary所有未包含的字段','2017-02-01 11:19:51'),(14,1,'POST','Verify','{\"DISALLOW\": \"!\", \"NECESSARY\": \"phone,verify\"}',NULL,'2017-02-18 14:20:43'),(15,1,'GETS','Verify','{\"NECESSARY\": \"phone\"}',NULL,'2017-02-18 14:20:43'),(16,1,'HEADS','Verify','{}','允许任意内容','2017-02-18 14:20:43'),(17,1,'PUT','Moment','{\"DISALLOW\": \"userId,date\", \"NECESSARY\": \"id\"}',NULL,'2017-02-01 11:19:51'),(21,1,'HEADS','Login','{\"DISALLOW\": \"!\", \"NECESSARY\": \"userId,type\"}',NULL,'2017-02-18 14:20:43'),(22,1,'GETS','User','{}','允许任意内容','2017-02-18 14:20:43'),(23,1,'PUT','Privacy','{\"ADD\": {\"@role\": \"owner\"}, \"NECESSARY\": \"id\"}',NULL,'2017-02-01 11:19:51'),(24,1,'GETS','Privacy','{\"ADD\": {\"@role\": \"owner\"}, \"NECESSARY\": \"id\"}',NULL,'2017-06-12 16:05:51'),(25,1,'PUT','Praise','{\"NECESSARY\": \"id\"}',NULL,'2017-02-01 11:19:51'),(26,1,'DELETE','Comment[]','{\"Comment\": {\"ADD\": {\"@role\": \"owner\"}, \"NECESSARY\": \"id{}\"}}','disallow没必要用于DELETE','2017-02-01 11:19:51'),(27,1,'PUT','Comment[]','{\"Comment\": {\"ADD\": {\"@role\": \"owner\"}, \"NECESSARY\": \"id{}\"}}','disallow没必要用于DELETE','2017-02-01 11:19:51'),(28,1,'PUT','Comment','{\"ADD\": {\"@role\": \"owner\"}, \"NECESSARY\": \"id\"}','disallow没必要用于DELETE','2017-02-01 11:19:51'),(29,1,'GETS','login','{\"Privacy\": {\"DISALLOW\": \"id\", \"NECESSARY\": \"phone,_password\"}}',NULL,'2017-10-15 10:04:52'),(30,1,'PUT','balance+','{\"Privacy\": {\"VERIFY\": {\"balance+&{}\": \">=1,<=100000\"}, \"DISALLOW\": \"!\", \"NECESSARY\": \"id,balance+\"}}',NULL,'2017-10-21 08:48:34'),(31,1,'PUT','balance-','{\"Privacy\": {\"PUT\": {\"@condition\": \"_password\"}, \"VERIFY\": {\"balance-&{}\": \">=1,<=10000\"}, \"DISALLOW\": \"!\", \"NECESSARY\": \"id,balance-,_password\"}}',NULL,'2017-10-21 08:48:34'),(32,2,'GETS','Privacy','{\"ADD\": {\"@role\": \"owner\"}, \"DISALLOW\": \"_password,_payPassword\", \"NECESSARY\": \"id\"}',NULL,'2017-06-12 16:05:51'),(33,2,'GETS','Privacy-CIRCLE','{\"Privacy\": {\"PUT\": {\"@role\": \"CIRCLE\", \"@column\": \"phone\"}, \"DISALLOW\": \"!\", \"NECESSARY\": \"id\"}}',NULL,'2017-06-12 16:05:51'); /*!40000 ALTER TABLE `Request` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -53,4 +53,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:13 diff --git a/table/sys_Response.sql b/table/sys_Response.sql index b3b06241d..b9c65e0d3 100644 --- a/table/sys_Response.sql +++ b/table/sys_Response.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,12 +23,12 @@ DROP TABLE IF EXISTS `Response`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Response` ( - `id` int(11) NOT NULL, - `method` varchar(10) DEFAULT 'GET', - `model` varchar(20) NOT NULL, - `structure` json NOT NULL, - `description` varchar(10000) DEFAULT NULL, - `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `id` int(11) NOT NULL COMMENT '唯一标识', + `method` varchar(10) DEFAULT 'GET' COMMENT '方法', + `model` varchar(20) NOT NULL COMMENT '表名,table是SQL关键词不能用', + `structure` json NOT NULL COMMENT '结构', + `description` varchar(10000) DEFAULT NULL COMMENT '描述', + `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期', PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='每次启动服务器时加载整个表到内存。'; @@ -53,4 +53,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:16 diff --git a/table/sys_Wallet.sql b/table/sys_Test.sql similarity index 61% rename from table/sys_Wallet.sql rename to table/sys_Test.sql index 3c985b0f3..5e7eb7ec9 100644 --- a/table/sys_Wallet.sql +++ b/table/sys_Test.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -16,27 +16,26 @@ /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- --- Table structure for table `Wallet` +-- Table structure for table `Test` -- -DROP TABLE IF EXISTS `Wallet`; +DROP TABLE IF EXISTS `Test`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `Wallet` ( - `id` bigint(15) NOT NULL, - `balance` decimal(10,2) DEFAULT NULL, - `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='@deprecated,合并至UserPrivacy'; +CREATE TABLE `Test` ( + `id` tinyint(2) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试及验证用的表,可以用 SELECT condition替代 SELECT * FROM Test WHERE condition,这样就不需要这张表了'; /*!40101 SET character_set_client = @saved_cs_client */; -- --- Dumping data for table `Wallet` +-- Dumping data for table `Test` -- -LOCK TABLES `Wallet` WRITE; -/*!40000 ALTER TABLE `Wallet` DISABLE KEYS */; -INSERT INTO `Wallet` VALUES (38710,14912.50,'2017-02-01 11:15:44'),(70793,500.00,'2017-02-01 11:15:44'),(82001,8682.30,'2017-02-01 11:15:44'),(82002,3500.00,'2017-02-01 11:15:44'),(82003,700.00,'2017-02-01 11:15:44'),(82004,100.00,'2017-02-01 11:15:44'),(82005,700.00,'2017-02-01 11:15:44'); -/*!40000 ALTER TABLE `Wallet` ENABLE KEYS */; +LOCK TABLES `Test` WRITE; +/*!40000 ALTER TABLE `Test` DISABLE KEYS */; +INSERT INTO `Test` VALUES (1); +/*!40000 ALTER TABLE `Test` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -48,4 +47,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:14 diff --git a/table/sys_User.sql b/table/sys_User.sql deleted file mode 100644 index 9980b4265..000000000 --- a/table/sys_User.sql +++ /dev/null @@ -1,61 +0,0 @@ --- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) --- --- Host: localhost Database: sys --- ------------------------------------------------------ --- Server version 5.7.16 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `User` --- - -DROP TABLE IF EXISTS `User`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `User` ( - `_index` int(11) NOT NULL AUTO_INCREMENT, - `id` bigint(15) NOT NULL, - `sex` tinyint(2) NOT NULL DEFAULT '0', - `name` varchar(20) DEFAULT NULL, - `certified` tinyint(1) NOT NULL DEFAULT '0', - `tag` varchar(45) DEFAULT NULL, - `phone` varchar(14) DEFAULT NULL, - `head` varchar(300) DEFAULT NULL, - `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `friendIdList` json DEFAULT NULL COMMENT '联系人id列表', - `pictureList` json DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `_index_UNIQUE` (`_index`) -) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `User` --- - -LOCK TABLES `User` WRITE; -/*!40000 ALTER TABLE `User` DISABLE KEYS */; -INSERT INTO `User` VALUES (1,38710,0,'TommyLemon',1,'Android&Java','13000038710','http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000','2017-02-01 11:21:50','[82003, 82005, 90814, 82004, 82009, 82002, 82044, 93793, 70793]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(2,70793,0,'Strong',0,'djdj','13000070793','http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','2017-02-01 11:21:50','[38710, 82002]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/788c0a7e11a\", \"https://camo.githubusercontent.com/f513f67\"]'),(3,82001,0,'Android',1,'Android Developer','13000082001','http://static.oschina.net/uploads/user/19/39085_50.jpg','2017-02-01 11:21:50','[82004, 82021, 82023, 82025, 82039, 82027, 82002, 93793, 70793]','[\"http://common.cnblogs.com/images/icon_weibo_24.png\"]'),(4,82002,1,'Happy',1,'iOS','13000082002','http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000','2017-02-01 11:21:50','[82005, 70793, 82001]',NULL),(5,82003,1,'Wechat',1,NULL,'13000082003','http://common.cnblogs.com/images/wechat.png','2017-02-01 11:21:50','[82001, 93793]',NULL),(6,82004,0,'Tommy',0,'fasef','13000082004','http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000','2017-02-01 11:21:50',NULL,NULL),(7,82005,1,'Jan',0,'AG','13000082005','http://my.oschina.net/img/portrait.gif?t=1451961935000','2017-02-01 11:21:50','[82001, 38710]',NULL),(8,82006,1,'Meria',0,NULL,'13000082006','http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','2017-02-01 11:21:50',NULL,NULL),(9,82012,0,'Steve',0,'FEWE','13000082012','http://static.oschina.net/uploads/user/1/3064_50.jpg?t=1449566001000','2017-02-01 11:21:50','[82004, 82002, 93793]',NULL),(10,82020,0,'ORANGE',0,NULL,'12345678900','http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','2017-02-01 11:21:50',NULL,NULL),(11,82021,1,'Tommy',0,NULL,'12345678901','http://static.oschina.net/uploads/user/19/39085_50.jpg','2017-02-01 11:21:50',NULL,NULL),(12,82022,0,'Internet',0,NULL,'12345678902','http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','2017-02-01 11:21:50',NULL,NULL),(13,82023,0,'No1',0,NULL,'12345678903','http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','2017-02-01 11:21:50',NULL,NULL),(14,82024,0,'Lemon',0,NULL,'12345678904','http://static.oschina.net/uploads/user/427/855532_50.jpg?t=1435030876000','2017-02-01 11:21:50',NULL,NULL),(15,82025,1,'Tommy',0,NULL,'12345678905','http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000','2017-02-01 11:21:50',NULL,NULL),(16,82026,0,'iOS',0,NULL,'12345678906','http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000','2017-02-01 11:21:50',NULL,NULL),(17,82027,0,'Yong',0,NULL,'12345678907','http://my.oschina.net/img/portrait.gif?t=1451961935000','2017-02-01 11:21:50',NULL,NULL),(18,82028,1,'gaeg',0,NULL,'12345678908','http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','2017-02-01 11:21:50',NULL,NULL),(19,82029,0,'GASG',0,NULL,'12345678909','http://common.cnblogs.com/images/wechat.png','2017-02-01 11:21:50',NULL,NULL),(20,82030,1,'Fun',0,NULL,'12345678910','http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','2017-02-01 11:21:50',NULL,NULL),(21,82031,0,'Lemon',0,NULL,'12345678911','http://static.oschina.net/uploads/user/48/96331_50.jpg','2017-02-01 11:21:50',NULL,NULL),(22,82032,0,'Stack',0,'fasdg','12345678912','http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','2017-02-01 11:21:50',NULL,NULL),(23,82033,1,'GAS',0,NULL,'12345678913','http://my.oschina.net/img/portrait.gif?t=1451961935000','2017-02-01 11:21:50',NULL,NULL),(24,82034,1,'Jump',0,NULL,'12345678914','http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','2017-02-01 11:21:50',NULL,NULL),(25,82035,1,'Tab',0,NULL,'12345678915','http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000','2017-02-01 11:21:50',NULL,NULL),(26,82036,0,'SAG',0,NULL,'12345678916','http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','2017-02-01 11:21:50',NULL,NULL),(27,82037,0,'Test',0,NULL,'12345678917','http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000','2017-02-01 11:21:50',NULL,NULL),(28,82038,0,'Battle',0,NULL,'12345678918','http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','2017-02-01 11:21:50',NULL,NULL),(29,82039,1,'Everyday',0,NULL,'12345678919','http://common.cnblogs.com/images/icon_weibo_24.png','2017-02-19 13:57:56',NULL,NULL),(30,82040,1,'Dream',0,NULL,'13000082019','/storage/emulated/0/output_image.jpg','2017-03-02 16:44:26','[70793]',NULL),(31,82041,0,'Holo',0,NULL,'13000082015','/storage/emulated/0/output_image.jpg','2017-03-04 09:59:34','[38710, 82001]',NULL),(32,82042,1,'Why',0,NULL,'13000082016','http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','2017-03-04 10:04:33',NULL,NULL),(33,82043,0,'Holiday',0,NULL,'13000082017','http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','2017-03-04 10:05:04','[70793, 82006]',NULL),(34,82044,1,'Love',0,NULL,'13000082018','http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000','2017-03-04 10:20:27','[82006]',NULL),(35,82045,0,'Green',0,NULL,'13000082020','http://common.cnblogs.com/images/wechat.png','2017-03-04 10:22:39','[82001, 82002, 82003, 1485246481130]',NULL),(36,82046,0,'Team',0,NULL,'13000082010','/storage/emulated/0/output_image.jpg','2017-03-04 15:11:17','[38710, 82002, 1485246481130]',NULL),(37,82047,0,'Tesla',0,NULL,'13000082021','http://common.cnblogs.com/images/wechat.png','2017-03-04 16:02:05',NULL,NULL),(38,82048,0,'Moto',0,NULL,'13000038711','http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','2017-03-04 16:04:02',NULL,NULL),(39,82049,0,'ITMan',0,NULL,'13000038712','http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000','2017-03-05 09:51:51',NULL,NULL),(40,82050,0,'Parl',0,NULL,'13000038713','http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','2017-03-05 09:52:52',NULL,NULL),(41,82051,0,'Girl',0,NULL,'13000038714','http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','2017-03-05 09:53:37',NULL,NULL),(42,82052,0,'Unbrella',0,NULL,'13000038715','http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','2017-03-05 09:57:54',NULL,NULL),(43,82053,0,'Alice',0,NULL,'13000038720','http://common.cnblogs.com/images/wechat.png','2017-03-05 15:25:42',NULL,NULL),(44,82054,0,'Harvey',0,NULL,'13000038721','http://static.oschina.net/uploads/user/19/39085_50.jpg','2017-03-06 12:29:03',NULL,NULL),(45,82055,1,'Solid',0,NULL,'13000082030','http://static.oschina.net/uploads/user/19/39085_50.jpg','2017-03-11 15:04:00','[38710, 82002]',NULL),(46,82056,1,'IronMan',0,NULL,'13000082040','http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','2017-03-11 15:32:25',NULL,NULL),(47,82057,0,'NullPointerExeption',0,NULL,'13000038730','http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','2017-03-12 06:01:23',NULL,NULL),(48,82058,0,'StupidBird',0,NULL,'13000038750','/storage/emulated/0/zblibrary.demo/image/output_image1489317829932.jpg','2017-03-12 11:23:04','[82001, 82002]',NULL),(49,82059,1,'He&She',0,NULL,'13000082033','http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','2017-03-19 14:49:15',NULL,NULL),(50,82060,1,'Anyway~',0,NULL,'13000082050','http://static.oschina.net/uploads/user/1/3064_50.jpg?t=1449566001000','2017-03-21 14:10:18',NULL,NULL),(51,90814,0,'007',1,NULL,'13000090814','http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000','2017-02-01 11:21:50',NULL,NULL),(52,93793,0,'Mike',1,'GES','13000093793','http://static.oschina.net/uploads/user/48/96331_50.jpg','2017-02-01 11:21:50',NULL,NULL),(53,93794,0,'Lemon',0,NULL,'99999999999','http://static.oschina.net/uploads/user/48/97721_50.jpg?t=1451544779000','2017-02-01 11:21:50',NULL,NULL),(54,1490109742863,1,'APIJSONUser',0,NULL,'13000082100',NULL,'2017-03-21 15:22:22',NULL,NULL),(55,1490109845208,0,'APIJSONUser',0,NULL,'13000082101',NULL,'2017-03-21 15:24:05',NULL,NULL),(56,1490420651686,1,'APIJSONUser',0,NULL,'13000038716',NULL,'2017-03-25 05:44:11','[70793]',NULL),(57,1490427139175,0,'APIJSONUser',0,NULL,'13000038717',NULL,'2017-03-25 07:32:19','[38710, 70793]',NULL),(58,1490427577823,0,'APIJSONUser',0,NULL,'13000082102',NULL,'2017-03-25 07:39:37',NULL,NULL),(59,1490584952968,0,'APIJSONUser',0,NULL,'13000038790',NULL,'2017-03-27 03:22:32',NULL,NULL),(60,1490973670928,1,'APIJSONUser',0,NULL,'13000082051','/storage/emulated/0/zblibrary.demo/image/output_image1490974049707.jpg','2017-03-31 15:21:10','[70793, 93793]',NULL),(61,1492936169722,0,'APIJSONUser',0,NULL,'13000093794',NULL,'2017-04-23 08:29:29',NULL,NULL),(62,1493480142628,0,'APIJSONUser',0,NULL,'13000038888',NULL,'2017-04-29 15:35:42',NULL,NULL),(63,1493747512860,0,'APIJSONUser',0,NULL,'13000038777',NULL,'2017-05-02 17:51:52',NULL,NULL),(64,1493747777770,0,'APIJSONUser',0,NULL,'13000038778',NULL,'2017-05-02 17:56:17',NULL,NULL),(65,1493748594003,0,'APIJSONUser',0,NULL,'13000038779',NULL,'2017-05-02 18:09:54',NULL,NULL),(66,1493748615711,0,'APIJSONUser',0,NULL,'13000038780',NULL,'2017-05-02 18:10:15',NULL,NULL),(67,1493749090643,0,'APIJSONUser',0,NULL,'13000038781',NULL,'2017-05-02 18:18:10',NULL,NULL),(68,1493836043151,0,'APIJSONUser',0,NULL,'13000038999',NULL,'2017-05-03 18:27:23',NULL,NULL),(69,1493883110132,0,'APIJSONUser',0,NULL,'13000039999',NULL,'2017-05-04 07:31:50',NULL,NULL),(70,1493890214167,0,'APIJSONUser',0,NULL,'13000031000',NULL,'2017-05-04 09:30:14',NULL,NULL),(71,1493890303473,0,'APIJSONUser',0,NULL,'13000031001',NULL,'2017-05-04 09:31:43',NULL,NULL); -/*!40000 ALTER TABLE `User` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2017-05-08 15:54:34 diff --git a/table/sys_Verify.sql b/table/sys_Verify.sql index 62ee43b2d..3be650025 100644 --- a/table/sys_Verify.sql +++ b/table/sys_Verify.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,12 +23,13 @@ DROP TABLE IF EXISTS `Verify`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Verify` ( - `id` bigint(15) NOT NULL COMMENT '一般存phone', - `type` int(2) DEFAULT NULL COMMENT '类型:\n验证码登录、注册验证手机、修改密码验证手机...', - `verify` int(6) NOT NULL, - `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `id` bigint(15) NOT NULL AUTO_INCREMENT COMMENT '唯一标识', + `type` int(2) NOT NULL DEFAULT '0' COMMENT '类型:\n0-登录\n1-注册\n2-修改登录密码\n3-修改支付密码', + `phone` bigint(11) NOT NULL COMMENT '手机号', + `verify` int(6) NOT NULL COMMENT '验证码', + `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=1510493252851 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -37,7 +38,7 @@ CREATE TABLE `Verify` ( LOCK TABLES `Verify` WRITE; /*!40000 ALTER TABLE `Verify` DISABLE KEYS */; -INSERT INTO `Verify` VALUES (13000031000,NULL,10442,'2017-05-04 09:30:02'),(13000031001,NULL,9445,'2017-05-04 09:31:30'),(13000038710,NULL,5405,'2017-06-18 13:34:18'),(13000038752,NULL,5879,'2017-04-22 13:03:37'),(13000038758,NULL,10077,'2017-04-22 13:09:06'),(13000038777,NULL,9175,'2017-05-02 17:51:45'),(13000038778,NULL,1191,'2017-05-02 17:56:13'),(13000038779,NULL,10350,'2017-05-02 18:09:41'),(13000038780,NULL,4200,'2017-05-02 18:10:00'),(13000038781,NULL,6674,'2017-05-02 18:18:02'),(13000038888,NULL,8186,'2017-04-29 15:35:33'),(13000038999,NULL,6167,'2017-05-03 18:27:16'),(13000039999,NULL,8566,'2017-05-04 07:31:38'),(13000082001,NULL,5517,'2017-06-18 13:33:50'),(13000082011,NULL,5482,'2017-06-17 14:02:47'),(13000082013,NULL,1229,'2017-06-17 14:04:59'),(13000082081,NULL,6760,'2017-05-04 07:32:01'),(13000082111,NULL,5650,'2017-06-18 13:36:07'),(13000093794,NULL,7563,'2017-04-23 08:29:20'); +INSERT INTO `Verify` VALUES (1,0,13000003871,2858,'2017-08-13 11:28:05'),(2,0,13000011111,1199,'2017-10-05 16:22:30'),(3,0,13000031000,10442,'2017-05-04 09:30:02'),(4,0,13000031001,9445,'2017-05-04 09:31:30'),(6,0,13000038752,5879,'2017-04-22 13:03:37'),(7,0,13000038758,10077,'2017-04-22 13:09:06'),(8,0,13000038777,9175,'2017-05-02 17:51:45'),(9,0,13000038778,1191,'2017-05-02 17:56:13'),(10,0,13000038779,10350,'2017-05-02 18:09:41'),(11,0,13000038780,4200,'2017-05-02 18:10:00'),(12,0,13000038781,6674,'2017-05-02 18:18:02'),(13,0,13000038888,8186,'2017-04-29 15:35:33'),(14,0,13000038999,6167,'2017-05-03 18:27:16'),(15,0,13000039999,8566,'2017-05-04 07:31:38'),(16,0,13000066666,6533,'2017-10-15 08:13:55'),(19,0,13000082011,7026,'2017-07-03 04:47:03'),(20,0,13000082013,1229,'2017-06-17 14:04:59'),(21,0,13000082081,6760,'2017-05-04 07:32:01'),(22,0,13000082111,5650,'2017-06-18 13:36:07'),(23,0,13000082222,9150,'2017-08-13 15:49:32'),(24,0,13000082333,3870,'2017-08-13 15:49:57'),(25,0,13000093794,7563,'2017-04-23 08:29:20'),(26,0,13000099999,7739,'2017-07-23 15:53:25'),(1508066865532,1,13000082001,8005,'2017-10-15 11:27:45'),(1508072060590,1,13000082009,1121,'2017-10-15 12:54:20'),(1508072096335,1,13000082008,1495,'2017-10-15 12:54:56'),(1508072156293,1,13000082007,7710,'2017-10-15 12:55:56'),(1508072196911,1,13000082031,9802,'2017-10-15 12:56:36'),(1508072543063,0,13000093793,3584,'2017-10-15 13:02:23'),(1508072747213,0,13000070793,5260,'2017-10-15 13:05:47'),(1508072788782,1,13000082045,8191,'2017-10-15 13:06:28'),(1508072814874,1,13000082023,9574,'2017-10-15 13:06:54'),(1508072818273,1,13000082024,7824,'2017-10-15 13:06:58'),(1509026206702,1,15734087934,5754,'2017-10-26 13:56:46'),(1509273368370,0,13000082001,1130,'2017-10-29 10:36:08'),(1510492736134,1,13000083871,8276,'2017-11-12 13:18:56'),(1510493180984,2,13000038710,6568,'2017-11-12 13:26:20'),(1510493200421,0,13000038710,4942,'2017-11-12 13:26:40'),(1510493252850,1,13000082000,5713,'2017-11-12 13:27:32'); /*!40000 ALTER TABLE `Verify` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -50,4 +51,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:13 diff --git a/table/sys__Statistics.sql b/table/sys__Statistics.sql index 70e2eaa19..96a82266a 100644 --- a/table/sys__Statistics.sql +++ b/table/sys__Statistics.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -54,4 +54,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:14 diff --git a/table/sys__Visit.sql b/table/sys__Visit.sql index 5b3166848..e186d4a5e 100644 --- a/table/sys__Visit.sql +++ b/table/sys__Visit.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -48,4 +48,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:27 +-- Dump completed on 2017-11-12 21:45:13 diff --git a/table/sys_apijson_privacy.sql b/table/sys_apijson_privacy.sql new file mode 100644 index 000000000..34766ded1 --- /dev/null +++ b/table/sys_apijson_privacy.sql @@ -0,0 +1,55 @@ +-- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) +-- +-- Host: 39.108.143.172 Database: sys +-- ------------------------------------------------------ +-- Server version 5.7.19-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `apijson_privacy` +-- + +DROP TABLE IF EXISTS `apijson_privacy`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `apijson_privacy` ( + `id` bigint(20) NOT NULL COMMENT '唯一标识', + `certified` tinyint(2) NOT NULL DEFAULT '0' COMMENT '已认证', + `phone` bigint(11) NOT NULL COMMENT '手机号,仅支持 11 位数的。不支持 +86 这种国家地区开头的。如果要支持就改为 VARCHAR(14)', + `balance` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额', + `_password` varchar(20) NOT NULL COMMENT '登录密码', + `_payPassword` int(6) DEFAULT NULL COMMENT '支付密码', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户隐私信息表。对安全要求高,不想泄漏真实名称。对外名称为 Privacy'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `apijson_privacy` +-- + +LOCK TABLES `apijson_privacy` WRITE; +/*!40000 ALTER TABLE `apijson_privacy` DISABLE KEYS */; +INSERT INTO `apijson_privacy` VALUES (38710,1,13000038710,33426.00,'apijson',666666),(70793,0,13000070793,56000.00,'apijson',666666),(82001,1,13000082001,8067.00,'123456',123456),(82002,1,13000082002,6362.00,'123456',123456),(82003,1,13000082003,2000.00,'123456',123456),(82004,0,13000082004,2000.00,'123456',123456),(82005,0,13000082005,2000.00,'123456',123456),(82006,0,13000082006,2000.00,'123456',123456),(82012,0,13000082012,0.00,'123456',123456),(82020,0,12345678900,0.00,'123456',123456),(82021,0,12345678901,0.00,'123456',123456),(82022,0,12345678902,0.00,'123456',123456),(82023,0,12345678903,0.00,'123456',123456),(82024,0,12345678904,0.00,'123456',123456),(82025,0,12345678905,0.00,'123456',123456),(82026,0,12345678906,0.00,'123456',123456),(82027,0,12345678907,0.00,'123456',123456),(82028,0,12345678908,0.00,'123456',123456),(82029,0,12345678909,0.00,'123456',123456),(82030,0,12345678910,0.00,'123456',123456),(82031,0,12345678911,0.00,'123456',123456),(82032,0,12345678912,0.00,'123456',123456),(82033,0,12345678913,0.00,'123456',123456),(82034,0,12345678914,0.00,'123456',123456),(82035,0,12345678915,0.00,'123456',123456),(82036,0,12345678916,0.00,'123456',123456),(82037,0,12345678917,0.00,'123456',123456),(82038,0,12345678918,0.00,'123456',123456),(82039,0,12345678919,0.00,'123456',123456),(82040,0,13000082019,0.00,'123456',123456),(82041,0,13000082015,0.00,'123456',123456),(82042,0,13000082016,0.00,'123456',123456),(82043,0,13000082017,0.00,'123456',123456),(82044,0,13000082018,0.00,'123456',123456),(82045,0,13000082020,0.00,'123456',123456),(82046,0,13000082010,0.00,'123456',123456),(82047,0,13000082021,0.00,'123456',123456),(82048,0,13000038711,0.00,'123456',123456),(82049,0,13000038712,0.00,'123456',123456),(82050,0,13000038713,0.00,'123456',123456),(82051,0,13000038714,0.00,'123456',123456),(82052,0,13000038715,0.00,'123456',123456),(82053,0,13000038720,0.00,'123456',123456),(82054,0,13000038721,0.00,'123456',123456),(82055,0,13000082030,0.00,'123456',123456),(82056,0,13000082040,0.00,'123456',123456),(82057,0,13000038730,0.00,'123456',123456),(82058,0,13000038750,0.00,'123456',123456),(82059,0,13000082033,0.00,'123456',123456),(82060,0,13000082050,0.00,'123456',123456),(90814,1,13000090814,0.00,'123456',123456),(93793,1,13000093793,3000.00,'apijson',666666),(93794,0,99999999999,0.00,'123456',123456),(1490109742863,0,13000082100,0.00,'123456',123456),(1490109845208,0,13000082101,0.00,'123456',123456),(1490420651686,0,13000038716,0.00,'123456',123456),(1490427139175,0,13000038717,0.00,'123456',123456),(1490427577823,0,13000082102,0.00,'123456',123456),(1490584952968,0,13000038790,0.00,'123456',123456),(1490973670928,0,13000082051,0.00,'123456',123456),(1492936169722,0,13000093794,0.00,'123456',123456),(1493480142628,0,13000038888,0.00,'123456',123456),(1493747512860,0,13000038777,0.00,'123456',123456),(1493747777770,0,13000038778,0.00,'123456',123456),(1493748594003,0,13000038779,0.00,'123456',123456),(1493748615711,0,13000038780,0.00,'123456',123456),(1493749090643,0,13000038781,0.00,'123456',123456),(1493836043151,0,13000038999,0.00,'123456',123456),(1493883110132,0,13000039999,0.00,'123456',123456),(1493890214167,0,13000031000,0.00,'123456',123456),(1493890303473,0,13000031001,0.00,'123456',123456),(1493890303474,0,13000088888,0.00,'123456',123456),(1493890303475,0,13000088888,0.00,'123456',123456),(1497792972314,0,13000082111,0.00,'654321',NULL),(1499057230629,0,13000082011,0.00,'123456',NULL),(1500825221910,0,13000099999,0.00,'123456',NULL),(1502639062900,0,13000082222,0.00,'123456',NULL),(1502639424119,0,13000082333,0.00,'12345678',NULL),(1507220582167,0,13000011111,0.00,'123456',NULL),(1508072071492,0,13000082009,0.00,'123456',NULL),(1508072105320,0,13000082008,0.00,'123456',NULL),(1508072160401,0,13000082007,0.00,'123456',NULL),(1508072202871,0,13000082031,0.00,'123456',NULL); +/*!40000 ALTER TABLE `apijson_privacy` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2017-11-12 21:45:12 diff --git a/table/sys_apijson_user.sql b/table/sys_apijson_user.sql index 26c1127f8..2fe4a3c61 100644 --- a/table/sys_apijson_user.sql +++ b/table/sys_apijson_user.sql @@ -1,8 +1,8 @@ -- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) -- --- Host: localhost Database: sys +-- Host: 39.108.143.172 Database: sys -- ------------------------------------------------------ --- Server version 5.7.16 +-- Server version 5.7.19-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -23,16 +23,16 @@ DROP TABLE IF EXISTS `apijson_user`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `apijson_user` ( - `id` bigint(15) NOT NULL AUTO_INCREMENT, - `sex` tinyint(2) NOT NULL DEFAULT '0', - `name` varchar(20) DEFAULT NULL, - `tag` varchar(45) DEFAULT NULL, - `head` varchar(300) DEFAULT NULL, - `contactIdList` json DEFAULT NULL COMMENT '联系人id列表', - `pictureList` json DEFAULT NULL, - `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `id` bigint(15) NOT NULL AUTO_INCREMENT COMMENT '唯一标识', + `sex` tinyint(2) NOT NULL DEFAULT '0' COMMENT '性别:\n0-男\n1-女', + `name` varchar(20) DEFAULT NULL COMMENT '名称', + `tag` varchar(45) DEFAULT NULL COMMENT '标签', + `head` varchar(300) DEFAULT NULL COMMENT '头像url', + `contactIdList` json NOT NULL COMMENT '联系人id列表', + `pictureList` json NOT NULL COMMENT '照片列表', + `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1497792972315 DEFAULT CHARSET=utf8 COMMENT='对安全要求高,不想泄漏真实名称。对外名称为 User'; +) ENGINE=InnoDB AUTO_INCREMENT=1508072202872 DEFAULT CHARSET=utf8 COMMENT='对安全要求高,不想泄漏真实名称。对外名称为 User'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -41,7 +41,7 @@ CREATE TABLE `apijson_user` ( LOCK TABLES `apijson_user` WRITE; /*!40000 ALTER TABLE `apijson_user` DISABLE KEYS */; -INSERT INTO `apijson_user` VALUES (38710,0,'Tommy&Lemon','Android&Java','http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000','[82003, 82005, 90814, 82004, 82009, 82002, 82044, 93793, 70793]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]','2017-02-01 11:21:50'),(70793,0,'Strong','djdj','http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','[38710, 82002]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/788c0a7e11a\", \"https://camo.githubusercontent.com/f513f67\"]','2017-02-01 11:21:50'),(82001,0,'Android','Android Developer','http://static.oschina.net/uploads/user/19/39085_50.jpg','[82004, 82021, 82023, 82025, 82039, 82027, 82002, 93793, 70793]','[\"http://common.cnblogs.com/images/icon_weibo_24.png\"]','2017-02-01 11:21:50'),(82002,1,'Happy','iOS','http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000','[82005, 70793, 82001]',NULL,'2017-02-01 11:21:50'),(82003,1,'Wechat',NULL,'http://common.cnblogs.com/images/wechat.png','[82001, 93793]',NULL,'2017-02-01 11:21:50'),(82004,0,'Tommy','fasef','http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000',NULL,NULL,'2017-02-01 11:21:50'),(82005,1,'Jan','AG','http://my.oschina.net/img/portrait.gif?t=1451961935000','[82001, 38710]',NULL,'2017-02-01 11:21:50'),(82006,1,'Meria',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000',NULL,NULL,'2017-02-01 11:21:50'),(82012,0,'Steve','FEWE','http://static.oschina.net/uploads/user/1/3064_50.jpg?t=1449566001000','[82004, 82002, 93793]',NULL,'2017-02-01 11:21:50'),(82020,0,'ORANGE',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000',NULL,NULL,'2017-02-01 11:21:50'),(82021,1,'Tommy',NULL,'http://static.oschina.net/uploads/user/19/39085_50.jpg',NULL,NULL,'2017-02-01 11:21:50'),(82022,0,'Internet',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000',NULL,NULL,'2017-02-01 11:21:50'),(82023,0,'No1',NULL,'http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000',NULL,NULL,'2017-02-01 11:21:50'),(82024,0,'Lemon',NULL,'http://static.oschina.net/uploads/user/427/855532_50.jpg?t=1435030876000',NULL,NULL,'2017-02-01 11:21:50'),(82025,1,'Tommy',NULL,'http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000',NULL,NULL,'2017-02-01 11:21:50'),(82026,0,'iOS',NULL,'http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000',NULL,NULL,'2017-02-01 11:21:50'),(82027,0,'Yong',NULL,'http://my.oschina.net/img/portrait.gif?t=1451961935000',NULL,NULL,'2017-02-01 11:21:50'),(82028,1,'gaeg',NULL,'http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000',NULL,NULL,'2017-02-01 11:21:50'),(82029,0,'GASG',NULL,'http://common.cnblogs.com/images/wechat.png',NULL,NULL,'2017-02-01 11:21:50'),(82030,1,'Fun',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000',NULL,NULL,'2017-02-01 11:21:50'),(82031,0,'Lemon',NULL,'http://static.oschina.net/uploads/user/48/96331_50.jpg',NULL,NULL,'2017-02-01 11:21:50'),(82032,0,'Stack','fasdg','http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000',NULL,NULL,'2017-02-01 11:21:50'),(82033,1,'GAS',NULL,'http://my.oschina.net/img/portrait.gif?t=1451961935000',NULL,NULL,'2017-02-01 11:21:50'),(82034,1,'Jump',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000',NULL,NULL,'2017-02-01 11:21:50'),(82035,1,'Tab',NULL,'http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000',NULL,NULL,'2017-02-01 11:21:50'),(82036,0,'SAG',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000',NULL,NULL,'2017-02-01 11:21:50'),(82037,0,'Test',NULL,'http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000',NULL,NULL,'2017-02-01 11:21:50'),(82038,0,'Battle',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000',NULL,NULL,'2017-02-01 11:21:50'),(82039,1,'Everyday',NULL,'http://common.cnblogs.com/images/icon_weibo_24.png',NULL,NULL,'2017-02-19 13:57:56'),(82040,1,'Dream',NULL,'/storage/emulated/0/output_image.jpg','[70793]',NULL,'2017-03-02 16:44:26'),(82041,0,'Holo',NULL,'/storage/emulated/0/output_image.jpg','[38710, 82001]',NULL,'2017-03-04 09:59:34'),(82042,1,'Why',NULL,'http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000',NULL,NULL,'2017-03-04 10:04:33'),(82043,0,'Holiday',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','[70793, 82006]',NULL,'2017-03-04 10:05:04'),(82044,1,'Love',NULL,'http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000','[82006]',NULL,'2017-03-04 10:20:27'),(82045,0,'Green',NULL,'http://common.cnblogs.com/images/wechat.png','[82001, 82002, 82003, 1485246481130]',NULL,'2017-03-04 10:22:39'),(82046,0,'Team',NULL,'/storage/emulated/0/output_image.jpg','[38710, 82002, 1485246481130]',NULL,'2017-03-04 15:11:17'),(82047,0,'Tesla',NULL,'http://common.cnblogs.com/images/wechat.png',NULL,NULL,'2017-03-04 16:02:05'),(82048,0,'Moto',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000',NULL,NULL,'2017-03-04 16:04:02'),(82049,0,'ITMan',NULL,'http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000',NULL,NULL,'2017-03-05 09:51:51'),(82050,0,'Parl',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000',NULL,NULL,'2017-03-05 09:52:52'),(82051,0,'Girl',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000',NULL,NULL,'2017-03-05 09:53:37'),(82052,0,'Unbrella',NULL,'http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000',NULL,NULL,'2017-03-05 09:57:54'),(82053,0,'Alice',NULL,'http://common.cnblogs.com/images/wechat.png',NULL,NULL,'2017-03-05 15:25:42'),(82054,0,'Harvey',NULL,'http://static.oschina.net/uploads/user/19/39085_50.jpg',NULL,NULL,'2017-03-06 12:29:03'),(82055,1,'Solid',NULL,'http://static.oschina.net/uploads/user/19/39085_50.jpg','[38710, 82002]',NULL,'2017-03-11 15:04:00'),(82056,1,'IronMan',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000',NULL,NULL,'2017-03-11 15:32:25'),(82057,0,'NullPointerExeption',NULL,'http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000',NULL,NULL,'2017-03-12 06:01:23'),(82058,0,'StupidBird',NULL,'/storage/emulated/0/zblibrary.demo/image/output_image1489317829932.jpg','[82001, 82002]',NULL,'2017-03-12 11:23:04'),(82059,1,'He&She',NULL,'http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000',NULL,NULL,'2017-03-19 14:49:15'),(82060,1,'Anyway~',NULL,'http://static.oschina.net/uploads/user/1/3064_50.jpg?t=1449566001000',NULL,NULL,'2017-03-21 14:10:18'),(90814,0,'007',NULL,'http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000',NULL,NULL,'2017-02-01 11:21:50'),(93793,0,'Mike','GES','http://static.oschina.net/uploads/user/48/96331_50.jpg',NULL,NULL,'2017-02-01 11:21:50'),(93794,0,'Lemon',NULL,'http://static.oschina.net/uploads/user/48/97721_50.jpg?t=1451544779000',NULL,NULL,'2017-02-01 11:21:50'),(1490109742863,1,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-03-21 15:22:22'),(1490109845208,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-03-21 15:24:05'),(1490420651686,1,'APIJSONUser',NULL,NULL,'[70793]',NULL,'2017-03-25 05:44:11'),(1490427139175,0,'APIJSONUser',NULL,NULL,'[38710, 70793]',NULL,'2017-03-25 07:32:19'),(1490427577823,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-03-25 07:39:37'),(1490584952968,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-03-27 03:22:32'),(1490973670928,1,'APIJSONUser',NULL,'/storage/emulated/0/zblibrary.demo/image/output_image1490974049707.jpg','[70793, 93793]',NULL,'2017-03-31 15:21:10'),(1492936169722,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-04-23 08:29:29'),(1493480142628,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-04-29 15:35:42'),(1493747512860,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-02 17:51:52'),(1493747777770,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-02 17:56:17'),(1493748594003,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-02 18:09:54'),(1493748615711,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-02 18:10:15'),(1493749090643,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-02 18:18:10'),(1493836043151,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-03 18:27:23'),(1493883110132,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-04 07:31:50'),(1493890214167,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-04 09:30:14'),(1493890303473,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-05-04 09:31:43'),(1493890303474,0,'Test Post',NULL,NULL,NULL,NULL,'2017-06-12 15:50:44'),(1493890303475,0,'Test Post',NULL,NULL,NULL,NULL,'2017-06-12 15:51:23'),(1497792972314,0,'APIJSONUser',NULL,NULL,NULL,NULL,'2017-06-18 13:36:12'); +INSERT INTO `apijson_user` VALUES (38710,0,'TommyLemon','Android&Java','http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000','[82003, 82005, 90814, 82004, 82009, 82002, 82044, 93793, 70793]','[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\", \"http://common.cnblogs.com/images/icon_weibo_24.png\"]','2017-02-01 11:21:50'),(70793,0,'Strong','djdj','http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','[38710, 82002]','[\"http://static.oschina.net/uploads/img/201604/22172508_eGDi.jpg\", \"http://static.oschina.net/uploads/img/201604/22172507_rrZ5.jpg\", \"https://camo.githubusercontent.com/788c0a7e11a\", \"https://camo.githubusercontent.com/f513f67\"]','2017-02-01 11:21:50'),(82001,0,'Test','APIJSON User','http://static.oschina.net/uploads/user/19/39085_50.jpg','[82004, 82021, 70793]','[\"http://common.cnblogs.com/images/icon_weibo_24.png\"]','2017-02-01 11:21:50'),(82002,1,'Happy~','iOS','http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000','[82005, 82001, 38710]','[]','2017-02-01 11:21:50'),(82003,1,'Wechat',NULL,'http://common.cnblogs.com/images/wechat.png','[82001, 93793]','[]','2017-02-01 11:21:50'),(82004,0,'Tommy','fasef','http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000','[]','[]','2017-02-01 11:21:50'),(82005,1,'Jan','AG','http://my.oschina.net/img/portrait.gif?t=1451961935000','[82001, 38710]','[]','2017-02-01 11:21:50'),(82006,1,'Meria',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','[]','[]','2017-02-01 11:21:50'),(82012,0,'Steve','FEWE','http://static.oschina.net/uploads/user/1/3064_50.jpg?t=1449566001000','[82004, 82002, 93793]','[]','2017-02-01 11:21:50'),(82020,0,'ORANGE',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','[]','[]','2017-02-01 11:21:50'),(82021,1,'Tommy',NULL,'http://static.oschina.net/uploads/user/19/39085_50.jpg','[]','[]','2017-02-01 11:21:50'),(82022,0,'Internet',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','[]','[]','2017-02-01 11:21:50'),(82023,0,'No1',NULL,'http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','[]','[]','2017-02-01 11:21:50'),(82024,0,'Lemon',NULL,'http://static.oschina.net/uploads/user/427/855532_50.jpg?t=1435030876000','[]','[]','2017-02-01 11:21:50'),(82025,1,'Tommy',NULL,'http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000','[]','[]','2017-02-01 11:21:50'),(82026,0,'iOS',NULL,'http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000','[]','[]','2017-02-01 11:21:50'),(82027,0,'Yong',NULL,'http://my.oschina.net/img/portrait.gif?t=1451961935000','[]','[]','2017-02-01 11:21:50'),(82028,1,'gaeg',NULL,'http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','[]','[]','2017-02-01 11:21:50'),(82029,0,'GASG',NULL,'http://common.cnblogs.com/images/wechat.png','[]','[]','2017-02-01 11:21:50'),(82030,1,'Fun',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','[]','[]','2017-02-01 11:21:50'),(82031,0,'Lemon',NULL,'http://static.oschina.net/uploads/user/48/96331_50.jpg','[]','[]','2017-02-01 11:21:50'),(82032,0,'Stack','fasdg','http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','[]','[]','2017-02-01 11:21:50'),(82033,1,'GAS',NULL,'http://my.oschina.net/img/portrait.gif?t=1451961935000','[]','[]','2017-02-01 11:21:50'),(82034,1,'Jump',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','[]','[]','2017-02-01 11:21:50'),(82035,1,'Tab',NULL,'http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000','[]','[]','2017-02-01 11:21:50'),(82036,0,'SAG',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','[]','[]','2017-02-01 11:21:50'),(82037,0,'Test',NULL,'http://static.oschina.net/uploads/user/1200/2400261_50.png?t=1439638750000','[]','[]','2017-02-01 11:21:50'),(82038,0,'Battle',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','[]','[]','2017-02-01 11:21:50'),(82039,1,'Everyday',NULL,'http://common.cnblogs.com/images/icon_weibo_24.png','[]','[]','2017-02-19 13:57:56'),(82040,1,'Dream',NULL,'/storage/emulated/0/output_image.jpg','[70793]','[]','2017-03-02 16:44:26'),(82041,0,'Holo',NULL,'/storage/emulated/0/output_image.jpg','[38710, 82001]','[]','2017-03-04 09:59:34'),(82042,1,'Why',NULL,'http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','[]','[]','2017-03-04 10:04:33'),(82043,0,'Holiday',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','[70793, 82006]','[]','2017-03-04 10:05:04'),(82044,1,'Love',NULL,'http://static.oschina.net/uploads/user/1174/2348263_50.png?t=1439773471000','[82006]','[]','2017-03-04 10:20:27'),(82045,0,'Green',NULL,'http://common.cnblogs.com/images/wechat.png','[82001, 82002, 82003, 1485246481130]','[]','2017-03-04 10:22:39'),(82046,0,'Team',NULL,'/storage/emulated/0/output_image.jpg','[38710, 82002, 1485246481130]','[]','2017-03-04 15:11:17'),(82047,0,'Tesla',NULL,'http://common.cnblogs.com/images/wechat.png','[]','[]','2017-03-04 16:02:05'),(82048,0,'Moto',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','[]','[]','2017-03-04 16:04:02'),(82049,0,'ITMan',NULL,'http://static.oschina.net/uploads/user/629/1258821_50.jpg?t=1378063141000','[]','[]','2017-03-05 09:51:51'),(82050,0,'Parl',NULL,'http://static.oschina.net/uploads/user/998/1997902_50.jpg?t=1407806577000','[]','[]','2017-03-05 09:52:52'),(82051,0,'Girl',NULL,'http://static.oschina.net/uploads/user/1332/2664107_50.jpg?t=1457405500000','[]','[]','2017-03-05 09:53:37'),(82052,0,'Unbrella',NULL,'http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','[]','[]','2017-03-05 09:57:54'),(82053,0,'Alice',NULL,'http://common.cnblogs.com/images/wechat.png','[]','[]','2017-03-05 15:25:42'),(82054,0,'Harvey',NULL,'http://static.oschina.net/uploads/user/19/39085_50.jpg','[]','[]','2017-03-06 12:29:03'),(82055,1,'Solid',NULL,'http://static.oschina.net/uploads/user/19/39085_50.jpg','[38710, 82002]','[]','2017-03-11 15:04:00'),(82056,1,'IronMan',NULL,'http://static.oschina.net/uploads/user/48/96289_50.jpg?t=1452751699000','[]','[]','2017-03-11 15:32:25'),(82057,0,'NullPointerExeption',NULL,'http://static.oschina.net/uploads/user/1385/2770216_50.jpg?t=1464405516000','[]','[]','2017-03-12 06:01:23'),(82058,0,'StupidBird',NULL,'/storage/emulated/0/zblibrary.demo/image/output_image1489317829932.jpg','[82001, 82002]','[]','2017-03-12 11:23:04'),(82059,1,'He&She',NULL,'http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000','[]','[]','2017-03-19 14:49:15'),(82060,1,'Anyway~',NULL,'http://static.oschina.net/uploads/user/1/3064_50.jpg?t=1449566001000','[]','[]','2017-03-21 14:10:18'),(90814,0,'007',NULL,'http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000','[]','[]','2017-02-01 11:21:50'),(93793,0,'Mike','GES','http://static.oschina.net/uploads/user/48/96331_50.jpg','[]','[]','2017-02-01 11:21:50'),(93794,0,'Lemon',NULL,'http://static.oschina.net/uploads/user/48/97721_50.jpg?t=1451544779000','[]','[]','2017-02-01 11:21:50'),(1490109742863,1,'APIJSONUser',NULL,NULL,'[]','[]','2017-03-21 15:22:22'),(1490109845208,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-03-21 15:24:05'),(1490420651686,1,'APIJSONUser',NULL,NULL,'[70793]','[]','2017-03-25 05:44:11'),(1490427139175,0,'APIJSONUser',NULL,NULL,'[38710, 70793]','[]','2017-03-25 07:32:19'),(1490427577823,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-03-25 07:39:37'),(1490584952968,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-03-27 03:22:32'),(1490973670928,1,'APIJSONUser',NULL,'/storage/emulated/0/zblibrary.demo/image/output_image1490974049707.jpg','[70793, 93793]','[]','2017-03-31 15:21:10'),(1492936169722,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-04-23 08:29:29'),(1493480142628,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-04-29 15:35:42'),(1493747512860,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-02 17:51:52'),(1493747777770,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-02 17:56:17'),(1493748594003,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-02 18:09:54'),(1493748615711,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-02 18:10:15'),(1493749090643,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-02 18:18:10'),(1493836043151,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-03 18:27:23'),(1493883110132,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-04 07:31:50'),(1493890214167,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-04 09:30:14'),(1493890303473,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-05-04 09:31:43'),(1493890303474,0,'Test Post',NULL,NULL,'[]','[]','2017-06-12 15:50:44'),(1493890303475,0,'Test Post',NULL,NULL,'[]','[]','2017-06-12 15:51:23'),(1497792972314,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-06-18 13:36:12'),(1497792972315,0,'一二三',NULL,NULL,'[]','[]','2017-06-25 10:42:33'),(1499057230629,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-07-03 04:47:10'),(1500825221910,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-07-23 15:53:41'),(1502638023483,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-08-13 15:27:03'),(1502639062900,0,'TESLA',NULL,NULL,'[]','[]','2017-08-13 15:44:22'),(1502639424119,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-08-13 15:50:24'),(1507220582167,0,'APIJSONUser',NULL,NULL,'[]','[]','2017-10-05 16:23:02'),(1508072071492,0,'赵钱孙李',NULL,'','[]','[]','2017-10-15 12:54:31'),(1508072105320,1,'周吴郑王',NULL,'','[]','[]','2017-10-15 12:55:05'),(1508072160401,0,'四五六',NULL,'','[]','[]','2017-10-15 12:56:00'),(1508072202871,0,'七八九十',NULL,'','[]','[]','2017-10-15 12:56:42'); /*!40000 ALTER TABLE `apijson_user` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -54,4 +54,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-06-18 21:37:26 +-- Dump completed on 2017-11-12 21:45:12 diff --git a/table/sys_apijson_user_privacy.sql b/table/sys_apijson_user_privacy.sql deleted file mode 100644 index 769dd01d7..000000000 --- a/table/sys_apijson_user_privacy.sql +++ /dev/null @@ -1,55 +0,0 @@ --- MySQL dump 10.13 Distrib 5.7.12, for osx10.9 (x86_64) --- --- Host: localhost Database: sys --- ------------------------------------------------------ --- Server version 5.7.16 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `apijson_user_privacy` --- - -DROP TABLE IF EXISTS `apijson_user_privacy`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `apijson_user_privacy` ( - `id` bigint(20) NOT NULL, - `certified` tinyint(1) NOT NULL DEFAULT '0', - `phone` bigint(11) NOT NULL COMMENT '手机号,仅支持 11 位数的。不支持 +86 这种国家地区开头的。如果要支持就改为 VARCHAR(14)', - `balance` decimal(10,2) NOT NULL DEFAULT '0.00', - `_password` varchar(20) NOT NULL, - `_payPassword` int(6) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='对安全要求高,不想泄漏真实名称。对外名称为 UserPrivacy'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `apijson_user_privacy` --- - -LOCK TABLES `apijson_user_privacy` WRITE; -/*!40000 ALTER TABLE `apijson_user_privacy` DISABLE KEYS */; -INSERT INTO `apijson_user_privacy` VALUES (38710,1,13000038710,20000.00,'apijson',666666),(70793,0,13000070793,50000.00,'apijson',666666),(82001,1,13000082001,8000.00,'123456',123456),(82002,1,13000082002,6000.00,'123456',123456),(82003,1,13000082003,2000.00,'123456',123456),(82004,0,13000082004,2000.00,'123456',123456),(82005,0,13000082005,2000.00,'123456',123456),(82006,0,13000082006,2000.00,'123456',123456),(82012,0,13000082012,0.00,'123456',123456),(82020,0,12345678900,0.00,'123456',123456),(82021,0,12345678901,0.00,'123456',123456),(82022,0,12345678902,0.00,'123456',123456),(82023,0,12345678903,0.00,'123456',123456),(82024,0,12345678904,0.00,'123456',123456),(82025,0,12345678905,0.00,'123456',123456),(82026,0,12345678906,0.00,'123456',123456),(82027,0,12345678907,0.00,'123456',123456),(82028,0,12345678908,0.00,'123456',123456),(82029,0,12345678909,0.00,'123456',123456),(82030,0,12345678910,0.00,'123456',123456),(82031,0,12345678911,0.00,'123456',123456),(82032,0,12345678912,0.00,'123456',123456),(82033,0,12345678913,0.00,'123456',123456),(82034,0,12345678914,0.00,'123456',123456),(82035,0,12345678915,0.00,'123456',123456),(82036,0,12345678916,0.00,'123456',123456),(82037,0,12345678917,0.00,'123456',123456),(82038,0,12345678918,0.00,'123456',123456),(82039,0,12345678919,0.00,'123456',123456),(82040,0,13000082019,0.00,'123456',123456),(82041,0,13000082015,0.00,'123456',123456),(82042,0,13000082016,0.00,'123456',123456),(82043,0,13000082017,0.00,'123456',123456),(82044,0,13000082018,0.00,'123456',123456),(82045,0,13000082020,0.00,'123456',123456),(82046,0,13000082010,0.00,'123456',123456),(82047,0,13000082021,0.00,'123456',123456),(82048,0,13000038711,0.00,'123456',123456),(82049,0,13000038712,0.00,'123456',123456),(82050,0,13000038713,0.00,'123456',123456),(82051,0,13000038714,0.00,'123456',123456),(82052,0,13000038715,0.00,'123456',123456),(82053,0,13000038720,0.00,'123456',123456),(82054,0,13000038721,0.00,'123456',123456),(82055,0,13000082030,0.00,'123456',123456),(82056,0,13000082040,0.00,'123456',123456),(82057,0,13000038730,0.00,'123456',123456),(82058,0,13000038750,0.00,'123456',123456),(82059,0,13000082033,0.00,'123456',123456),(82060,0,13000082050,0.00,'123456',123456),(90814,1,13000090814,0.00,'123456',123456),(93793,1,13000093793,3000.00,'apijson',666666),(93794,0,99999999999,0.00,'123456',123456),(1490109742863,0,13000082100,0.00,'123456',123456),(1490109845208,0,13000082101,0.00,'123456',123456),(1490420651686,0,13000038716,0.00,'123456',123456),(1490427139175,0,13000038717,0.00,'123456',123456),(1490427577823,0,13000082102,0.00,'123456',123456),(1490584952968,0,13000038790,0.00,'123456',123456),(1490973670928,0,13000082051,0.00,'123456',123456),(1492936169722,0,13000093794,0.00,'123456',123456),(1493480142628,0,13000038888,0.00,'123456',123456),(1493747512860,0,13000038777,0.00,'123456',123456),(1493747777770,0,13000038778,0.00,'123456',123456),(1493748594003,0,13000038779,0.00,'123456',123456),(1493748615711,0,13000038780,0.00,'123456',123456),(1493749090643,0,13000038781,0.00,'123456',123456),(1493836043151,0,13000038999,0.00,'123456',123456),(1493883110132,0,13000039999,0.00,'123456',123456),(1493890214167,0,13000031000,0.00,'123456',123456),(1493890303473,0,13000031001,0.00,'123456',123456),(1493890303474,0,13000088888,0.00,'123456',123456),(1493890303475,0,13000088888,0.00,'123456',123456),(1497792972314,0,13000082111,0.00,'654321',NULL); -/*!40000 ALTER TABLE `apijson_user_privacy` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2017-06-18 21:37:27