最近在做一个多租户的云SAAS软件自助服务平台,途中遇到很多问题,我会将一些心得、体会逐渐分享出来,和大家一起探讨。这是本系列的第一篇文章。

大家知道,要做一个全自助服务的SAAS云平台是比较复杂的,稍微有些漏洞,就会被不法分子钻漏洞,牵涉到一些金钱上的纠纷。因此,一开始的设计就比较重要了。说到云自助服务平台,可能和网上购物、在线商城有些类似,但里面提供的是相关服务,还是有些区别的,我在这里先讲几个概念:

  • 产品:产品即服务,即是提供给用户的服务。产品有单价,有些产品是基础产品,用户购买正式产品必须免费提供的,产品可以提供给用户进行试用。
  • 模块:产品包括很多模块,有些模块是必然会提供给用户的,比如 操作人员管理、操作日志 等,还有些模块是可选的,用户针对自己的情况进行购买,类似增值服务,比如移动端、企业主页等。另外还有些一次性的服务,比如系统数据对接硬件设备购买等;
  • 服务:用户所能享受到的服务,有一定的使用期限;
  • 订单:用户根据所拥有的 服务 所下的订单(而不是产品哦,为什么?);
  • 购物车:在用户订单生成前先把产品放在购物车里,购物车有很多类别,有的购物车是对目前服务进行的延期,有些是把试用的产品转为正式,有些是对现有服务模块的增删,牵涉到追加购买等。购物车操作频繁、需要做非常多的校验,要和已经购买的服务做无缝的对接,这也是云SAAS产品和普通电商很大不同的地方。到了订单阶段,就相对比较简单了,生成订单后将购物车清空、可以生成多张订单,支付的时候再做一遍校验。

总体的概念流程是 服务->产品->购物车->订单->服务

上一张购物车验证规则的流程图

一些类(还没有全部完成):

对实体类的操作大都采用工厂方式:

购物车类代码:

     public class UserCart
{
public string UserId { get; set; }
/// <summary>
/// 设置域名
/// </summary>
public string ServiceIndentify { get; set; }
public OrderType OrderType { get; set; }
public IList<UserCartProduct> UserCartProducts { get; set; }
public float TotalPrice
{
get
{
if (OrderType == OrderType.Experience)
{
return ;
}
else
{
return UserCartProducts.Sum(p => p.Price);
}
}
}
public virtual IList<UserCartProduct> UserCartProduct { get; set; }
} public class UserCartProduct
{
public string ProductId { get; set; }
public int ProductBasePrice { get; set; }
public Period Period { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public IList<string> UserCartProductBasicModules { get; set; }
public IList<UserCartAddtionalModule> UserCartProductAddtionalModules { get; set; }
public IList<UserCartAddtionalService> UserCartAddtionalServices { get; set; }
public IList<UserCartOption> UserCartOptions { get; set; }
public float Price
{
get
{
return ProductBasePrice
+ UserCartProductAddtionalModules.Sum(m => m.UintPrice.GetPriceByPeriod(Period))
+ UserCartAddtionalServices.Sum(m => m.UintPrice.GetPriceByPeriod(new Period(PeriodType.Times, m.Quantity)))
+ UserCartOptions.Sum(m => m.UintPrice.GetPriceByPeriod(Period));
}
}
public virtual UserCart UserCart { get; set; }
} public class ModuleBase
{
public string ModuleId { get; set; } public PeriodPrice UintPrice { get; set; } } public class UserCartAddtionalModule: ModuleBase
{
} public class UserCartAddtionalService : ModuleBase
{
public int Quantity { get; set; }
} public class UserCartOption: ModuleBase
{
public string CheckId { get; set; }
public string OriginCheckedId { get; set; }
public PeriodPrice OriginPeriodPrice { get; set; }
}

其他类类似。

大家对这块有什么好的意见和建议,希望能够提出来。

SAAS云平台搭建札记系列文章:

SAAS云平台搭建札记: (一)浅论SAAS多租户自助云服务平台的产品、服务和订单

SAAS云平台搭建札记: (二)Linux Ubutu下.Net Core整套运行环境的搭建

SAAS云平台搭建札记: (一) 浅论SAAS多租户自助云服务平台的产品、服务和订单的更多相关文章

  1. SAAS云平台搭建札记: (二) Linux Ubutu下.Net Core整套运行环境的搭建

    最近做的项目,由于预算有限,公司决定不采购Windows服务器,而采购基于Linux的服务器. 一般的VPS服务器,如果使用Windows系统,那么Windows Server2012\2016安装好 ...

  2. SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成

    我们知道,当下最火的前端框架,非蚂蚁金服的AntDesign莫属,这个框架不仅在国内非常有名,在国外GitHub上React前端框架也排名第一.而且这个框架涵盖了React.Vue.Angular等多 ...

  3. SAAS云平台搭建札记: (四) AntD For React使用react-router-dom路由接收不同参数页面不刷新的问题

    在.net开发员眼里,如果使用MVC,根据路由匹配原则,可以通过各种方式接收参数,比如 /Post/List/1, /Post/List/2,或者 /Post/List?id=1,/Post/List ...

  4. Docker系列——InfluxDB+Grafana+Jmeter性能监控平台搭建(三)

    在之前系列博文中,已经介绍完了数据采集和数据存储,那数据如何展示呢?所以今天就专门来讲下数据如何展示的问题. 以前博文参考: Docker系列--InfluxDB+Grafana+Jmeter性能监控 ...

  5. 阿里云服务器搭建SVN

    简单步骤介绍 1:安装svn apt-get install subversion 2. 开启svn服务器 svnserve -d 检查是否开启:ps aux | grep svnserve 若出现如 ...

  6. 「C语言」在Windows平台搭建C语言开发环境的多种方式

    新接触C语言,如何在Windows下进行C语言开发环境的搭建值得思考并整理. 以下多种开发方式择一即可(DEV C++无须环境准备). 注:本文知识来源于  Windows 平台搭建C语言集成开发环境 ...

  7. 在阿里云上搭建 Spark 实验平台

    在阿里云上搭建 Spark 实验平台 Hadoop2.7.3+Spark2.1.0 完全分布式环境 搭建全过程 [传统文化热爱者] 阿里云服务器搭建spark特别坑的地方 阿里云实现Hadoop+Sp ...

  8. Redis之高可用、集群、云平台搭建

    原文:Redis之高可用.集群.云平台搭建 文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Clu ...

  9. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

随机推荐

  1. 使用过AsyncTask、EventBus、Volley以及Retrofit,必须好好了解handler运行机制

    我们都知道在UI线程中不能进行耗时操作,例如数据读写.网络请求.Android 4.0开始,在主线程中进行网络请求甚至会抛出Android.os.NetworkOnMainThreadExceptio ...

  2. SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法

    最近项目转型使用SpringCloud框架下的微服务架构,各微服务之间使用Feign进行调用.期间,发现若被调用方法涉及到文件上传且仅存在单个文件时,一切正常,代码片段如下: @RequestMapp ...

  3. linux中使用nfs共享文件

    NFS需要使用远程过程调用 (RPC),也就是说,我们并不是只要启动NFS, 还需要启动RPC这个服务 服务器端 CentOS 7.4 ip:172.16.0.1 共享/tmp目录 共享/data目录 ...

  4. MySQL 并行复制演进及 MySQL 8.0 中基于 WriteSet 的优化

    MySQL 8.0 可以说是MySQL发展历史上里程碑式的一个版本,包括了多个重大更新,目前 Generally Available 版本已经已经发布,正式版本即将发布,在此将介绍8.0版本中引入的一 ...

  5. Linux查看服务器配置常用

    1. 内存: free:查看内存   total:总共内存 2. 处理器数量: cat /proc/cpuinfo | grep "processor" | wc -l 3.处理器 ...

  6. IntelliJ idea 如何打开左边项目展开栏

    vie->Tool Windows->Project Alt+1 转自:https://blog.csdn.net/bug_moving/article/details/53284434

  7. 跨域访问的解决方案(非HTML5的方法:JSONP)

    http://supercharles888.blog.51cto.com/609344/856886 跨域访问一直是困扰很多开发者的问题之一.因为涉及到安全性问题,所以跨域访问默认是不可以进行的,否 ...

  8. Nginx SSL TLS部署最佳实践

    本文介绍nginx在提供HTTPS时使用的一些其他配置选项. 虽然这些功能有助于优化nginx的SSL和TLS,但这不是一个完整对加固nginx的介绍. 确保您的服务器安全的最佳方法是不仅需要正确的配 ...

  9. win10下乌龟git安装和使用(转)

    文章转自http://blog.csdn.net/jdsjlzx/article/details/51098588 一.安装git for windows 首先下载Git for windows客户端 ...

  10. mybatis逆向工程之maven工程

    maven工程与动态web工程存在差异,不过大体是相同的 注意:运行成功后记得refresh刷新下,否则看不到 一.在pom文件中进行如下配置 <project xmlns="http ...