最近在做一个多租户的云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. 13.1、多进程:进程锁Lock、信号量、事件

    进程锁: 为什么要有进程锁:假如现在有一台打印机,qq要使用打印机,word文档也要使用打印机,如果没有使用进程锁,可能会导致一些问题,比如QQ的任务打印到一半,Word插进来,于是打印出来的结果是各 ...

  2. [20170627]使用TSPITR恢复表空间.txt

    [20170627]使用TSPITR恢复表空间.txt --//RMAN提供了一种实现所谓TSPITR(Tablespace Point-In-Time Recovery)的技术,通过简单的一个语句, ...

  3. Ext.net 3.1学习

    主页面前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MainF ...

  4. python之列表的常用操作

    Python list 常用方法总结   一,创建列表  只要把逗号分隔的不同的数据项使用方括号([ ])括起来即可 下标(角标,索引)从0开始,最后一个元素的下标可以写-1 list  =  ['1 ...

  5. Linux结构目录

    linux结构目录 Linux中有一句话叫做:一切皆文件. 下面来了解一下这些文件. 首先看一下Linux根目录下结构: bin:存放二进制可执行文件,一般常用命令都存放在这里. boot:存放系统启 ...

  6. switch语句(初学者)

    C语言提供了另一种用于多分支选择的switch语句(常用于开关),一般形式为: switch ( 常量表达式 ) { case 常量1 :语句; case 常量2 :语句; case 常量3 :语句; ...

  7. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

  8. 最长公共前缀的golang实现

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 输入: ["flower","flow",&quo ...

  9. oracle中nvarchar2字符集不匹配

    oracle当多表union时遇到nvarchar2类型时报错 字符集不匹配对使用nvarchar的地方,加上 to_char( nvarchar 的变量或字段 ) 如:select to_char( ...

  10. 控件_TimePicker

    import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view ...