软件实施与硬件实施的区别_实施白色标签

软件实施与硬件实施的区别

有时(根据我的经验,很多时候)您需要为应用程序添加白色标签。 您通常可以以SaaS方式运行它,但是一些重要的或高知名度的客户端可能需要专用部署或本地部署,或者只是在云部署中“自己的一角”。

白色标签通常包括不同CSS,不同的徽标和其他图像以及不同的页眉和页脚文本。 其余产品保持不变。 那么,我们如何以最小的侵入性方式支持白标? (我将在示例中使用Spring MVC,但是将逻辑移植到其他框架非常简单)

首先,让我们概述支持白标的三种不同方式。 您可以(可能应该)实现所有这些功能,因为它们在不同的场景中很有用,并且有很多重叠之处。

  • 标有白色的安装–更改整个部署的样式。 对于本地安装或托管安装很有用。
  • 白标子域–允许通过特定子域访问不同样式的服务
  • 标有白色的客户–登录后允许特定客户查看自定义样式

要实现全白标安装 ,我们必须在文件系统上配置放置定制CSS文件和图像以及定制文本的路径。 这是启动时传递给应用程序的.properties文件的示例:

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模式匹配,则可以从文件系统中服务器文件。 例如:

@Component
@Configuration
public class WebMvcCustomization implements WebMvcConfigurer {@Value("${styling.dir}")private String whiteLabelDir;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/whitelabel/**").addResourceLocations(whiteLabelDir);}
}

最后,您需要自定义HTML模板,但是当所有其他选项也都实现时,我们将在最后讨论。

接下来是白标子域 。 对我而言,这是最好的选择,因为它允许您一次安装多个具有特定样式的客户。 样式仅取决于访问服务所通过的域/子域。

为此,我们需要引入一个实体WhitelabelStyling和一个相应的数据库表。 我们可以创建一些管理界面来进行配置,或者直接在数据库中进行配置。 该实体可能看起来像这样:

@Table("whitelabel_styling")
public class WhitelabelStyling {@PrimaryKeyprivate String key;@Columnprivate String title;@Columnprivate String css;@Column@CassandraType(type = DataType.Name.BLOB)private byte[] logo;@Columnprivate String footer;@Columnprivate String domain;// getters and setters
}

密钥是您选择的任意字符串。 它可能与(子)域或其他一些有意义的字符串相同。 其余大部分是显而易见的。 有了这些之后,我们需要能够提供资源。 为此,我们需要一个控制器,您可以在此处看到 。 控制器选择一个白色标签的密钥,并尝试从数据库中加载相应的条目,然后提供结果。 在这种情况下,控制器端点为/whitelabel-resources/logo.png/whitelabel-resources/style.css

为了为特定的子域设置适当的密钥,您需要每个请求的模型属性(即,在要呈现的所有页面的模型中设置的值)。 这样的事情(每天刷新一次白标签缓存;如果您不想在每个请求中都访问数据库,则必须使用缓存):

@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或直接在数据库中)可以为每个用户分配一个whitelabel密钥,然后在登录后,该用户将看到自定义样式。

我们已经看到了解决方案的Java部分的外观,但是我们需要修改HTML模板以选择自定义项。 一种简单的方法如下所示(使用卵石模板):

{% 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 (在前两种情况下)和倒数WhitelabelController情况下使用了自定义资源处理程序。

总体而言,这是一个灵活,简单的解决方案,即使在现有系统上也不需要花费几天的时间即可实施和测试。 我将再次表达我对基于域的样式的偏爱,因为它们允许使用多个不同样式和徽标使用相同的多租户安装。 当然,您的Web服务器/负载均衡器/域应正确配置以允许子域并让您轻松管理它们,但这是不正确的。

我认为白色标签是许多产品的好方法。 显然,除非业务需要它,否则请不要实施它,但要记住,它可能会落伍,并且相对容易实施。

翻译自: https://www.javacodegeeks.com/2018/07/implementing-white-labelling.html

软件实施与硬件实施的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sublime Text 设置在标签页中打开文件

按组合键 Command , 打开配置文件&#xff0c;如下图所示&#xff0c;左边的是系统配置文件&#xff0c;里面都是默认的配置内容&#xff0c;你无法修改&#xff0c;但是你可以复制到右边的用户级别的配置文件中。 Sublime Text 默认打开一个文件时都会打开一个新的窗口&…

c语言计算机培训,C语言计算机基础学习||新手入门必看

本次内容笔者将完全抛弃传统教学的形式&#xff0c;通过自己所学所闻得出来的心得&#xff0c;用通俗易懂的语言结合生活&#xff0c;来让大家更好的认识计算机编程&#xff0c;更好的入门计算机基础。笔者也想用自己的论述告诉大家&#xff0c;专业知识有时会比较枯燥乏味点&a…

javafx如何带菜单_JavaFX技巧30:带有DropShadow的ScrollPane

javafx如何带菜单最近&#xff0c;在我的一个项目中&#xff0c;我发现用户很难看到ScrollPane实例的内容当前是否已滚动。 一种更清晰的方法是在滚动窗格的顶部添加阴影。 这也是Google的Material Design建议的。 所以我尝试了一下。 在我的解决方案中&#xff0c;我只是向Sc…

IntelliJ IDEA 怎么知道项目信息_如何重新打开已经移除的项目_如何关闭和删除项目

文章目录 一个窗口只管理一个项目如何打开已经移除的项目Open 和 Import 的简单区别关闭项目如何删除项目IDEA 怎么知道项目信息这里要特别理解一个问题,硬盘上的项目文件必须在 IDEA 的配置文件中,IDEA 才能识别这个文件,而通过 IDEA 添加本地文件(例如添加项目或者添加模…

hmi开发软件c语言,组态,HMI,软件,VC++,源代码

要点&#xff1a;1)、创建新的HMIBuilder应用。2)、如何创建刻度。3)、如何创建一个组合图形。参阅TestMeter1要点&#xff1a;1)、创建新的HMIBuilder应用。2)、如何快速通过组合操作创建按钮。参阅TestButton1.要点&#xff1a;1)、创建新的HMIBuilder应用。2)、如何快速创建…

机器学习java_Java机器学习,第2部分

机器学习java欢迎使用本教程的第二部分&#xff0c;该教程使用LightningScorer为PMML文件评分。 让我们找出其他参数是如何工作的。 初始步骤与教程的第一部分相似。 首先获取本地副本 git clone https://github.com/sezinkarli/lightningscorer.git并用Maven构建它 mvn c…

IntelliJ IDEA 如何知道项目中的模块数据_如何从项目源中选择模块加入当前项目中(添加模块)_如何移除项目中的模块(移除模块/删除模块)

文章目录IDEA 如何获取项目的模块数据从项目源中选择模块加入当前项目中如何移除项目中的模块方式一&#xff0c;选择模块的根目录&#xff08;Content Root&#xff09;&#xff0c;鼠标右键 Remove方式二&#xff0c;打开【项目结构】窗口&#xff0c;在模块列表中选中模块&a…

c语言明解课后答案,明解C语言 中级篇 第一章答案

练习1-1#include #includeint main() {srand(time(0));int anw rand() % 7;printf("您的签运是:");switch (anw) {case 0:printf("大吉"); break;case 1:printf("吉"); break;case 2:printf("小吉"); break;case 3:printf("吉&q…

java 迁移数据_Java 10迁移建议

java 迁移数据你好&#xff0c;再一次到另一个热点。 我的名字是Java Champions的平台工程师和DevOps专家Peter Pilgrim。 如您所知&#xff0c;Java 9引入了模块系统。 您可能正在将服务迁移到JDK 10或更高版本&#xff0c;或者至少在考虑中。 我对企业的一般建议是&#xff…

IntelliJ IDEA for Mac 如何配置项目模块的源代码根目录_源码文件的根目录

按下组合键 Command ; 打开【项目结构】配置窗口&#xff1b;然后选择左侧菜单栏的【Modules】&#xff1b;然后在右侧的模块列表中&#xff0c;选择你要配置的模块&#xff1b;接着选择右侧界面中的【Sources】标签。 首先添加内容根目录&#xff08;Content Root&#xff0…

c语言动态内存分配数组,【C】动态内存分配

## 动态内存分配的意义C语言中的一切操作都是基于内存的变量和数组都是内存的别名内存分配由编译器在编译期间决定定义数组的时候必须指定数组长度数组长度是在编译期就必须确定的需求&#xff1a;程序在运行过程中&#xff0c;可能需要使用一些额外的内存空间malloc和freemall…

javafx 调用java_Java“地铁”表(JavaFX)

javafx 调用java再次嗨&#xff0c;这次&#xff0c;TableView“ Metro”样式被添加到JMetro JavaFX主题。 这会将JMetro版本放大到3.1.0。 我之所以没有添加表格样式&#xff0c;是因为奇怪的是在Fluent设计系统&#xff08;以前是Metro&#xff09;中还没有表格的定义。 有一…

IntelliJ IDEA for Mac 修改项目模块的名称

按下组合键 Command ; 打开项目结构窗口&#xff0c;选择左侧边栏的菜单【Modules】&#xff0c;然后选择你要修改的模块&#xff0c;在右侧的【Name】输入框可以修改名称&#xff0c;具体操作如下图所示&#xff1a; 注&#xff1a;模块名称虽然修改了&#xff0c;但是模块的…

二分查找算法举例说明C语言,C语言快速排序与二分查找算法示例

本文实例讲述了C语言二分排序与查找算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;题目&#xff1a;首先产生随机数&#xff0c;再进行快速排序&#xff0c;再进行二分查找。实现代码&#xff1a;#include #include #include void quiksort(int a[],int low,int …

gradle跟pom_Gradle多项目构建–父pom式结构

gradle跟pom当您来自Maven背景时&#xff0c;很可能已经习惯了父pom结构。 现在&#xff0c;在进行gradle时&#xff0c;情况有所不同。 想象一下有一个包含接口和各种其他实现的项目的场景。 这将是我们的项目结构。 multi-project-gradle -- specification -- core -- i…

java streams_使用Stream.peek在Java Streams内部进行窥视

java streams对于刚接触JDK 8的管道和流的Java开发人员而言&#xff0c; Stream接口提供的peek&#xff08;Consumer&#xff09;方法可以是有用的工具&#xff0c;有助于可视化流操作的行为。 即使是更熟悉Java流和聚合操作的Java开发人员&#xff0c;有时也会发现Stream.peek…

算法提高 日期计算c语言,算法提高 日期计算

//规定年份2017年1月1日 星期7#includeusing namespace std;int rn(int n) //判断是否是润年{if (n%40 && n%100!0 || n%4000)return 1;return 0;}int md[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};int main(){int year,month,day;int i,sum0,td0;while (cin>>…

IntelliJ IDEA for Mac 模块源文件的编译输出路径配置

按下组合键 Command ; 打开【项目结构】窗口&#xff0c;接着在左侧菜单栏中选择【Modules】&#xff0c;接着在右侧模块列表中选择要设置的模块&#xff0c;接着选择右侧的【Paths】标签&#xff0c;如下图所示&#xff1a; 不知道搞个【test ouput path】的好处在哪里&…

IntelliJ IDEA for Mac 如何在当前的普通Java项目中创建新的模块/添加模块/创建模块

文章目录添加模块的入口创建新的项目模块添加模块的入口 添加新的模块的入口有两个&#xff0c;如下图所示&#xff1a; 第一种方式&#xff0c;【File】 --> 【New】 --> 【Module】&#xff1a; 第二种方式&#xff0c;打开【Project Structure】窗口&#xff0c;然后…

react api_使用Java EE 8中的React式API加速服务

react api服务通常可以通过异步处理进行优化&#xff0c;即使不改变其对外界的行为。 某些服务效率不高的原因是&#xff0c;它们需要等待其他服务提供结果才能继续下去。 让我们看一下如何在不等待外部REST服务的情况下调用它们&#xff0c;并独立进行多个并行调用&#xff…