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

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

parent 3856c264
...@@ -16,21 +16,11 @@ package org.b3log.solo.model; ...@@ -16,21 +16,11 @@ package org.b3log.solo.model;
* *
* @author <a href="http://88250.b3log.org">Liang Ding</a> * @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="https://hacpai.com/member/e">Dongxu Wang</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 * @since 0.3.1
*/ */
public final class Common { 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. * Key of favicon URL.
*/ */
......
...@@ -17,10 +17,8 @@ import org.apache.logging.log4j.LogManager; ...@@ -17,10 +17,8 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.Request; import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext; import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer; import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.ioc.Inject; import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Singleton; import org.b3log.latke.ioc.Singleton;
...@@ -49,7 +47,7 @@ import java.util.Map; ...@@ -49,7 +47,7 @@ import java.util.Map;
* @author <a href="http://88250.b3log.org">Liang Ding</a> * @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="https://hacpai.com/member/DASHU">DASHU</a> * @author <a href="https://hacpai.com/member/DASHU">DASHU</a>
* @author <a href="http://vanessa.b3log.org">Vanessa</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 * @since 0.3.1
*/ */
@Singleton @Singleton
...@@ -92,34 +90,12 @@ public class IndexProcessor { ...@@ -92,34 +90,12 @@ public class IndexProcessor {
*/ */
public void showIndex(final RequestContext context) { public void showIndex(final RequestContext context) {
final Request request = context.getRequest(); final Request request = context.getRequest();
final Response response = context.getResponse();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "index.ftl"); final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "index.ftl");
final Map<String, Object> dataModel = renderer.getDataModel(); final Map<String, Object> dataModel = renderer.getDataModel();
try { try {
final int currentPageNum = Paginator.getPage(request); final int currentPageNum = Paginator.getPage(request);
final JSONObject preference = optionQueryService.getPreference(); 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); Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) context.attr(Keys.TEMAPLTE_DIR_NAME), dataModel);
dataModelService.fillIndexArticles(context, dataModel, currentPageNum, preference); dataModelService.fillIndexArticles(context, dataModel, currentPageNum, preference);
......
...@@ -33,7 +33,7 @@ import org.json.JSONObject; ...@@ -33,7 +33,7 @@ import org.json.JSONObject;
* Skin handler. * Skin handler.
* *
* @author <a href="http://88250.b3log.org">Liang Ding</a> * @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 * @since 3.6.7
*/ */
public class SkinHandler implements Handler { public class SkinHandler implements Handler {
...@@ -62,11 +62,12 @@ public class SkinHandler implements Handler { ...@@ -62,11 +62,12 @@ public class SkinHandler implements Handler {
/** /**
* Resolve skin (template) for the specified HTTP request. * Resolve skin (template) for the specified HTTP request.
* 前台皮肤切换 https://github.com/b3log/solo/issues/12060 * 前台皮肤切换 https://github.com/b3log/solo/issues/12060
* 调整前台动态皮肤预览逻辑 https://github.com/88250/solo/issues/116
* *
* @param request the specified HTTP request * @param request the specified HTTP request
*/ */
private void resolveSkinDir(final Request request) { private void resolveSkinDir(final Request request) {
String skin = Skins.getSkinDirNameFromCookie(request); String skin = Skins.getQuerySkin(request);
if (StringUtils.isBlank(skin)) { if (StringUtils.isBlank(skin)) {
final BeanManager beanManager = BeanManager.getInstance(); final BeanManager beanManager = BeanManager.getInstance();
final OptionQueryService optionQueryService = beanManager.getReference(OptionQueryService.class); final OptionQueryService optionQueryService = beanManager.getReference(OptionQueryService.class);
...@@ -85,7 +86,6 @@ public class SkinHandler implements Handler { ...@@ -85,7 +86,6 @@ public class SkinHandler implements Handler {
} }
} }
} }
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, skin); request.setAttribute(Keys.TEMAPLTE_DIR_NAME, skin);
} }
......
...@@ -16,15 +16,12 @@ import org.apache.logging.log4j.LogManager; ...@@ -16,15 +16,12 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.RequestContext; import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.renderer.JsonRenderer; import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.ioc.Inject; import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Singleton; import org.b3log.latke.ioc.Singleton;
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.solo.model.Common;
import org.b3log.solo.model.Option; import org.b3log.solo.model.Option;
import org.b3log.solo.service.OptionQueryService; import org.b3log.solo.service.OptionQueryService;
import org.b3log.solo.service.SkinMgmtService; import org.b3log.solo.service.SkinMgmtService;
...@@ -39,7 +36,7 @@ import java.util.Set; ...@@ -39,7 +36,7 @@ import java.util.Set;
* Skin console request processing. * Skin console request processing.
* *
* @author <a href="http://88250.b3log.org">Liang Ding</a> * @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 * @since 3.5.0
*/ */
@Singleton @Singleton
...@@ -157,16 +154,6 @@ public class SkinConsole { ...@@ -157,16 +154,6 @@ public class SkinConsole {
skinMgmtService.updateSkin(skin); 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.STATUS_CODE, true);
ret.put(Keys.MSG, langPropsService.get("updateSuccLabel")); ret.put(Keys.MSG, langPropsService.get("updateSuccLabel"));
...@@ -179,18 +166,4 @@ public class SkinConsole { ...@@ -179,18 +166,4 @@ public class SkinConsole {
jsonObject.put(Keys.MSG, langPropsService.get("updateFailLabel")); 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; ...@@ -20,7 +20,6 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.Request; import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext; import org.b3log.latke.http.RequestContext;
import org.b3log.latke.ioc.BeanManager; import org.b3log.latke.ioc.BeanManager;
...@@ -28,7 +27,6 @@ import org.b3log.latke.service.LangPropsService; ...@@ -28,7 +27,6 @@ import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException; import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.Locales; import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Stopwatchs; import org.b3log.latke.util.Stopwatchs;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option; import org.b3log.solo.model.Option;
import java.io.File; import java.io.File;
...@@ -43,7 +41,7 @@ import java.util.stream.Stream; ...@@ -43,7 +41,7 @@ import java.util.stream.Stream;
* Skin utilities. * Skin utilities.
* *
* @author <a href="http://88250.b3log.org">Liang Ding</a> * @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 * @since 0.3.1
*/ */
public final class Skins { public final class Skins {
...@@ -232,64 +230,21 @@ public final class Skins { ...@@ -232,64 +230,21 @@ public final class Skins {
/** /**
* Gets skin directory name from the specified request. * 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 * @return directory name, or {@code null} if not found
*/ */
public static String getSkinDirName(final RequestContext context) { public static String getQuerySkin(final Request request) {
// 1. Get skin from query final String specifiedSkin = request.getParameter(Option.CATEGORY_C_SKIN);
final String specifiedSkin = context.param(Option.CATEGORY_C_SKIN);
if (StringUtils.isNotBlank(specifiedSkin)) { if (StringUtils.isNotBlank(specifiedSkin)) {
final Set<String> skinDirNames = Skins.getSkinDirNames(); final Set<String> skinDirNames = Skins.getSkinDirNames();
if (skinDirNames.contains(specifiedSkin)) { if (skinDirNames.contains(specifiedSkin)) {
return 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; return null;
} }
......
...@@ -18,6 +18,7 @@ import org.apache.logging.log4j.Level; ...@@ -18,6 +18,7 @@ import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.b3log.latke.http.RequestContext; import org.b3log.latke.http.RequestContext;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.SkinRenderer; import org.b3log.solo.processor.SkinRenderer;
import java.io.ByteArrayInputStream; 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