Commit f271af1b authored by Liang Ding's avatar Liang Ding

注册用户加入 URL 字段

暂时没有加入升级程序,所以需要重新初始化开发库。
parent dcc31bcc
...@@ -60,6 +60,7 @@ import org.json.JSONObject; ...@@ -60,6 +60,7 @@ import org.json.JSONObject;
@RequestProcessor @RequestProcessor
// TODO: 060 // TODO: 060
// 1. Add column Preference.feedOutputCnt // 1. Add column Preference.feedOutputCnt
// 2. Add column User.userURL
public final class UpgradeProcessor { public final class UpgradeProcessor {
/** /**
......
/* /*
* Copyright (c) 2009, 2010, 2011, 2012, 2013, B3log Team * Copyright (c) 2009, 2010, 2011, 2012, 2013, B3log Team
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.b3log.solo.processor.console; package org.b3log.solo.processor.console;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.model.Role; import org.b3log.latke.model.Role;
import org.b3log.latke.model.User; import org.b3log.latke.model.User;
import org.b3log.latke.service.LangPropsService; import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException; import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.HTTPRequestContext; import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod; import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing; import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor; import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JSONRenderer; import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.util.Requests; import org.b3log.latke.util.Requests;
import org.b3log.solo.service.UserMgmtService; import org.b3log.solo.service.UserMgmtService;
import org.b3log.solo.service.UserQueryService; import org.b3log.solo.service.UserQueryService;
import org.b3log.solo.util.QueryResults; import org.b3log.solo.util.QueryResults;
import org.b3log.solo.util.Users; import org.b3log.solo.util.Users;
import org.json.JSONObject; import org.json.JSONObject;
/** /**
* User console request processing. * User console request processing.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @author <a href="mailto:385321165@qq.com">DASHU</a> * @author <a href="mailto:385321165@qq.com">DASHU</a>
* @version 1.0.0.3, Mar 30, 2013 * @version 1.0.0.4, Apr 2, 2013
* @since 0.4.0 * @since 0.4.0
*/ */
@RequestProcessor @RequestProcessor
public final class UserConsole { public final class UserConsole {
/** /**
* Logger. * Logger.
*/ */
private static final Logger LOGGER = Logger.getLogger(UserConsole.class.getName()); private static final Logger LOGGER = Logger.getLogger(UserConsole.class.getName());
/** /**
* User query service. * User query service.
*/ */
private UserQueryService userQueryService = UserQueryService.getInstance(); private UserQueryService userQueryService = UserQueryService.getInstance();
/** /**
* User management service. * User management service.
*/ */
private UserMgmtService userMgmtService = UserMgmtService.getInstance(); private UserMgmtService userMgmtService = UserMgmtService.getInstance();
/** /**
* User utilities. * User utilities.
*/ */
private Users userUtils = Users.getInstance(); private Users userUtils = Users.getInstance();
/** /**
* Language service. * Language service.
*/ */
private LangPropsService langPropsService = LangPropsService.getInstance(); private LangPropsService langPropsService = LangPropsService.getInstance();
/** /**
* Updates a user by the specified request. * Updates a user by the specified request.
* *
* <p> * <p>
* Renders the response with a json object, for example, * Renders the response with a json object, for example,
* <pre> * <pre>
* { * {
* "sc": boolean, * "sc": boolean,
* "msg": "" * "msg": ""
* } * }
* </pre> * </pre>
* </p> * </p>
* *
* @param request the specified http servlet request, for example, * @param request the specified http servlet request, for example,
* <pre> * <pre>
* { * {
* "oId": "", * "oId": "",
* "userName": "", * "userName": "",
* "userEmail": "", * "userEmail": "",
* "userPassword": "", * "userPassword": "", // Unhashed
* "userRole": "" * "userRole": "", // optional
* } * "userURL": "", // optional
* </pre> * }
* @param context the specified http request context * </pre>
* @param response the specified http servlet response * @param context the specified http request context
* @throws Exception exception * @param response the specified http servlet response
*/ * @throws Exception exception
@RequestProcessing(value = "/console/user/", method = HTTPRequestMethod.PUT) */
public void updateUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context) @RequestProcessing(value = "/console/user/", method = HTTPRequestMethod.PUT)
throws Exception { public void updateUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context)
if (!userUtils.isAdminLoggedIn(request)) { throws Exception {
response.sendError(HttpServletResponse.SC_FORBIDDEN); if (!userUtils.isAdminLoggedIn(request)) {
return; response.sendError(HttpServletResponse.SC_FORBIDDEN);
} return;
}
final JSONRenderer renderer = new JSONRenderer();
final JSONRenderer renderer = new JSONRenderer();
context.setRenderer(renderer);
context.setRenderer(renderer);
final JSONObject ret = new JSONObject();
final JSONObject ret = new JSONObject();
try {
final JSONObject requestJSONObject = Requests.parseRequestJSONObject(request, response); try {
final JSONObject requestJSONObject = Requests.parseRequestJSONObject(request, response);
userMgmtService.updateUser(requestJSONObject);
userMgmtService.updateUser(requestJSONObject);
ret.put(Keys.STATUS_CODE, true);
ret.put(Keys.MSG, langPropsService.get("updateSuccLabel")); ret.put(Keys.STATUS_CODE, true);
ret.put(Keys.MSG, langPropsService.get("updateSuccLabel"));
renderer.setJSONObject(ret);
} catch (final ServiceException e) { renderer.setJSONObject(ret);
LOGGER.log(Level.SEVERE, e.getMessage(), e); } catch (final ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
final JSONObject jsonObject = QueryResults.defaultResult();
final JSONObject jsonObject = QueryResults.defaultResult();
renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.MSG, e.getMessage()); renderer.setJSONObject(jsonObject);
} jsonObject.put(Keys.MSG, e.getMessage());
} }
}
/**
* Adds a user with the specified request. /**
* * Adds a user with the specified request.
* <p> *
* Renders the response with a json object, for example, * <p>
* <pre> * Renders the response with a json object, for example,
* { * <pre>
* "sc": boolean, * {
* "oId": "", // Generated user id * "sc": boolean,
* "msg": "" * "oId": "", // Generated user id
* } * "msg": ""
* </pre> * }
* </p> * </pre>
* * </p>
* @param request the specified http servlet request, for example, *
* <pre> * @param request the specified http servlet request, for example,
* { * <pre>
* "userName": "", * {
* "userEmail": "", * "userName": "",
* "userPassword": "", * "userEmail": "",
* "userRole": "" // optional, uses {@value org.b3log.latke.model.Role#DEFAULT_ROLE} instead, * "userPassword": "",
* if not speciffied * "userURL": "", // optional, uses 'servePath' instead if not specified
* } * "userRole": "" // optional, uses {@value org.b3log.latke.model.Role#DEFAULT_ROLE} instead if not speciffied
* </pre> * }
* @param response the specified http servlet response * </pre>
* @param context the specified http request context * @param response the specified http servlet response
* @throws Exception exception * @param context the specified http request context
*/ * @throws Exception exception
@RequestProcessing(value = "/console/user/", method = HTTPRequestMethod.POST) */
public void addUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context) @RequestProcessing(value = "/console/user/", method = HTTPRequestMethod.POST)
throws Exception { public void addUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context)
throws Exception {
final JSONRenderer renderer = new JSONRenderer();
final JSONRenderer renderer = new JSONRenderer();
context.setRenderer(renderer);
context.setRenderer(renderer);
final JSONObject ret = new JSONObject();
final JSONObject ret = new JSONObject();
try {
final JSONObject requestJSONObject = Requests.parseRequestJSONObject(request, response); try {
final JSONObject requestJSONObject = Requests.parseRequestJSONObject(request, response);
if (userUtils.isAdminLoggedIn(request)) {
requestJSONObject.put(User.USER_ROLE, Role.DEFAULT_ROLE); if (userUtils.isAdminLoggedIn(request)) { // if the administrator register a new user, treats the new user as a normal user
} else { // (defaultRole) who could post article
requestJSONObject.put(User.USER_ROLE, Role.VISITOR_ROLE); requestJSONObject.put(User.USER_ROLE, Role.DEFAULT_ROLE);
} } else { // if a normal user or a visitor register a new user, treates the new user as a visitor (visitorRole) who couldn't
// post article
final String userId = userMgmtService.addUser(requestJSONObject); requestJSONObject.put(User.USER_ROLE, Role.VISITOR_ROLE);
}
ret.put(Keys.OBJECT_ID, userId);
ret.put(Keys.MSG, langPropsService.get("addSuccLabel")); final String userId = userMgmtService.addUser(requestJSONObject);
ret.put(Keys.STATUS_CODE, true);
ret.put(Keys.OBJECT_ID, userId);
renderer.setJSONObject(ret); ret.put(Keys.MSG, langPropsService.get("addSuccLabel"));
} catch (final ServiceException e) { ret.put(Keys.STATUS_CODE, true);
LOGGER.log(Level.SEVERE, e.getMessage(), e);
renderer.setJSONObject(ret);
final JSONObject jsonObject = QueryResults.defaultResult(); } catch (final ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.MSG, e.getMessage()); final JSONObject jsonObject = QueryResults.defaultResult();
}
} renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.MSG, e.getMessage());
/** }
* Removes a user by the specified request. }
*
* <p> /**
* Renders the response with a json object, for example, * Removes a user by the specified request.
* <pre> *
* { * <p>
* "sc": boolean, * Renders the response with a json object, for example,
* "msg": "" * <pre>
* } * {
* </pre> * "sc": boolean,
* </p> * "msg": ""
* * }
* @param request the specified http servlet request * </pre>
* @param response the specified http servlet response * </p>
* @param context the specified http request context *
* @throws Exception exception * @param request the specified http servlet request
*/ * @param response the specified http servlet response
@RequestProcessing(value = "/console/user/*", method = HTTPRequestMethod.DELETE) * @param context the specified http request context
public void removeUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context) * @throws Exception exception
throws Exception { */
if (!userUtils.isAdminLoggedIn(request)) { @RequestProcessing(value = "/console/user/*", method = HTTPRequestMethod.DELETE)
response.sendError(HttpServletResponse.SC_FORBIDDEN); public void removeUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context)
return; throws Exception {
} if (!userUtils.isAdminLoggedIn(request)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
final JSONRenderer renderer = new JSONRenderer(); return;
}
context.setRenderer(renderer);
final JSONRenderer renderer = new JSONRenderer();
final JSONObject jsonObject = new JSONObject();
context.setRenderer(renderer);
renderer.setJSONObject(jsonObject);
final JSONObject jsonObject = new JSONObject();
try {
final String userId = request.getRequestURI().substring((Latkes.getContextPath() + "/console/user/").length()); renderer.setJSONObject(jsonObject);
userMgmtService.removeUser(userId); try {
final String userId = request.getRequestURI().substring((Latkes.getContextPath() + "/console/user/").length());
jsonObject.put(Keys.STATUS_CODE, true);
jsonObject.put(Keys.MSG, langPropsService.get("removeSuccLabel")); userMgmtService.removeUser(userId);
} catch (final ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e); jsonObject.put(Keys.STATUS_CODE, true);
jsonObject.put(Keys.MSG, langPropsService.get("removeSuccLabel"));
jsonObject.put(Keys.STATUS_CODE, false); } catch (final ServiceException e) {
jsonObject.put(Keys.MSG, langPropsService.get("removeFailLabel")); LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
} jsonObject.put(Keys.STATUS_CODE, false);
jsonObject.put(Keys.MSG, langPropsService.get("removeFailLabel"));
/** }
* Gets users by the specified request json object. }
* <p>
* The request URI contains the pagination arguments. For example, the /**
* request URI is /console/users/1/10/20, means the current page is 1, the * Gets users by the specified request json object.
* page size is 10, and the window size is 20. * <p>
* </p> * The request URI contains the pagination arguments. For example, the
* * request URI is /console/users/1/10/20, means the current page is 1, the
* <p> * page size is 10, and the window size is 20.
* Renders the response with a json object, for example, * </p>
* <pre> *
* { * <p>
* "pagination": { * Renders the response with a json object, for example,
* "paginationPageCount": 100, * <pre>
* "paginationPageNums": [1, 2, 3, 4, 5] * {
* }, * "pagination": {
* "users": [{ * "paginationPageCount": 100,
* "oId": "", * "paginationPageNums": [1, 2, 3, 4, 5]
* "userName": "", * },
* "userEmail": "", * "users": [{
* "userPassword": "", * "oId": "",
* "roleName": "" * "userName": "",
* }, ....] * "userEmail": "",
* "sc": "GET_USERS_SUCC" * "userPassword": "",
* } * "roleName": ""
* </pre> * }, ....]
* </p> * "sc": "GET_USERS_SUCC"
* * }
* @param request the specified http servlet request * </pre>
* @param response the specified http servlet response * </p>
* @param context the specified http request context *
* @throws Exception exception * @param request the specified http servlet request
*/ * @param response the specified http servlet response
@RequestProcessing(value = "/console/users/*/*/*"/* Requests.PAGINATION_PATH_PATTERN */, method = HTTPRequestMethod.GET) * @param context the specified http request context
public void getUsers(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context) * @throws Exception exception
throws Exception { */
final JSONRenderer renderer = new JSONRenderer(); @RequestProcessing(value = "/console/users/*/*/*"/* Requests.PAGINATION_PATH_PATTERN */, method = HTTPRequestMethod.GET)
public void getUsers(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context)
context.setRenderer(renderer); throws Exception {
final JSONRenderer renderer = new JSONRenderer();
if (!userUtils.isAdminLoggedIn(request)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN); context.setRenderer(renderer);
return;
} if (!userUtils.isAdminLoggedIn(request)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
try { return;
final String requestURI = request.getRequestURI(); }
final String path = requestURI.substring((Latkes.getContextPath() + "/console/users/").length());
try {
final JSONObject requestJSONObject = Requests.buildPaginationRequest(path); final String requestURI = request.getRequestURI();
final String path = requestURI.substring((Latkes.getContextPath() + "/console/users/").length());
final JSONObject result = userQueryService.getUsers(requestJSONObject);
final JSONObject requestJSONObject = Requests.buildPaginationRequest(path);
result.put(Keys.STATUS_CODE, true);
final JSONObject result = userQueryService.getUsers(requestJSONObject);
renderer.setJSONObject(result);
} catch (final ServiceException e) { result.put(Keys.STATUS_CODE, true);
LOGGER.log(Level.SEVERE, e.getMessage(), e);
renderer.setJSONObject(result);
final JSONObject jsonObject = QueryResults.defaultResult(); } catch (final ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.MSG, langPropsService.get("getFailLabel")); final JSONObject jsonObject = QueryResults.defaultResult();
}
} renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.MSG, langPropsService.get("getFailLabel"));
/** }
* Gets a user by the specified request. }
*
* <p> /**
* Renders the response with a json object, for example, * Gets a user by the specified request.
* <pre> *
* { * <p>
* "sc": boolean, * Renders the response with a json object, for example,
* "user": { * <pre>
* "oId": "", * {
* "userName": "", * "sc": boolean,
* "userEmail": "", * "user": {
* "userPassword": "" * "oId": "",
* } * "userName": "",
* } * "userEmail": "",
* </pre> * "userPassword": ""
* </p> * }
* * }
* @param request the specified http servlet request * </pre>
* @param response the specified http servlet response * </p>
* @param context the specified http request context *
* @throws Exception exception * @param request the specified http servlet request
*/ * @param response the specified http servlet response
@RequestProcessing(value = "/console/user/*", method = HTTPRequestMethod.GET) * @param context the specified http request context
public void getUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context) * @throws Exception exception
throws Exception { */
if (!userUtils.isAdminLoggedIn(request)) { @RequestProcessing(value = "/console/user/*", method = HTTPRequestMethod.GET)
response.sendError(HttpServletResponse.SC_FORBIDDEN); public void getUser(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context)
return; throws Exception {
} if (!userUtils.isAdminLoggedIn(request)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
final JSONRenderer renderer = new JSONRenderer(); return;
}
context.setRenderer(renderer);
final JSONRenderer renderer = new JSONRenderer();
try {
final String requestURI = request.getRequestURI(); context.setRenderer(renderer);
final String userId = requestURI.substring((Latkes.getContextPath() + "/console/user/").length());
try {
final JSONObject result = userQueryService.getUser(userId); final String requestURI = request.getRequestURI();
final String userId = requestURI.substring((Latkes.getContextPath() + "/console/user/").length());
if (null == result) {
renderer.setJSONObject(QueryResults.defaultResult()); final JSONObject result = userQueryService.getUser(userId);
return; if (null == result) {
} renderer.setJSONObject(QueryResults.defaultResult());
renderer.setJSONObject(result); return;
result.put(Keys.STATUS_CODE, true); }
} catch (final ServiceException e) { renderer.setJSONObject(result);
LOGGER.log(Level.SEVERE, e.getMessage(), e); result.put(Keys.STATUS_CODE, true);
final JSONObject jsonObject = QueryResults.defaultResult(); } catch (final ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.MSG, langPropsService.get("getFailLabel")); final JSONObject jsonObject = QueryResults.defaultResult();
}
} renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.MSG, langPropsService.get("getFailLabel"));
/** }
* Change a user role. }
*
* <p> /**
* Renders the response with a json object, for example, * Change a user role.
* <pre> *
* { * <p>
* "sc": boolean, * Renders the response with a json object, for example,
* "msg": "" * <pre>
* } * {
* </pre> * "sc": boolean,
* </p> * "msg": ""
* * }
* @param request the specified http servlet request * </pre>
* @param response the specified http servlet response * </p>
* @param context the specified http request context *
* @throws Exception exception * @param request the specified http servlet request
*/ * @param response the specified http servlet response
@RequestProcessing(value = "/console/changeRole/*", method = HTTPRequestMethod.GET) * @param context the specified http request context
public void changeUserRole(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context) * @throws Exception exception
throws Exception { */
if (!userUtils.isAdminLoggedIn(request)) { @RequestProcessing(value = "/console/changeRole/*", method = HTTPRequestMethod.GET)
response.sendError(HttpServletResponse.SC_FORBIDDEN); public void changeUserRole(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context)
return; throws Exception {
} if (!userUtils.isAdminLoggedIn(request)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
final JSONRenderer renderer = new JSONRenderer(); return;
}
context.setRenderer(renderer);
final JSONRenderer renderer = new JSONRenderer();
final JSONObject jsonObject = new JSONObject();
context.setRenderer(renderer);
renderer.setJSONObject(jsonObject);
final JSONObject jsonObject = new JSONObject();
try {
final String userId = request.getRequestURI().substring((Latkes.getContextPath() + "/console/changeRole/").length()); renderer.setJSONObject(jsonObject);
userMgmtService.changeRole(userId); try {
final String userId = request.getRequestURI().substring((Latkes.getContextPath() + "/console/changeRole/").length());
jsonObject.put(Keys.STATUS_CODE, true);
jsonObject.put(Keys.MSG, langPropsService.get("updateSuccLabel")); userMgmtService.changeRole(userId);
} catch (final ServiceException e) { jsonObject.put(Keys.STATUS_CODE, true);
LOGGER.log(Level.SEVERE, e.getMessage(), e); jsonObject.put(Keys.MSG, langPropsService.get("updateSuccLabel"));
jsonObject.put(Keys.STATUS_CODE, false); } catch (final ServiceException e) {
jsonObject.put(Keys.MSG, langPropsService.get("removeFailLabel")); LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
} jsonObject.put(Keys.STATUS_CODE, false);
} jsonObject.put(Keys.MSG, langPropsService.get("removeFailLabel"));
}
}
}
...@@ -437,6 +437,7 @@ public final class InitService { ...@@ -437,6 +437,7 @@ public final class InitService {
admin.put(User.USER_NAME, requestJSONObject.getString(User.USER_NAME)); admin.put(User.USER_NAME, requestJSONObject.getString(User.USER_NAME));
admin.put(User.USER_EMAIL, requestJSONObject.getString(User.USER_EMAIL)); admin.put(User.USER_EMAIL, requestJSONObject.getString(User.USER_EMAIL));
admin.put(User.USER_URL, Latkes.getServePath());
admin.put(User.USER_ROLE, Role.ADMIN_ROLE); admin.put(User.USER_ROLE, Role.ADMIN_ROLE);
admin.put(User.USER_PASSWORD, MD5.hash(requestJSONObject.getString(User.USER_PASSWORD))); admin.put(User.USER_PASSWORD, MD5.hash(requestJSONObject.getString(User.USER_PASSWORD)));
admin.put(UserExt.USER_ARTICLE_COUNT, 0); admin.put(UserExt.USER_ARTICLE_COUNT, 0);
......
...@@ -19,6 +19,7 @@ package org.b3log.solo.service; ...@@ -19,6 +19,7 @@ package org.b3log.solo.service;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.model.Role; import org.b3log.latke.model.Role;
import org.b3log.latke.model.User; import org.b3log.latke.model.User;
import org.b3log.latke.repository.RepositoryException; import org.b3log.latke.repository.RepositoryException;
...@@ -26,6 +27,7 @@ import org.b3log.latke.repository.Transaction; ...@@ -26,6 +27,7 @@ import org.b3log.latke.repository.Transaction;
import org.b3log.latke.service.LangPropsService; import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException; import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.MD5; import org.b3log.latke.util.MD5;
import org.b3log.latke.util.Strings;
import org.b3log.solo.model.UserExt; import org.b3log.solo.model.UserExt;
import org.b3log.solo.repository.UserRepository; import org.b3log.solo.repository.UserRepository;
import org.b3log.solo.repository.impl.UserRepositoryImpl; import org.b3log.solo.repository.impl.UserRepositoryImpl;
...@@ -67,7 +69,8 @@ public final class UserMgmtService { ...@@ -67,7 +69,8 @@ public final class UserMgmtService {
* "userName": "", * "userName": "",
* "userEmail": "", * "userEmail": "",
* "userPassword": "", // Unhashed * "userPassword": "", // Unhashed
* "userRole": "" * "userRole": "", // optional
* "userURL": "", // optional
* } * }
* </pre> * </pre>
* @throws ServiceException service exception * @throws ServiceException service exception
...@@ -99,8 +102,19 @@ public final class UserMgmtService { ...@@ -99,8 +102,19 @@ public final class UserMgmtService {
oldUser.put(User.USER_EMAIL, userNewEmail); oldUser.put(User.USER_EMAIL, userNewEmail);
oldUser.put(User.USER_NAME, userName); oldUser.put(User.USER_NAME, userName);
oldUser.put(User.USER_PASSWORD, MD5.hash(userPassword)); oldUser.put(User.USER_PASSWORD, MD5.hash(userPassword));
// Unchanges the default role
final String userRole = requestJSONObject.optString(User.USER_ROLE);
if (!Strings.isEmptyOrNull(userRole)) {
oldUser.put(User.USER_ROLE, userRole);
}
final String userURL = requestJSONObject.optString(User.USER_URL);
if (!Strings.isEmptyOrNull(userURL)) {
oldUser.put(User.USER_URL, userURL);
}
userRepository.update(oldUserId, oldUser); userRepository.update(oldUserId, oldUser);
transaction.commit(); transaction.commit();
} catch (final RepositoryException e) { } catch (final RepositoryException e) {
...@@ -159,8 +173,8 @@ public final class UserMgmtService { ...@@ -159,8 +173,8 @@ public final class UserMgmtService {
* "userName": "", * "userName": "",
* "userEmail": "", * "userEmail": "",
* "userPassword": "", // Unhashed * "userPassword": "", // Unhashed
* "userRole": "" // optional, uses {@value Role#DEFAULT_ROLE} instead, * "userURL": "", // optional, uses 'servePath' instead if not specified
* if not speciffied * "userRole": "" // optional, uses {@value Role#DEFAULT_ROLE} instead, if not speciffied
* } * }
* </pre>,see {@link User} for more details * </pre>,see {@link User} for more details
* @return generated user id * @return generated user id
...@@ -182,16 +196,32 @@ public final class UserMgmtService { ...@@ -182,16 +196,32 @@ public final class UserMgmtService {
throw new ServiceException(langPropsService.get("duplicatedEmailLabel")); throw new ServiceException(langPropsService.get("duplicatedEmailLabel"));
} }
user.put(User.USER_EMAIL, userEmail);
final String userName = requestJSONObject.optString(User.USER_NAME); final String userName = requestJSONObject.optString(User.USER_NAME);
user.put(User.USER_EMAIL, userEmail);
user.put(User.USER_NAME, userName); user.put(User.USER_NAME, userName);
final String userPassword = requestJSONObject.optString(User.USER_PASSWORD); final String userPassword = requestJSONObject.optString(User.USER_PASSWORD);
user.put(User.USER_PASSWORD, MD5.hash(userPassword)); user.put(User.USER_PASSWORD, MD5.hash(userPassword));
String userURL = requestJSONObject.optString(User.USER_URL);
if (Strings.isEmptyOrNull(userURL)) {
userURL = Latkes.getServePath();
}
if (!Strings.isURL(userURL)) {
throw new ServiceException(langPropsService.get("urlInvalidLabel"));
}
user.put(User.USER_URL, userURL);
final String roleName = requestJSONObject.optString(User.USER_ROLE, Role.DEFAULT_ROLE); final String roleName = requestJSONObject.optString(User.USER_ROLE, Role.DEFAULT_ROLE);
user.put(User.USER_ROLE, roleName); user.put(User.USER_ROLE, roleName);
user.put(UserExt.USER_ARTICLE_COUNT, 0); user.put(UserExt.USER_ARTICLE_COUNT, 0);
user.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0); user.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0);
......
/* /*
* Copyright (c) 2009, 2010, 2011, 2012, 2013, B3log Team * Copyright (c) 2009, 2010, 2011, 2012, 2013, B3log Team
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.b3log.solo.util; package org.b3log.solo.util;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.util.logging.Level;
import java.util.logging.Level; import java.util.logging.Logger;
import java.util.logging.Logger; import org.b3log.latke.Keys;
import org.b3log.latke.Keys; import org.b3log.latke.mail.MailService;
import org.b3log.latke.mail.MailService; import org.b3log.latke.mail.MailService.Message;
import org.b3log.latke.mail.MailService.Message; import org.b3log.latke.mail.MailServiceFactory;
import org.b3log.latke.mail.MailServiceFactory; import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.LangPropsService; import org.b3log.latke.util.Strings;
import org.b3log.latke.util.Strings; import org.b3log.solo.SoloServletListener;
import org.b3log.solo.SoloServletListener; import org.b3log.solo.model.*;
import org.b3log.solo.model.*; import org.b3log.solo.repository.ArticleRepository;
import org.b3log.solo.repository.ArticleRepository; import org.b3log.solo.repository.PageRepository;
import org.b3log.solo.repository.PageRepository; import org.b3log.solo.repository.impl.ArticleRepositoryImpl;
import org.b3log.solo.repository.impl.ArticleRepositoryImpl; import org.b3log.solo.repository.impl.PageRepositoryImpl;
import org.b3log.solo.repository.impl.PageRepositoryImpl; import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.PreferenceQueryService; import org.json.JSONException;
import org.json.JSONException; import org.json.JSONObject;
import org.json.JSONObject;
/**
/** * Comment utilities.
* Comment utilities. *
* * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @version 1.0.0.10, Apr 2, 2013
* @version 1.0.0.9, Mar 28, 2012 * @since 0.3.1
* @since 0.3.1 */
*/ public final class Comments {
public final class Comments {
/**
/** * Logger.
* Logger. */
*/ private static final Logger LOGGER = Logger.getLogger(Comments.class.getName());
private static final Logger LOGGER = Logger.getLogger(Comments.class.getName());
/**
/** * Language service.
* Language service. */
*/ private static LangPropsService langPropsService = LangPropsService.getInstance();
private static LangPropsService langPropsService = LangPropsService.getInstance();
/**
/** * Preference query service.
* Preference query service. */
*/ private static PreferenceQueryService preferenceQueryService = PreferenceQueryService.getInstance();
private static PreferenceQueryService preferenceQueryService = PreferenceQueryService.getInstance();
/**
/** * Article repository.
* Article repository. */
*/ private static ArticleRepository articleRepository = ArticleRepositoryImpl.getInstance();
private static ArticleRepository articleRepository = ArticleRepositoryImpl.getInstance();
/**
/** * Page repository.
* Page repository. */
*/ private static PageRepository pageRepository = PageRepositoryImpl.getInstance();
private static PageRepository pageRepository = PageRepositoryImpl.getInstance();
/**
/** * Mail service.
* Mail service. */
*/ private static final MailService MAIL_SVC = MailServiceFactory.getMailService();
private static final MailService MAIL_SVC = MailServiceFactory.getMailService();
/**
/** * Minimum length of comment name.
* Minimum length of comment name. */
*/ private static final int MIN_COMMENT_NAME_LENGTH = 2;
private static final int MIN_COMMENT_NAME_LENGTH = 2;
/**
/** * Maximum length of comment name.
* Maximum length of comment name. */
*/ private static final int MAX_COMMENT_NAME_LENGTH = 20;
private static final int MAX_COMMENT_NAME_LENGTH = 20;
/**
/** * Minimum length of comment content.
* Minimum length of comment content. */
*/ private static final int MIN_COMMENT_CONTENT_LENGTH = 2;
private static final int MIN_COMMENT_CONTENT_LENGTH = 2;
/**
/** * Maximum length of comment content.
* Maximum length of comment content. */
*/ private static final int MAX_COMMENT_CONTENT_LENGTH = 500;
private static final int MAX_COMMENT_CONTENT_LENGTH = 500;
/**
/** * Comment mail HTML body.
* Comment mail HTML body. */
*/ public static final String COMMENT_MAIL_HTML_BODY = "<p>{articleOrPage} [<a href=\"" + "{articleOrPageURL}\">" + "{title}</a>]"
public static final String COMMENT_MAIL_HTML_BODY = "<p>{articleOrPage} [<a href=\"" + "{articleOrPageURL}\">" + "{title}</a>]" + " received a new comment:</p>" + "{commenter}: <span><a href=\"http://{commentSharpURL}\">" + "{commentContent}</a></span>";
+ " received a new comment:</p>" + "{commenter}: <span><a href=\"http://{commentSharpURL}\">" + "{commentContent}</a></span>";
/**
/** * Gets comment sharp URL with the specified page and comment id.
* Gets comment sharp URL with the specified page and comment id. *
* * @param page the specified page
* @param page the specified page * @param commentId the specified comment id
* @param commentId the specified comment id * @return comment sharp URL
* @return comment sharp URL * @throws JSONException json exception
* @throws JSONException json exception */
*/ public static String getCommentSharpURLForPage(final JSONObject page, final String commentId) throws JSONException {
public static String getCommentSharpURLForPage(final JSONObject page, final String commentId) throws JSONException { return page.getString(Page.PAGE_PERMALINK) + "#" + commentId;
return page.getString(Page.PAGE_PERMALINK) + "#" + commentId; }
}
/**
/** * Gets comment sharp URL with the specified article and comment id.
* Gets comment sharp URL with the specified article and comment id. *
* * @param article the specified article
* @param article the specified article * @param commentId the specified comment id
* @param commentId the specified comment id * @return comment sharp URL
* @return comment sharp URL * @throws JSONException json exception
* @throws JSONException json exception */
*/ public static String getCommentSharpURLForArticle(final JSONObject article, final String commentId) throws JSONException {
public static String getCommentSharpURLForArticle(final JSONObject article, final String commentId) throws JSONException { final String articleLink = article.getString(Article.ARTICLE_PERMALINK);
final String articleLink = article.getString(Article.ARTICLE_PERMALINK);
return articleLink + "#" + commentId;
return articleLink + "#" + commentId; }
}
/**
/** * Checks the specified comment adding request.
* Checks the specified comment adding request. *
* * @param requestJSONObject the specified comment adding request, for example,
* @param requestJSONObject the specified comment adding request, for example, * <pre>
* <pre> * {
* { * "type": "", // "article"/"page"
* "type": "", // "article"/"page" * "oId": "",
* "oId": "", * "commentName": "",
* "commentName": "", * "commentEmail": "",
* "commentEmail": "", * "commentURL": "",
* "commentURL": "", * "commentContent": "",
* "commentContent": "", * }
* } * </pre>
* </pre> * @return check result, for example,
* @return check result, for example, * <pre>
* <pre> * {
* { * "sc": boolean,
* "sc": boolean, * "msg": "" // Exists if "sc" equals to false
* "msg": "" // Exists if "sc" equals to false * }
* } * </pre>
* </pre> */
*/ public static JSONObject checkAddCommentRequest(final JSONObject requestJSONObject) {
public static JSONObject checkAddCommentRequest(final JSONObject requestJSONObject) { final JSONObject ret = new JSONObject();
final JSONObject ret = new JSONObject();
try {
try { ret.put(Keys.STATUS_CODE, false);
ret.put(Keys.STATUS_CODE, false); final JSONObject preference = preferenceQueryService.getPreference();
final JSONObject preference = preferenceQueryService.getPreference();
if (null == preference || !preference.optBoolean(Preference.COMMENTABLE)) {
if (null == preference || !preference.optBoolean(Preference.COMMENTABLE)) { ret.put(Keys.MSG, langPropsService.get("notAllowCommentLabel"));
ret.put(Keys.MSG, langPropsService.get("notAllowCommentLabel"));
return ret;
return ret; }
}
final String id = requestJSONObject.optString(Keys.OBJECT_ID);
final String id = requestJSONObject.optString(Keys.OBJECT_ID); final String type = requestJSONObject.optString(Common.TYPE);
final String type = requestJSONObject.optString(Common.TYPE);
if (Article.ARTICLE.equals(type)) {
if (Article.ARTICLE.equals(type)) { final JSONObject article = articleRepository.get(id);
final JSONObject article = articleRepository.get(id);
if (null == article || !article.optBoolean(Article.ARTICLE_COMMENTABLE)) {
if (null == article || !article.optBoolean(Article.ARTICLE_COMMENTABLE)) { ret.put(Keys.MSG, langPropsService.get("notAllowCommentLabel"));
ret.put(Keys.MSG, langPropsService.get("notAllowCommentLabel"));
return ret;
return ret; }
} } else {
} else { final JSONObject page = pageRepository.get(id);
final JSONObject page = pageRepository.get(id);
if (null == page || !page.optBoolean(Page.PAGE_COMMENTABLE)) {
if (null == page || !page.optBoolean(Page.PAGE_COMMENTABLE)) { ret.put(Keys.MSG, langPropsService.get("notAllowCommentLabel"));
ret.put(Keys.MSG, langPropsService.get("notAllowCommentLabel"));
return ret;
return ret; }
} }
}
final String commentName = requestJSONObject.getString(Comment.COMMENT_NAME);
final String commentName = requestJSONObject.getString(Comment.COMMENT_NAME);
if (MAX_COMMENT_NAME_LENGTH < commentName.length() || MIN_COMMENT_NAME_LENGTH > commentName.length()) {
if (MAX_COMMENT_NAME_LENGTH < commentName.length() || MIN_COMMENT_NAME_LENGTH > commentName.length()) { LOGGER.log(Level.WARNING, "Comment name is too long[{0}]", commentName);
LOGGER.log(Level.WARNING, "Comment name is too long[{0}]", commentName); ret.put(Keys.MSG, langPropsService.get("nameTooLongLabel"));
ret.put(Keys.MSG, langPropsService.get("nameTooLongLabel"));
return ret;
return ret; }
}
final String commentEmail = requestJSONObject.getString(Comment.COMMENT_EMAIL).trim().toLowerCase();
final String commentEmail = requestJSONObject.getString(Comment.COMMENT_EMAIL).trim().toLowerCase();
if (!Strings.isEmail(commentEmail)) {
if (!Strings.isEmail(commentEmail)) { LOGGER.log(Level.WARNING, "Comment email is invalid[{0}]", commentEmail);
LOGGER.log(Level.WARNING, "Comment email is invalid[{0}]", commentEmail); ret.put(Keys.MSG, langPropsService.get("mailInvalidLabel"));
ret.put(Keys.MSG, langPropsService.get("mailInvalidLabel"));
return ret;
return ret; }
}
final String commentURL = requestJSONObject.optString(Comment.COMMENT_URL);
final String commentURL = requestJSONObject.optString(Comment.COMMENT_URL);
if (!Strings.isURL(commentURL)) {
try { LOGGER.log(Level.WARNING, "Comment URL is invalid[{0}]", commentURL);
new URL(commentURL); ret.put(Keys.MSG, langPropsService.get("urlInvalidLabel"));
if (commentURL.contains("<") || commentURL.contains(">")) { return ret;
throw new IllegalArgumentException(); }
}
} catch (final Exception e) { final String commentContent = requestJSONObject.optString(Comment.COMMENT_CONTENT).replaceAll("\\n",
LOGGER.log(Level.WARNING, "Comment URL is invalid[{0}]", commentURL); SoloServletListener.ENTER_ESC);
ret.put(Keys.MSG, langPropsService.get("urlInvalidLabel"));
if (MAX_COMMENT_CONTENT_LENGTH < commentContent.length() || MIN_COMMENT_CONTENT_LENGTH > commentContent.length()) {
return ret; LOGGER.log(Level.WARNING, "Comment conent length is invalid[{0}]", commentContent.length());
} ret.put(Keys.MSG, langPropsService.get("commentContentCannotEmptyLabel"));
final String commentContent = requestJSONObject.optString(Comment.COMMENT_CONTENT).replaceAll("\\n", return ret;
SoloServletListener.ENTER_ESC); }
if (MAX_COMMENT_CONTENT_LENGTH < commentContent.length() || MIN_COMMENT_CONTENT_LENGTH > commentContent.length()) { ret.put(Keys.STATUS_CODE, true);
LOGGER.log(Level.WARNING, "Comment conent length is invalid[{0}]", commentContent.length());
ret.put(Keys.MSG, langPropsService.get("commentContentCannotEmptyLabel")); return ret;
} catch (final Exception e) {
return ret; LOGGER.log(Level.WARNING, "Checks add comment request[" + requestJSONObject.toString() + "] failed", e);
}
ret.put(Keys.STATUS_CODE, false);
ret.put(Keys.STATUS_CODE, true); ret.put(Keys.MSG, langPropsService.get("addFailLabel"));
return ret; return ret;
} catch (final Exception e) { }
LOGGER.log(Level.WARNING, "Checks add comment request[" + requestJSONObject.toString() + "] failed", e); }
ret.put(Keys.STATUS_CODE, false); /**
ret.put(Keys.MSG, langPropsService.get("addFailLabel")); * Sends a notification mail to administrator for notifying the specified
* article or page received the specified comment and original comment.
return ret; *
} * @param articleOrPage the specified article or page
} * @param comment the specified comment
* @param originalComment original comment, if not exists, set it as
/** * {@code null}
* Sends a notification mail to administrator for notifying the specified * @param preference the specified preference
* article or page received the specified comment and original comment. * @throws IOException io exception
* * @throws JSONException json exception
* @param articleOrPage the specified article or page */
* @param comment the specified comment public static void sendNotificationMail(final JSONObject articleOrPage,
* @param originalComment original comment, if not exists, set it as final JSONObject comment,
* {@code null} final JSONObject originalComment,
* @param preference the specified preference final JSONObject preference)
* @throws IOException io exception throws IOException, JSONException {
* @throws JSONException json exception final String commentEmail = comment.getString(Comment.COMMENT_EMAIL);
*/ final String commentId = comment.getString(Keys.OBJECT_ID);
public static void sendNotificationMail(final JSONObject articleOrPage, final String commentContent = comment.getString(Comment.COMMENT_CONTENT).replaceAll(SoloServletListener.ENTER_ESC, "<br/>");
final JSONObject comment,
final JSONObject originalComment, final String adminEmail = preference.getString(Preference.ADMIN_EMAIL);
final JSONObject preference)
throws IOException, JSONException { if (adminEmail.equalsIgnoreCase(commentEmail)) {
final String commentEmail = comment.getString(Comment.COMMENT_EMAIL); LOGGER.log(Level.FINER, "Do not send comment notification mail to admin itself[{0}]", adminEmail);
final String commentId = comment.getString(Keys.OBJECT_ID); return;
final String commentContent = comment.getString(Comment.COMMENT_CONTENT).replaceAll(SoloServletListener.ENTER_ESC, "<br/>"); }
final String adminEmail = preference.getString(Preference.ADMIN_EMAIL); if (null != originalComment && comment.has(Comment.COMMENT_ORIGINAL_COMMENT_ID)) {
final String originalEmail = originalComment.getString(Comment.COMMENT_EMAIL);
if (adminEmail.equalsIgnoreCase(commentEmail)) {
LOGGER.log(Level.FINER, "Do not send comment notification mail to admin itself[{0}]", adminEmail); if (originalEmail.equalsIgnoreCase(adminEmail)) {
return; LOGGER.log(Level.FINER, "Do not send comment notification mail to admin while the specified comment[{0}] is an reply",
} commentId);
return;
if (null != originalComment && comment.has(Comment.COMMENT_ORIGINAL_COMMENT_ID)) { }
final String originalEmail = originalComment.getString(Comment.COMMENT_EMAIL); }
if (originalEmail.equalsIgnoreCase(adminEmail)) { final String blogTitle = preference.getString(Preference.BLOG_TITLE);
LOGGER.log(Level.FINER, "Do not send comment notification mail to admin while the specified comment[{0}] is an reply", final String blogHost = preference.getString(Preference.BLOG_HOST);
commentId); boolean isArticle = true;
return; String title = articleOrPage.optString(Article.ARTICLE_TITLE);
}
} if (Strings.isEmptyOrNull(title)) {
title = articleOrPage.getString(Page.PAGE_TITLE);
final String blogTitle = preference.getString(Preference.BLOG_TITLE); isArticle = false;
final String blogHost = preference.getString(Preference.BLOG_HOST); }
boolean isArticle = true;
String title = articleOrPage.optString(Article.ARTICLE_TITLE); final String commentSharpURL = comment.getString(Comment.COMMENT_SHARP_URL);
final Message message = new Message();
if (Strings.isEmptyOrNull(title)) {
title = articleOrPage.getString(Page.PAGE_TITLE); message.setFrom(adminEmail);
isArticle = false; message.addRecipient(adminEmail);
} String mailSubject = null;
String articleOrPageURL = null;
final String commentSharpURL = comment.getString(Comment.COMMENT_SHARP_URL); String mailBody = null;
final Message message = new Message();
if (isArticle) {
message.setFrom(adminEmail); mailSubject = blogTitle + ": New comment on article [" + title + "]";
message.addRecipient(adminEmail); articleOrPageURL = "http://" + blogHost + articleOrPage.getString(Article.ARTICLE_PERMALINK);
String mailSubject = null; mailBody = COMMENT_MAIL_HTML_BODY.replace("{articleOrPage}", "Article");
String articleOrPageURL = null; } else {
String mailBody = null; mailSubject = blogTitle + ": New comment on page [" + title + "]";
articleOrPageURL = "http://" + blogHost + articleOrPage.getString(Page.PAGE_PERMALINK);
if (isArticle) { mailBody = COMMENT_MAIL_HTML_BODY.replace("{articleOrPage}", "Page");
mailSubject = blogTitle + ": New comment on article [" + title + "]"; }
articleOrPageURL = "http://" + blogHost + articleOrPage.getString(Article.ARTICLE_PERMALINK);
mailBody = COMMENT_MAIL_HTML_BODY.replace("{articleOrPage}", "Article"); message.setSubject(mailSubject);
} else { final String commentName = comment.getString(Comment.COMMENT_NAME);
mailSubject = blogTitle + ": New comment on page [" + title + "]"; final String commentURL = comment.getString(Comment.COMMENT_URL);
articleOrPageURL = "http://" + blogHost + articleOrPage.getString(Page.PAGE_PERMALINK); String commenter = null;
mailBody = COMMENT_MAIL_HTML_BODY.replace("{articleOrPage}", "Page");
} if (!"http://".equals(commentURL)) {
commenter = "<a target=\"_blank\" " + "href=\"" + commentURL + "\">" + commentName + "</a>";
message.setSubject(mailSubject); } else {
final String commentName = comment.getString(Comment.COMMENT_NAME); commenter = commentName;
final String commentURL = comment.getString(Comment.COMMENT_URL); }
String commenter = null;
mailBody = mailBody.replace("{articleOrPageURL}", articleOrPageURL).replace("{title}", title).replace("{commentContent}", commentContent).replace("{commentSharpURL}", blogHost + commentSharpURL).replace(
if (!"http://".equals(commentURL)) { "{commenter}", commenter);
commenter = "<a target=\"_blank\" " + "href=\"" + commentURL + "\">" + commentName + "</a>"; message.setHtmlBody(mailBody);
} else {
commenter = commentName; LOGGER.log(Level.FINER, "Sending a mail[mailSubject={0}, mailBody=[{1}] to admin[email={2}]",
} new Object[] {mailSubject, mailBody, adminEmail});
MAIL_SVC.send(message);
mailBody = mailBody.replace("{articleOrPageURL}", articleOrPageURL).replace("{title}", title).replace("{commentContent}", commentContent).replace("{commentSharpURL}", blogHost + commentSharpURL).replace( }
"{commenter}", commenter);
message.setHtmlBody(mailBody); /**
* Gets the {@link Comments} singleton.
LOGGER.log(Level.FINER, "Sending a mail[mailSubject={0}, mailBody=[{1}] to admin[email={2}]", *
new Object[] {mailSubject, mailBody, adminEmail}); * @return the singleton
MAIL_SVC.send(message); */
} public static Comments getInstance() {
return SingletonHolder.SINGLETON;
/** }
* Gets the {@link Comments} singleton.
* /**
* @return the singleton * Private default constructor.
*/ */
public static Comments getInstance() { private Comments() {}
return SingletonHolder.SINGLETON;
} /**
* Singleton holder.
/** *
* Private default constructor. * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
*/ * @version 1.0.0.0, Jan 12, 2011
private Comments() {} */
private static final class SingletonHolder {
/**
* Singleton holder. /**
* * Singleton.
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> */
* @version 1.0.0.0, Jan 12, 2011 private static final Comments SINGLETON = new Comments();
*/
private static final class SingletonHolder { /**
* Private default constructor.
/** */
* Singleton. private SingletonHolder() {}
*/ }
private static final Comments SINGLETON = new Comments(); }
/**
* Private default constructor.
*/
private SingletonHolder() {}
}
}
{ {
"description": "Description of repository structures, for generation (DDL: http://en.wikipedia.org/wiki/Data_Definition_Language) of the relational database table and persistence validation.", "description": "Description of repository structures, for generation (DDL: http://en.wikipedia.org/wiki/Data_Definition_Language) of the relational database table and persistence validation.",
"version": "1.0.0.9, Mar 5, 2013", "version": "1.0.1.0, Apr 2, 2013",
"authors": ["Liang Ding"], "authors": ["Liang Ding"],
"since": "0.4.0", "since": "0.4.0",
...@@ -538,6 +538,11 @@ ...@@ -538,6 +538,11 @@
"type": "String", "type": "String",
"length": 255 "length": 255
}, },
{
"name": "userURL",
"type": "String",
"length": 255
},
{ {
"name": "userPassword", "name": "userPassword",
"type": "String", "type": "String",
......
/* /*
* Copyright (c) 2009, 2010, 2011, 2012, 2013, B3log Team * Copyright (c) 2009, 2010, 2011, 2012, 2013, B3log Team
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.b3log.solo.repository.impl; package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.model.Role; import org.b3log.latke.model.Role;
import org.b3log.latke.model.User; import org.b3log.latke.model.User;
import org.b3log.latke.repository.FilterOperator; import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.PropertyFilter; import org.b3log.latke.repository.PropertyFilter;
import org.b3log.latke.repository.Query; import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.Transaction; import org.b3log.latke.repository.Transaction;
import org.b3log.solo.AbstractTestCase; import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.model.UserExt; import org.b3log.solo.model.UserExt;
import org.b3log.solo.repository.UserRepository; import org.b3log.solo.repository.UserRepository;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
/** /**
* {@link UserRepositoryImpl} test case. * {@link UserRepositoryImpl} test case.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.1, Feb 21, 2012 * @version 1.0.0.2, Apr 2, 2013
*/ */
@Test(suiteName = "repository") @Test(suiteName = "repository")
public final class UserRepositoryImplTestCase extends AbstractTestCase { public final class UserRepositoryImplTestCase extends AbstractTestCase {
/** /**
* Tests. * Tests.
* *
* @throws Exception exception * @throws Exception exception
*/ */
@Test @Test
public void test() throws Exception { public void test() throws Exception {
final UserRepository userRepository = getUserRepository(); final UserRepository userRepository = getUserRepository();
final JSONObject another = new JSONObject(); final JSONObject another = new JSONObject();
another.put(User.USER_NAME, "test1"); another.put(User.USER_NAME, "test1");
another.put(User.USER_EMAIL, "test1@gmail.com"); another.put(User.USER_EMAIL, "test1@gmail.com");
another.put(User.USER_PASSWORD, "pass1"); another.put(User.USER_PASSWORD, "pass1");
another.put(User.USER_ROLE, Role.DEFAULT_ROLE); another.put(User.USER_URL, "http://b3log.org");
another.put(UserExt.USER_ARTICLE_COUNT, 0); another.put(User.USER_ROLE, Role.DEFAULT_ROLE);
another.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0); another.put(UserExt.USER_ARTICLE_COUNT, 0);
another.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0);
Transaction transaction = userRepository.beginTransaction();
userRepository.add(another); Transaction transaction = userRepository.beginTransaction();
transaction.commit(); userRepository.add(another);
transaction.commit();
Assert.assertNull(userRepository.getAdmin());
Assert.assertNull(userRepository.getAdmin());
JSONObject admin = new JSONObject();
admin.put(User.USER_NAME, "test"); JSONObject admin = new JSONObject();
admin.put(User.USER_EMAIL, "test@gmail.com"); admin.put(User.USER_NAME, "test");
admin.put(User.USER_PASSWORD, "pass"); admin.put(User.USER_EMAIL, "test@gmail.com");
admin.put(User.USER_ROLE, Role.ADMIN_ROLE); admin.put(User.USER_PASSWORD, "pass");
admin.put(UserExt.USER_ARTICLE_COUNT, 0); admin.put(User.USER_URL, "http://b3log.org");
admin.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0); admin.put(User.USER_ROLE, Role.ADMIN_ROLE);
admin.put(UserExt.USER_ARTICLE_COUNT, 0);
transaction = userRepository.beginTransaction(); admin.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0);
userRepository.add(admin);
transaction.commit(); transaction = userRepository.beginTransaction();
userRepository.add(admin);
Assert.assertTrue(userRepository.isAdminEmail("test@gmail.com")); transaction.commit();
Assert.assertFalse(userRepository.isAdminEmail("notFound@gmail.com"));
Assert.assertTrue(userRepository.isAdminEmail("test@gmail.com"));
admin = userRepository.getAdmin(); Assert.assertFalse(userRepository.isAdminEmail("notFound@gmail.com"));
Assert.assertNotNull(admin); admin = userRepository.getAdmin();
Assert.assertEquals("test", admin.optString(User.USER_NAME));
Assert.assertNotNull(admin);
final JSONObject result = userRepository.get(new Query().setFilter( Assert.assertEquals("test", admin.optString(User.USER_NAME));
new PropertyFilter(User.USER_NAME, FilterOperator.EQUAL, "test1")));
final JSONObject result = userRepository.get(new Query().setFilter(
final JSONArray users = result.getJSONArray(Keys.RESULTS); new PropertyFilter(User.USER_NAME, FilterOperator.EQUAL, "test1")));
Assert.assertEquals(users.length(), 1);
Assert.assertEquals(users.getJSONObject(0).getString(User.USER_EMAIL), "test1@gmail.com"); final JSONArray users = result.getJSONArray(Keys.RESULTS);
Assert.assertEquals(users.length(), 1);
final JSONObject notFound = userRepository.getByEmail("not.found@gmail.com"); Assert.assertEquals(users.getJSONObject(0).getString(User.USER_EMAIL), "test1@gmail.com");
Assert.assertNull(notFound);
final JSONObject notFound = userRepository.getByEmail("not.found@gmail.com");
final JSONObject found = userRepository.getByEmail("test1@gmail.com"); Assert.assertNull(notFound);
Assert.assertNotNull(found);
Assert.assertEquals(found.getString(User.USER_PASSWORD), "pass1"); final JSONObject found = userRepository.getByEmail("test1@gmail.com");
} Assert.assertNotNull(found);
} Assert.assertEquals(found.getString(User.USER_PASSWORD), "pass1");
}
}
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
# #
# Description: B3log Solo language configurations(en_US). # Description: B3log Solo language configurations(en_US).
# Version: 2.1.0.6, Apr 1, 2013 # Version: 2.1.0.7, Apr 2, 2013
# Author: Liang Ding # Author: Liang Ding
# Author: Liyuan Li # Author: Liyuan Li
# Author: Dongxu Wang # Author: Dongxu Wang
...@@ -193,6 +193,8 @@ userName1Label=Username: ...@@ -193,6 +193,8 @@ userName1Label=Username:
userLabel=User userLabel=User
userPassword1Label=Password: userPassword1Label=Password:
userPasswordLabel=Password userPasswordLabel=Password
userURL1Label=Link:
userURLLabel=Link
categoryLabel=Category categoryLabel=Category
noticeBoard1Label=Notice Board: noticeBoard1Label=Notice Board:
noticeBoardLabel=Notice Board noticeBoardLabel=Notice Board
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
# #
# Description: B3log Solo default language configurations(zh_CN). # Description: B3log Solo default language configurations(zh_CN).
# Version: 2.1.1.3, Apr 1, 2013 # Version: 2.1.1.4, Apr 2, 2013
# Author: Liang Ding # Author: Liang Ding
# Author: Liyuan Li # Author: Liyuan Li
# Author: Dongxu Wang # Author: Dongxu Wang
...@@ -193,6 +193,8 @@ userName1Label=\u7528\u6237\u540d\uff1a ...@@ -193,6 +193,8 @@ userName1Label=\u7528\u6237\u540d\uff1a
userLabel=\u7528\u6237 userLabel=\u7528\u6237
userPassword1Label=\u5bc6\u7801\uff1a userPassword1Label=\u5bc6\u7801\uff1a
userPasswordLabel=\u5bc6\u7801 userPasswordLabel=\u5bc6\u7801
userURL1Label=\u94fe\u63a5\uff1a
userURLLabel=\u94fe\u63a5
categoryLabel=\u5206\u7c7b categoryLabel=\u5206\u7c7b
noticeBoard1Label=\u516c\u544a\uff1a noticeBoard1Label=\u516c\u544a\uff1a
noticeBoardLabel=\u516c\u544a noticeBoardLabel=\u516c\u544a
......
<div id="userTable"></div> <div id="userTable"></div>
<div id="userPagination" class="margin12 right"></div> <div id="userPagination" class="margin12 right"></div>
<div class="clear"></div> <div class="clear"></div>
<table class="form" width="100%" cellpadding="0px" cellspacing="9px"> <table class="form" width="100%" cellpadding="0px" cellspacing="9px">
<thead> <thead>
<tr> <tr>
<th style="text-align: left" colspan="2"> <th style="text-align: left" colspan="2">
${addUserLabel} ${addUserLabel}
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<th width="48px"> <th width="48px">
<label for="userName">${commentName1Label}</label> <label for="userName">${commentName1Label}</label>
</th> </th>
<td> <td>
<input id="userName" type="text"/> <input id="userName" type="text"/>
</td> </td>
</tr> </tr>
<tr> <tr>
<th> <th>
<label for="userEmail">${commentEmail1Label}</label> <label for="userEmail">${commentEmail1Label}</label>
</th> </th>
<td> <td>
<input id="userEmail" type="text"/> <input id="userEmail" type="text"/>
</td> </td>
</tr> </tr>
<tr> <tr>
<th> <th>
<label for="userPassword">${userPassword1Label}</label> <label for="userURL">${userURL1Label}</label>
</th> </th>
<td> <td>
<input id="userPassword" type="password"/> <input id="userURL" type="text"/>
</td> </td>
</tr> </tr>
<tr> <tr>
<td colspan="2" align="right"> <th>
<button onclick="admin.userList.add();">${saveLabel}</button> <label for="userPassword">${userPassword1Label}</label>
</td> </th>
</tr> <td>
</tbody> <input id="userPassword" type="password"/>
</table> </td>
<div id="userUpdate" class="none"> </tr>
<table class="form" width="100%" cellpadding="0px" cellspacing="9px"> <tr>
<thead> <td colspan="2" align="right">
<tr> <button onclick="admin.userList.add();">${saveLabel}</button>
<th style="text-align: left" colspan="2"> </td>
${updateUserLabel} </tr>
</th> </tbody>
</tr> </table>
</thead> <div id="userUpdate" class="none">
<tbody> <table class="form" width="100%" cellpadding="0px" cellspacing="9px">
<tr> <thead>
<th width="48px"> <tr>
<label for="userNameUpdate">${commentName1Label}</label> <th style="text-align: left" colspan="2">
</th> ${updateUserLabel}
<td> </th>
<input id="userNameUpdate" type="text"/> </tr>
</td> </thead>
</tr> <tbody>
<tr> <tr>
<th> <th width="48px">
<label for="userEmailUpdate">${commentEmail1Label}</label> <label for="userNameUpdate">${commentName1Label}</label>
</th> </th>
<td> <td>
<input id="userEmailUpdate" type="text"/> <input id="userNameUpdate" type="text"/>
</td> </td>
</tr> </tr>
<tr> <tr>
<th> <th>
<label for="userPasswordUpdate">${userPassword1Label}</label> <label for="userEmailUpdate">${commentEmail1Label}</label>
</th> </th>
<td> <td>
<input id="userPasswordUpdate" type="password"/> <input id="userEmailUpdate" type="text"/>
</td> </td>
</tr> </tr>
<tr> <tr>
<td colspan="2" align="right"> <th>
<button onclick="admin.userList.update();">${updateLabel}</button> <label for="userURLUpdate">${userURL1Label}</label>
</td> </th>
</tr> <td>
</tbody> <input id="userURLUpdate" type="text"/>
</table> </td>
</div> </tr>
${plugins} <tr>
<th>
<label for="userPasswordUpdate">${userPassword1Label}</label>
</th>
<td>
<input id="userPasswordUpdate" type="password"/>
</td>
</tr>
<tr>
<td colspan="2" align="right">
<button onclick="admin.userList.update();">${updateLabel}</button>
</td>
</tr>
</tbody>
</table>
</div>
${plugins}
...@@ -134,6 +134,7 @@ admin.userList = { ...@@ -134,6 +134,7 @@ admin.userList = {
var requestJSONObject = { var requestJSONObject = {
"userName": $("#userName").val(), "userName": $("#userName").val(),
"userEmail": $("#userEmail").val(), "userEmail": $("#userEmail").val(),
"userURL": $("#userURL").val(),
"userPassword": $("#userPassword").val() "userPassword": $("#userPassword").val()
}; };
...@@ -151,6 +152,7 @@ admin.userList = { ...@@ -151,6 +152,7 @@ admin.userList = {
$("#userName").val(""); $("#userName").val("");
$("#userEmail").val(""); $("#userEmail").val("");
$("#userURL").val("");
$("#userPassword").val(""); $("#userPassword").val("");
if (admin.userList.pageInfo.currentCount === Label.PAGE_SIZE && if (admin.userList.pageInfo.currentCount === Label.PAGE_SIZE &&
admin.userList.pageInfo.currentPage === admin.userList.pageInfo.pageCount) { admin.userList.pageInfo.currentPage === admin.userList.pageInfo.pageCount) {
...@@ -198,6 +200,8 @@ admin.userList = { ...@@ -198,6 +200,8 @@ admin.userList = {
} else { } else {
$userEmailUpdate.removeAttr("disabled"); $userEmailUpdate.removeAttr("disabled");
} }
$("#userURLUpdate").val(result.user.userURL);
$("#userPasswordUpdate").val(result.user.userPassword); $("#userPasswordUpdate").val(result.user.userPassword);
$("#loadMsg").text(""); $("#loadMsg").text("");
...@@ -217,6 +221,7 @@ admin.userList = { ...@@ -217,6 +221,7 @@ admin.userList = {
"userName": $("#userNameUpdate").val(), "userName": $("#userNameUpdate").val(),
"oId": userInfo.oId, "oId": userInfo.oId,
"userEmail": $("#userEmailUpdate").val(), "userEmail": $("#userEmailUpdate").val(),
"userURL": $("#userURLUpdate").val(),
"userRole": userInfo.userRole, "userRole": userInfo.userRole,
"userPassword": $("#userPasswordUpdate").val() "userPassword": $("#userPasswordUpdate").val()
}; };
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<title>${blogTitle}</title> <title>${blogTitle}</title>
<meta name="keywords" content="GAE 博客,blog,b3log,kill IE6" /> <meta name="keywords" content="GAE 博客,blog,b3log,kill IE6" />
<meta name="description" content="An open source blog based on GAE Java,GAE Java 开源博客,Let's kill IE6" /> <meta name="description" content="An open source blog based on GAE Java,GAE Java 开源博客,用户注册" />
<meta name="owner" content="B3log Team" /> <meta name="owner" content="B3log Team" />
<meta name="author" content="B3log Team" /> <meta name="author" content="B3log Team" />
<meta name="generator" content="B3log Solo" /> <meta name="generator" content="B3log Solo" />
...@@ -34,6 +34,10 @@ ...@@ -34,6 +34,10 @@
${userName1Label} ${userName1Label}
</label> </label>
<input id="userName" /> <input id="userName" />
<label for="userURL">
${userURL1Label}
</label>
<input id="userURL" />
<label for="userPassword"> <label for="userPassword">
${userPassword1Label} ${userPassword1Label}
</label> </label>
...@@ -63,59 +67,60 @@ ...@@ -63,59 +67,60 @@
</div> </div>
<script type="text/javascript" src="${staticServePath}/js/lib/jquery/jquery.min.js" charset="utf-8"></script> <script type="text/javascript" src="${staticServePath}/js/lib/jquery/jquery.min.js" charset="utf-8"></script>
<script type="text/javascript"> <script type="text/javascript">
var validate = function() { var validate = function() {
var userName = $("#userName").val().replace(/(^\s*)|(\s*$)/g, ""); var userName = $("#userName").val().replace(/(^\s*)|(\s*$)/g, "");
if (!/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test($("#userEmail").val())) { if (!/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test($("#userEmail").val())) {
$("#tip").text("${mailInvalidLabel}"); $("#tip").text("${mailInvalidLabel}");
$("#userEmail").focus(); $("#userEmail").focus();
} else if (2 > userName.length || userName.length > 20) { } else if (2 > userName.length || userName.length > 20) {
$("#tip").text("${nameTooLongLabel}"); $("#tip").text("${nameTooLongLabel}");
$("#userName").focus(); $("#userName").focus();
} else if ($("#userPassword").val().replace(/\s/g, "") === "") { } else if ($("#userPassword").val().replace(/\s/g, "") === "") {
$("#tip").text("${passwordEmptyLabel}"); $("#tip").text("${passwordEmptyLabel}");
$("#userPassword").focus(); $("#userPassword").focus();
} else if ($("#userPassword").val() !== $("#userPasswordConfirm").val()) { } else if ($("#userPassword").val() !== $("#userPasswordConfirm").val()) {
$("#tip").text("${passwordNotMatchLabel}"); $("#tip").text("${passwordNotMatchLabel}");
$("#userPasswordConfirm").focus(); $("#userPasswordConfirm").focus();
} else { } else {
$("#tip").text(""); $("#tip").text("");
return true; return true;
} }
return false; return false;
}; };
var getUserInfo = function() { var getUserInfo = function() {
if (validate()) { if (validate()) {
var requestJSONObject = { var requestJSONObject = {
"userName": $("#userName").val(), "userName": $("#userName").val(),
"userEmail": $("#userEmail").val(), "userEmail": $("#userEmail").val(),
"userPassword": $("#userPassword").val() "userURL": $("#userURL").val(),
}; "userPassword": $("#userPassword").val()
$.ajax({ };
url: "${contextPath}" + "/console/user/", $.ajax({
type: "POST", url: "${contextPath}" + "/console/user/",
cache: false, type: "POST",
data: JSON.stringify(requestJSONObject), cache: false,
success: function(result, textStatus) { data: JSON.stringify(requestJSONObject),
$("#tip").text(result.msg); success: function(result, textStatus) {
if (!result.sc) { $("#tip").text(result.msg);
return; if (!result.sc) {
} return;
setTimeout(function() { }
window.location.href = "${servePath}"; setTimeout(function() {
}, 1000); window.location.href = "${servePath}";
} }, 1000);
})
} }
} })
}
}
$(function() { $(function() {
$("#userPasswordConfirm").keypress(function(event) { $("#userPasswordConfirm").keypress(function(event) {
if (event.keyCode === 13) { if (event.keyCode === 13) {
getUserInfo(); getUserInfo();
} }
}); });
}); });
</script> </script>
</body> </body>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment