时(在我的经验中)你需要支持你的申请的白色标签。您通常可以以SaaS的方式运行它,但是一些重要的或高调的客户端可能希望在您的云部署上进行专门的部署,或者进行前提部署,或者仅仅是“他们的角落”。
白色标签通常包括不同的CSS,不同的标识和其他图像,以及不同的页眉和页脚文本。产品的其余部分保持不变。那么,我们如何以尽可能最小的侵入性方式支持白色标签呢?(我将在我的示例中使用SpringMVC,但是将逻辑移植到其他框架非常简单)
首先,让我们概述支持白标签的三种不同方式。您可以(而且可能应该)实现所有这些,因为它们在不同的场景中都很有用,并且有很多重叠。
若要实现全白标安装,我们必须在文件系统上配置一个路径,其中将放置定制的CSS文件和图像以及定制的文本。下面是一个在启动时传递给应用程序的.properties文件的示例:
1
2
3
4
5
|
styling.dir=/var/config/whitelabel styling.footer=©2018 Your Company styling.logo=/images/logsentinel-logo.png styling.css=/css/custom.css styling.title=Your Company |
在Spring/Spring引导中,如果某个URL模式匹配,您可以从文件系统中服务器文件。例如:
1
2
3
4
5
6
7
8
9
10
11
|
@Component @Configuration public class WebMvcCustomization implements WebMvcConfigurer { @Value ( "${styling.dir}" ) private String whiteLabelDir; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler( "/whitelabel/**" ).addResourceLocations(whiteLabelDir); } } |
最后,您需要自定义HTML模板,但我们将在最后实现所有其他选项。
https://www.meipian.cn/c/422092174
接下来,是白标子域。对我来说,这是最好的选择,因为它允许您使用具有特定样式的多个客户进行一次安装。样式仅取决于服务通过的域/子域。
为此,我们需要引入一个实体,WhitelabelStyling
以及相应的数据库表。我们可以做一些管理UI来配置它,或者在数据库中直接配置它。该实体可能如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@Table ( "whitelabel_styling" ) public class WhitelabelStyling { @PrimaryKey private String key; @Column private String title; @Column private String css; @Column @CassandraType (type = DataType.Name.BLOB) private byte [] logo; @Column private String footer; @Column private String domain; // getters and setters } |
键是您选择的任意字符串。它可能与(子)域或其他有业务意义的字符串相同。剩下的大部分都是显而易见的。在我们拥有这一切之后,我们需要能够为资源服务。为此我们需要。控制器获取一个白标签键,并尝试从数据库加载相应的条目,然后提供结果。在本例中,控制器端点位于/whitelabel-resources/logo.png
和/whitelabel-resources/style.css
.
https://www.imdb.cn/title/tt3480822/talk_192
为了为特定的子域设置适当的键,您需要一个每个请求模型属性(即在呈现的所有页面的模型中设置的值)。类似这样的内容(它每天刷新一次白标签缓存;如果您不想在每个请求中访问数据库,则缓存是强制的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@ModelAttribute ( "domainWhitelabel" ) public WhitelabelStyling perDomainStyling(HttpServletRequest request) { String serverName = request.getServerName(); if (perDomainStylings.containsKey(serverName)) { return perDomainStylings.get(serverName); } return null ; } @Scheduled (fixedRate = DateTimeConstants.MILLIS_PER_DAY) public void refreshAllowedWhitelabelDomains() { perDomainStylings = whitelabelService.getWhitelabelStyles() .stream() .collect(Collectors.toMap(WhitelabelStyling::getDomain, Function.identity())); } |
最后,每个客户的白色标签实现相同的方法,使用相同的控制器,只有当前的密钥不会基于request.getServerName()
但是在当前通过身份验证的用户的属性上。管理员(通过UI或直接在数据库中)可以为每个用户分配一个白标记密钥,然后,在登录后,该用户将看到定制的样式。
我们已经看到了解决方案的Java部分的外观,但是我们需要修改HTML模板以选择自定义。一种简单的方法如下所示(使用卵石模板):
https://www.imdb.com/list/ls088377272/
1
2
3
4
5
6
7
8
9
|
{% if domainWhitelabel != null %} < link href = "/whitelabel-resources/style.css?key={{ domainWhitelabel.key }}" rel = "stylesheet" > {% elseif user.whitelabelStyling != null and user.whitelabelStyling.css != ‘‘ %} < link href = "/whitelabel-resources/style.css" rel = "stylesheet" > {% elseif beans.environment.getProperty(‘styling.dir‘) != ‘‘ and beans.environment.getProperty(‘styling.css.enabled‘) == true %} < link href = "{{‘/whitelabel/‘+ beans.environment.getProperty(‘styling.css‘)}}" rel = "stylesheet" > {% else %} < link href = "{{ beans.environment.getProperty(‘styling.css‘)}}" rel = "stylesheet" > {% endif %} |
这很简单--如果配置了域级白标签,就使用它;如果没有,检查当前用户是否指定了特定的白标签;如果没有,检查是否配置了全局安装白标签;如果没有,则使用默认设置。此片段利用WhitelabelController
上面(前两种情况下)和倒数第二种情况下的自定义资源处理程序。
总的来说,这是一个灵活而简单的解决方案,即使在现有的系统上实现和测试也不需要超过几天的时间。我将再次表达我对基于域的样式的偏好,因为它们允许使用与许多不同的样式和徽标相同的多租户安装。当然,您的Web服务器/负载均衡器/域应该被正确地配置为允许子域,并允许您轻松地管理它们,但这是多余的。
我认为白色标签对许多产品来说是一种很好的方法。显然,在业务需要之前,不要实现它,但是要记住,它可能会发生变化,这是相对容易实现的。
原文:https://www.cnblogs.com/aiqiyi/p/15226503.html