Commit 98635ad7 authored by Liang Ding's avatar Liang Ding

🎨 调整前台动态皮肤预览逻辑 #116

parent 3856c264
......@@ -16,21 +16,11 @@ package org.b3log.solo.model;
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="https://hacpai.com/member/e">Dongxu Wang</a>
* @version 1.7.0.8, Jan 18, 2020
* @version 1.7.0.9, Apr 30, 2020
* @since 0.3.1
*/
public final class Common {
/**
* Key of skin cookie name.
*/
public static final String COOKIE_NAME_SKIN = "skin";
/**
* Key of mobile skin cookie name.
*/
public static final String COOKIE_NAME_MOBILE_SKIN = "mobile-skin";
/**
* Key of favicon URL.
*/
......
......@@ -17,10 +17,8 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Singleton;
......@@ -49,7 +47,7 @@ import java.util.Map;
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="https://hacpai.com/member/DASHU">DASHU</a>
* @author <a href="http://vanessa.b3log.org">Vanessa</a>
* @version 2.0.0.1, Apr 18, 2020
* @version 2.0.0.2, Apr 30, 2020
* @since 0.3.1
*/
@Singleton
......@@ -92,34 +90,12 @@ public class IndexProcessor {
*/
public void showIndex(final RequestContext context) {
final Request request = context.getRequest();
final Response response = context.getResponse();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "index.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
try {
final int currentPageNum = Paginator.getPage(request);
final JSONObject preference = optionQueryService.getPreference();
// 前台皮肤切换 https://github.com/b3log/solo/issues/12060
String specifiedSkin = Skins.getSkinDirName(context);
if (StringUtils.isBlank(specifiedSkin)) {
final JSONObject skinOpt = optionQueryService.getSkin();
specifiedSkin = Solos.isMobile(request) ?
skinOpt.optString(Option.ID_C_MOBILE_SKIN_DIR_NAME) :
skinOpt.optString(Option.ID_C_SKIN_DIR_NAME);
}
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, specifiedSkin);
Cookie cookie;
if (!Solos.isMobile(request)) {
cookie = new Cookie(Common.COOKIE_NAME_SKIN, specifiedSkin);
} else {
cookie = new Cookie(Common.COOKIE_NAME_MOBILE_SKIN, specifiedSkin);
}
cookie.setMaxAge(60 * 60); // 1 hour
cookie.setPath("/");
response.addCookie(cookie);
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) context.attr(Keys.TEMAPLTE_DIR_NAME), dataModel);
dataModelService.fillIndexArticles(context, dataModel, currentPageNum, preference);
......
......@@ -33,7 +33,7 @@ import org.json.JSONObject;
* Skin handler.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Nov 3, 2019
* @version 1.0.0.1, Apr 30, 2020
* @since 3.6.7
*/
public class SkinHandler implements Handler {
......@@ -62,11 +62,12 @@ public class SkinHandler implements Handler {
/**
* Resolve skin (template) for the specified HTTP request.
* 前台皮肤切换 https://github.com/b3log/solo/issues/12060
* 调整前台动态皮肤预览逻辑 https://github.com/88250/solo/issues/116
*
* @param request the specified HTTP request
*/
private void resolveSkinDir(final Request request) {
String skin = Skins.getSkinDirNameFromCookie(request);
String skin = Skins.getQuerySkin(request);
if (StringUtils.isBlank(skin)) {
final BeanManager beanManager = BeanManager.getInstance();
final OptionQueryService optionQueryService = beanManager.getReference(OptionQueryService.class);
......@@ -85,7 +86,6 @@ public class SkinHandler implements Handler {
}
}
}
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, skin);
}
......
......@@ -16,15 +16,12 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.service.OptionQueryService;
import org.b3log.solo.service.SkinMgmtService;
......@@ -39,7 +36,7 @@ import java.util.Set;
* Skin console request processing.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 2.0.0.0, Feb 9, 2020
* @version 2.1.0.0, Apr 30, 2020
* @since 3.5.0
*/
@Singleton
......@@ -157,16 +154,6 @@ public class SkinConsole {
skinMgmtService.updateSkin(skin);
final Response response = context.getResponse();
final Cookie skinDirNameCookie = new Cookie(Common.COOKIE_NAME_SKIN, skin.getString(Option.ID_C_SKIN_DIR_NAME));
skinDirNameCookie.setMaxAge(60 * 60); // 1 hour
skinDirNameCookie.setPath("/");
response.addCookie(skinDirNameCookie);
final Cookie mobileSkinDirNameCookie = new Cookie(Common.COOKIE_NAME_MOBILE_SKIN, skin.getString(Option.ID_C_MOBILE_SKIN_DIR_NAME));
mobileSkinDirNameCookie.setMaxAge(60 * 60); // 1 hour
mobileSkinDirNameCookie.setPath("/");
response.addCookie(mobileSkinDirNameCookie);
ret.put(Keys.STATUS_CODE, true);
ret.put(Keys.MSG, langPropsService.get("updateSuccLabel"));
......@@ -179,18 +166,4 @@ public class SkinConsole {
jsonObject.put(Keys.MSG, langPropsService.get("updateFailLabel"));
}
}
/**
* Checks whether the specified input is a non-negative integer.
*
* @param input the specified input
* @return {@code true} if it is, returns {@code false} otherwise
*/
private boolean isNonNegativeInteger(final String input) {
try {
return 0 <= Integer.valueOf(input);
} catch (final Exception e) {
return false;
}
}
}
......@@ -20,7 +20,6 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.ioc.BeanManager;
......@@ -28,7 +27,6 @@ import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import java.io.File;
......@@ -43,7 +41,7 @@ import java.util.stream.Stream;
* Skin utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.1.7.0, Jan 14, 2020
* @version 1.2.0.0, Apr 30, 2020
* @since 0.3.1
*/
public final class Skins {
......@@ -232,62 +230,19 @@ public final class Skins {
/**
* Gets skin directory name from the specified request.
* Refers to <a href="https://github.com/b3log/solo/issues/12060">前台皮肤切换</a> for more details.
* Refers to <a href="https://github.com/b3log/solo/issues/12060">前台皮肤切换</a> and
* <a href="https://github.com/88250/solo/issues/116">调整前台动态皮肤预览逻辑</a> for more details.
*
* @param context the specified request context
* @param request the specified request
* @return directory name, or {@code null} if not found
*/
public static String getSkinDirName(final RequestContext context) {
// 1. Get skin from query
final String specifiedSkin = context.param(Option.CATEGORY_C_SKIN);
public static String getQuerySkin(final Request request) {
final String specifiedSkin = request.getParameter(Option.CATEGORY_C_SKIN);
if (StringUtils.isNotBlank(specifiedSkin)) {
final Set<String> skinDirNames = Skins.getSkinDirNames();
if (skinDirNames.contains(specifiedSkin)) {
return specifiedSkin;
} else {
return null;
}
}
// 2. Get skin from cookie
return getSkinDirNameFromCookie(context.getRequest());
}
/**
* Gets skin directory name from the specified request's cookie.
*
* @param request the specified request
* @return directory name, or {@code null} if not found
*/
public static String getSkinDirNameFromCookie(final Request request) {
final Set<String> skinDirNames = Skins.getSkinDirNames();
boolean isMobile = Solos.isMobile(request);
String skin = null, mobileSkin = null;
final Set<Cookie> cookies = request.getCookies();
if (!cookies.isEmpty()) {
for (final Cookie cookie : cookies) {
if (Common.COOKIE_NAME_SKIN.equals(cookie.getName()) && !isMobile) {
final String s = cookie.getValue();
if (skinDirNames.contains(s)) {
skin = s;
break;
}
}
if (Common.COOKIE_NAME_MOBILE_SKIN.equals(cookie.getName()) && isMobile) {
final String s = cookie.getValue();
if (skinDirNames.contains(s)) {
mobileSkin = s;
break;
}
}
}
}
if (StringUtils.isNotBlank(skin)) {
return skin;
}
if (StringUtils.isNotBlank(mobileSkin)) {
return mobileSkin;
}
return null;
......
......@@ -18,6 +18,7 @@ import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.b3log.latke.http.RequestContext;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.SkinRenderer;
import java.io.ByteArrayInputStream;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
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