Orchard商城模块(Commerce)设计与后台部分

前言:使用CMS开发网站为目标,编写一个扩展性比较好的商城模块。

首先是整体流程图,大概介绍功能与设计。

 

接下来我们逐个模块功能介绍。

一。商品管理模块

商品模块中可发布需要在线售卖的商品 (套餐商品)  

1.1 添加一个商品

1. 商品正常价,与当前促销价,  (不填写促销价,将按照正常价计算  。)

2.是否为虚拟商品 (虚拟商品将不需要填写收货地址, 如果购物车上所有商品均为虚拟商品,则不需填写收货地址,如果有一个非虚拟商品,仍需填写)

 

 以下商品实体类

namespace Aivics.Commerce.Models
{/// <summary>/// 商品对象/// </summary>[OrchardFeature("Aivics.Commerce")]public class ProductPart : ContentPart<ProductPartRecord>, IProduct {/// <summary>/// 商品SKU/// </summary>[Required]public string Sku{get { return Retrieve(r => r.Sku); }set { Store(r => r.Sku, value); }}/// <summary>/// 价格/// </summary>[Required]public double Price{get { return Retrieve(r => r.Price); }set { Store(r => r.Price, value); }}/// <summary>/// 折扣价/// </summary>public double DiscountPrice{get { return Retrieve(r => r.DiscountPrice, -1); }set { Store(r => r.DiscountPrice, value); }}/// <summary>/// 数字商品、虚拟商品(没有物流)/// </summary>public bool IsDigital{get { return Retrieve(r => r.IsDigital); }set { Store(r => r.IsDigital, value); }}/// <summary>/// 物流费用 -不填写时将使用物流费用模板进行计算/// </summary>public double? ShippingCost{get { return Retrieve(r => r.ShippingCost); }set { Store(r => r.ShippingCost, value); }}/// <summary>/// 中奖/// </summary>public double Weight{get { return Retrieve(r => r.Weight); }set { Store(r => r.Weight, value); }}/// <summary>/// 规格/// </summary>public string Size{get { return Retrieve(r => r.Size); }set { Store(r => r.Size, value); }}/// <summary>/// 库存/// </summary>public int Inventory{get { return Retrieve(r => r.Inventory); }set { Store(r => r.Inventory, value); }}/// <summary>/// 超过库存警告信息/// </summary>public string OutOfStockMessage{get { return Retrieve(r => r.OutOfStockMessage); }set { Store(r => r.OutOfStockMessage, value); }}/// <summary>/// 允许超库存购买/// </summary>public bool AllowBackOrder{get { return Retrieve(r => r.AllowBackOrder); }set { Store(r => r.AllowBackOrder, value); }}/// <summary>/// 覆盖阶梯价格,/// </summary>public bool OverrideTieredPricing{get { return Retrieve(r => r.OverrideTieredPricing); }set { Store(r => r.OverrideTieredPricing, value); }}/// <summary>/// 价格阶梯,(折扣逻辑)/// </summary>public IEnumerable<PriceTier> PriceTiers{get{var rawTiers = Retrieve<string>("PriceTiers");return PriceTier.DeserializePriceTiers(rawTiers);}set{var serializedTiers = PriceTier.SerializePriceTiers(value);Store("PriceTiers", serializedTiers ?? "");}}/// <summary>/// 最小起订数/// </summary>public int MinimumOrderQuantity{get{var minimumOrderQuantity = Retrieve(r => r.MinimumOrderQuantity);return minimumOrderQuantity > 1 ? minimumOrderQuantity : 1;}set{var minimumOrderQuantity = value > 1 ? value : 1;Store(r => r.MinimumOrderQuantity, minimumOrderQuantity);}}/// <summary>/// 是否要求必须登陆后购买/// </summary>public bool AuthenticationRequired{get { return Retrieve(r => r.AuthenticationRequired); }set { Store(r => r.AuthenticationRequired, value); }}}
}

  2.  套餐商品类 (目前UI菜单中不公布,此功能与流程调试中)

    /// <summary>/// 产品套餐/// </summary>public class BundlePart : ContentPart<BundlePartRecord>{public IEnumerable<int> ProductIds{get { return Record.Products.Select(p => p.ContentItemRecord.Id); }}public IEnumerable<ProductQuantity> ProductQuantities{get{returnRecord.Products.Select(p => new ProductQuantity{Quantity = p.Quantity,ProductId = p.ContentItemRecord.Id});}}}

  二。物流计费方案模块

说明: 该模块为商品所需运费自动匹配计算的功能, 如果商品中指定了【运费】金额,则不从此处计算运费。  

目前支持 【重量计算规则】和【大小规格计算】

有效区域应为 所有省份, 目前仅提供几个周边省份(测试数据)

 

实体的相关代码

namespace Aivics.Commerce.Models
{/// <summary>/// 基于重量的物流计费/// </summary>public class WeightBasedShippingMethodPart : ContentPart<WeightBasedShippingMethodPartRecord>,IShippingMethod{public string Name{get { return Retrieve(r => r.Name); }set { Store(r => r.Name, value); }}public string ShippingCompany{get { return Retrieve(r => r.ShippingCompany); }set { Store(r => r.ShippingCompany, value); }}public double Price{get { return Retrieve(r => r.Price); }set { Store(r => r.Price, value); }}public string IncludedShippingAreas{get { return Retrieve(r => r.IncludedShippingAreas); }set { Store(r => r.IncludedShippingAreas, value); }}public string ExcludedShippingAreas{get { return Retrieve(r => r.ExcludedShippingAreas); }set { Store(r => r.ExcludedShippingAreas, value); }}public double? MinimumWeight{get { return Retrieve(r => r.MinimumWeight); }set { Store(r => r.MinimumWeight, value); }}public double? MaximumWeight{get { return Retrieve(r => r.MaximumWeight); }set { Store(r => r.MaximumWeight, value); }} // Set to double.PositiveInfinity (the default) for unlimited weight rangespublic IEnumerable<ShippingOption> ComputePrice(IEnumerable<ShoppingCartQuantityProduct> productQuantities,IEnumerable<IShippingMethod> shippingMethods,string country,string zipCode,IWorkContextAccessor workContextAccessor){var quantities = productQuantities.ToList();var fixedCost = quantities.Where(pq => pq.Product.ShippingCost != null && pq.Product.ShippingCost >= 0 && !pq.Product.IsDigital).Sum(pq => pq.Quantity * (double)pq.Product.ShippingCost);var weight = quantities.Where(pq => (pq.Product.ShippingCost == null || pq.Product.ShippingCost < 0) && !pq.Product.IsDigital).Sum(pq => pq.Quantity * pq.Product.Weight);if (weight.CompareTo(0) == 0){yield return GetOption(fixedCost);}else if (weight >= MinimumWeight && weight <= MaximumWeight){yield return GetOption(fixedCost + Price);}}private ShippingOption GetOption(double price){return new ShippingOption{Description = Name,Price = price,IncludedShippingAreas =IncludedShippingAreas == null? new string[] { }: IncludedShippingAreas.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries),ExcludedShippingAreas =ExcludedShippingAreas == null? new string[] { }: ExcludedShippingAreas.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)};}}
}

三。商品阶梯价格

说明:可设置一个全局的阶梯价格表, (满立减的规则, 同时商品可以对此进行覆盖)

如果需要做定期的促销类活动,则可使用下面一个模块。。。。

  public class TieredPriceProvider : ITieredPriceProvider{private readonly IWorkContextAccessor _wca;public TieredPriceProvider(IWorkContextAccessor wca){_wca = wca;}public ShoppingCartQuantityProduct GetTieredPrice(ShoppingCartQuantityProduct quantityProduct){var priceTiers = GetPriceTiers(quantityProduct.Product);var priceTier = priceTiers != null ? priceTiers.Where(t => t.Quantity <= quantityProduct.Quantity).OrderByDescending(t => t.Quantity).Take(1).SingleOrDefault() : null;if (priceTier != null){quantityProduct.Price = (double)priceTier.Price;}return quantityProduct;}public IEnumerable<PriceTier> GetPriceTiers(ProductPart product){var productSettings = _wca.GetContext().CurrentSite.As<ProductSettingsPart>();IEnumerable<PriceTier> priceTiers = null;List<PriceTier> adjustedPriceTiers = new List<PriceTier>();if (productSettings.AllowProductOverrides && product.OverrideTieredPricing){priceTiers = product.PriceTiers;}else if (productSettings.DefineSiteDefaults && (!productSettings.AllowProductOverrides || !product.OverrideTieredPricing)){priceTiers = productSettings.PriceTiers;}if (priceTiers == null)return priceTiers;foreach (var tier in priceTiers){var adjustedPrice = tier.Price;if (tier.Price == null && tier.PricePercent != null){adjustedPrice = product.Price * (double)tier.PricePercent / 100;}adjustedPriceTiers.Add(new PriceTier{Price = adjustedPrice,Quantity = tier.Quantity,PricePercent = tier.PricePercent});}return adjustedPriceTiers.OrderBy(t => t.Quantity);}}

四。促销模块

说明:目前提供一个促销模块规则, 主要为满立减活动等适用。  

1.可设置折扣的比例(9折等)和固定的折扣金额

2.指定参与的时间

3.可参加此活动的角色(高级会员)

4.有效数量区间 

5.URL匹配可以设置与指定特定的商品参加。。

 

 

主要代码如下:

目前继承自IPromotion类,之后相关其他活动促销规则,可从此直接继承。(如买10赠1活动设置等)

    public class Discount : IPromotion{private readonly IWorkContextAccessor _wca;private readonly IClock _clock;public Discount(IWorkContextAccessor wca, IClock clock){_wca = wca;_clock = clock;}public DiscountPart DiscountPart { get; set; }public IContent ContentItem { get { return DiscountPart.ContentItem; } }public string Name { get { return DiscountPart == null ? "Discount" : DiscountPart.Name; } }public bool Applies(ShoppingCartQuantityProduct quantityProduct, IEnumerable<ShoppingCartQuantityProduct> cartProducts){if (DiscountPart == null) return false;var now = _clock.UtcNow;if (DiscountPart.StartDate != null && DiscountPart.StartDate > now) return false;if (DiscountPart.EndDate != null && DiscountPart.EndDate < now) return false;if (DiscountPart.StartQuantity != null &&DiscountPart.StartQuantity > quantityProduct.Quantity)return false;if (DiscountPart.EndQuantity != null &&DiscountPart.EndQuantity < quantityProduct.Quantity)return false;if (!string.IsNullOrWhiteSpace(DiscountPart.Pattern) || !string.IsNullOrWhiteSpace(DiscountPart.ExclusionPattern)){string path = null;if (DiscountPart.DisplayUrlResolver != null){path = DiscountPart.DisplayUrlResolver(quantityProduct.Product);}else if (_wca.GetContext().HttpContext != null){var urlHelper = new UrlHelper(_wca.GetContext().HttpContext.Request.RequestContext);path = urlHelper.ItemDisplayUrl(quantityProduct.Product);}else{var autoroutePart = quantityProduct.Product.As<AutoroutePart>();if (autoroutePart != null){path = "/" + autoroutePart.Path; }}if (path == null) return false;if (!string.IsNullOrWhiteSpace(DiscountPart.Pattern)){var patternExpression = new Regex(DiscountPart.Pattern, RegexOptions.Singleline | RegexOptions.IgnoreCase);if (!patternExpression.IsMatch(path))return false;}if (!string.IsNullOrWhiteSpace(DiscountPart.ExclusionPattern)){var exclusionPatternExpression = new Regex(DiscountPart.ExclusionPattern,RegexOptions.Singleline | RegexOptions.IgnoreCase);if (exclusionPatternExpression.IsMatch(path))return false;}}if (DiscountPart.Roles.Any()){var user = _wca.GetContext().CurrentUser;if (!user.Has<IUserRoles>()) return false;var roles = user.As<IUserRoles>().Roles;if (!roles.Any(r => DiscountPart.Roles.Contains(r))) return false;}return true;}public ShoppingCartQuantityProduct Apply(ShoppingCartQuantityProduct quantityProduct, IEnumerable<ShoppingCartQuantityProduct> cartProducts){if (DiscountPart == null) return quantityProduct;var comment = DiscountPart.Comment; var percent = DiscountPart.DiscountPercent;if (percent != null){return new ShoppingCartQuantityProduct(quantityProduct.Quantity, quantityProduct.Product, quantityProduct.AttributeIdsToValues){Comment = comment,Price = Math.Round(quantityProduct.Price * (1 - ((double)percent / 100)), 2),Promotion = DiscountPart};}var discount = DiscountPart.Discount;if (discount != null){return new ShoppingCartQuantityProduct(quantityProduct.Quantity, quantityProduct.Product, quantityProduct.AttributeIdsToValues){Comment = comment,Price = Math.Round(Math.Max(0, quantityProduct.Price - (double)discount), 2),Promotion = DiscountPart};}return quantityProduct;}}

五。商品扩展模块

主要为解决需要 用户确定附属配置的 商品 。  用户可在选择了主商品的基础上, 选择额外配置, 不同的配置将决定追加的金额不同。 

(这个功能需与购物车整合体现)

namespace Aivics.Commerce.Models
{/// <summary>/// 商品扩展插件对象  用户可选择不同的插件,需支付额外的插件价格/// </summary>public class ProductAttributePart : ContentPart<ProductAttributePartRecord>{public IEnumerable<ProductAttributeValue> AttributeValues{get{return ProductAttributeValue.DeserializeAttributeValues(AttributeValuesString);}set{AttributeValuesString = ProductAttributeValue.SerializeAttributeValues(value);}}/// <summary>/// 排序号/// </summary>[DisplayName("Sort Order")]public int SortOrder{get { return Retrieve(r => r.SortOrder); }set { Store(r => r.SortOrder, value); }}/// <summary>/// 显示名/// </summary>[DisplayName("Display Name")]public string DisplayName{get { return Retrieve(r => r.DisplayName); }set { Store(r => r.DisplayName, value); }}/// <summary>/// 设置信息/// </summary>internal string AttributeValuesString{get{return Retrieve(r => r.AttributeValues);}set{Store(r => r.AttributeValues, value);}}}
}

 

六。订单管理

查看所有用户下单等。

 

 

 

 

七。购物车模块设置

除了domain/cart为进入购物车页面外,  购物车模块已经做成widget. 可以做到layout的其中一个位置固定。

 

 购物车相关代码:

   [OrchardFeature("Aivics.Commerce")]public class ShoppingCart : IShoppingCart{private readonly IContentManager _contentManager;private readonly IShoppingCartStorage _cartStorage;private readonly IPriceService _priceService;private readonly IEnumerable<IProductAttributesDriver> _attributesDrivers;private readonly INotifier _notifier;private IEnumerable<ShoppingCartQuantityProduct> _products;public ShoppingCart(IContentManager contentManager,IShoppingCartStorage cartStorage,IPriceService priceService,IEnumerable<IProductAttributesDriver> attributesDrivers,INotifier notifier){_contentManager = contentManager;_cartStorage = cartStorage;_priceService = priceService;_attributesDrivers = attributesDrivers;_notifier = notifier;T = NullLocalizer.Instance;}public Localizer T { get; set; }public IEnumerable<ShoppingCartItem> Items{get { return ItemsInternal.AsReadOnly(); }}private List<ShoppingCartItem> ItemsInternal{get{return _cartStorage.Retrieve();}}/// <summary>/// 添加商品至购物车中,目前将商品存放在session中/// </summary>/// <param name="productId"></param>/// <param name="quantity"></param>/// <param name="attributeIdsToValues"></param>public void Add(int productId, int quantity = 1, IDictionary<int, ProductAttributeValueExtended> attributeIdsToValues = null){if (!ValidateAttributes(productId, attributeIdsToValues)){// 将该商品添加到购物车时,该商品扩展属性不正确(或后台有更新,或前台数据结构异常)。_notifier.Warning(T("Couldn't add this product because of invalid attributes. Please refresh the page and try again."));return;}var item = FindCartItem(productId, attributeIdsToValues);if (item != null){item.Quantity += quantity;}else{ItemsInternal.Insert(0, new ShoppingCartItem(productId, quantity, attributeIdsToValues));}_products = null;}/// <summary>/// 查找一个商品, 可以通过商品id直接从查询,或者也需同时传递扩展属性进行匹配/// </summary>/// <param name="productId"></param>/// <param name="attributeIdsToValues"></param>/// <returns></returns>public ShoppingCartItem FindCartItem(int productId, IDictionary<int, ProductAttributeValueExtended> attributeIdsToValues = null){if (attributeIdsToValues == null || attributeIdsToValues.Count == 0){return Items.FirstOrDefault(i => i.ProductId == productId&& (i.AttributeIdsToValues == null || i.AttributeIdsToValues.Count == 0));}return Items.FirstOrDefault(i => i.ProductId == productId&& i.AttributeIdsToValues != null&& i.AttributeIdsToValues.Count == attributeIdsToValues.Count&& i.AttributeIdsToValues.All(attributeIdsToValues.Contains));}/// <summary>/// 验证该商品扩展属性是否正确(或后台有更新,或前台数据结构异常)。/// </summary>/// <param name="productId"></param>/// <param name="attributeIdsToValues"></param>/// <returns></returns>private bool ValidateAttributes(int productId, IDictionary<int, ProductAttributeValueExtended> attributeIdsToValues){if (_attributesDrivers == null ||attributeIdsToValues == null ||!attributeIdsToValues.Any()) return true;var product = _contentManager.Get(productId);return _attributesDrivers.All(d => d.ValidateAttributes(product, attributeIdsToValues));}/// <summary>/// 批量添加商品至购物车/// </summary>/// <param name="items"></param>public void AddRange(IEnumerable<ShoppingCartItem> items){foreach (var item in items){Add(item.ProductId, item.Quantity, item.AttributeIdsToValues);}}/// <summary>/// 移除购物车商品/// </summary>/// <param name="productId"></param>/// <param name="attributeIdsToValues"></param>public void Remove(int productId, IDictionary<int, ProductAttributeValueExtended> attributeIdsToValues = null){var item = FindCartItem(productId, attributeIdsToValues);if (item == null) return;ItemsInternal.Remove(item);_products = null;}/// <summary>/// 获取目前选购的商品  (1.数量>0, 2. 重新从服务器匹配商品,避免商品被删除,脏数据。/// </summary>/// <returns></returns>public IEnumerable<ShoppingCartQuantityProduct> GetProducts(){if (_products != null) return _products;//从session中获得所有保存的商品ID  (用户购物车)var ids = Items.Select(x => x.ProductId);var productParts =_contentManager.GetMany<ProductPart>(ids, VersionOptions.Published,new QueryHints().ExpandParts<TitlePart, ProductPart, AutoroutePart>()).ToArray();var productPartIds = productParts.Select(p => p.Id);//保证Session中存储的ID是 服务器端 在用的Product对象 (排除掉未发布,删除等,避免脏数据)var shoppingCartQuantities =(from item in Itemswhere productPartIds.Contains(item.ProductId) && item.Quantity > 0select new ShoppingCartQuantityProduct(item.Quantity, productParts.First(p => p.Id == item.ProductId), item.AttributeIdsToValues))  //使用ShoppingCartQuantityProduct,完善的购物车商品字段等信息
                    .ToList();//返回所有>0选购条数的商品return _products = shoppingCartQuantities.Select(q => _priceService.GetDiscountedPrice(q, shoppingCartQuantities)).Where(q => q.Quantity > 0).ToList();}/// <summary>/// 更新购物车数据,删除数量为0的数据  *疑问点*/// </summary>public void UpdateItems(){ItemsInternal.RemoveAll(x => x.Quantity <= 0);_products = null;}/// <summary>/// 获得总价格/// </summary>/// <returns></returns>public double Subtotal(){return Math.Round(GetProducts().Sum(pq => Math.Round(pq.Price * pq.Quantity + pq.LinePriceAdjustment, 2)), 2);}/// <summary>/// 总价/// </summary>/// <param name="subTotal"></param>/// <returns></returns>public double Total(double subTotal = 0){if (subTotal.Equals(0)){subTotal = Subtotal();}return subTotal;}/// <summary>/// 购买总数/// </summary>/// <returns></returns>public double ItemCount(){return Items.Sum(x => x.Quantity);}/// <summary>/// 清空/// </summary>public void Clear(){_products = null;ItemsInternal.Clear();UpdateItems();}}

目前购物车使用 Session存储。

 

八。商品列表,详情

商品的列表与详情我们完全可以借助于orchard本身的模块实现,  简单介绍。。具体可查询 orchard Projection 等相关 

一。创建筛选 (可理解为创建分页查询与筛选语句等。。)

二。创建Projection或者Projection Widget

 

转载于:https://www.cnblogs.com/cuiyangMJ/p/5903875.html

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

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

相关文章

mysql数据库架构_MySQL数据库之互联网常用架构方案

一、数据库架构原则高可用高性能可扩展一致性二、常见的架构方案方案一&#xff1a;主备架构&#xff0c;只有主库提供读写服务&#xff0c;备库冗余作故障转移用jdbc:mysql://vip:3306/xxdb高可用分析&#xff1a;高可用&#xff0c;主库挂了&#xff0c;keepalive(只是一种工…

laravel方法汇总详解

1.whereRaw() 用原生的SQL语句来查询&#xff0c;whereRaw(select * from user) 就和 User::all()方法是一样的效果 2.whereBetween() 查询时间格式 whereBetween(problem_date, [2016-10-05 19:00:00, 2016-10-05 20:35:10]) 这种可以查到&#xff0c;时间格式类似这种, 查询日…

输入输出优化

被各种变态的出题者出的数据坑到了这里/sad 1 int read() 2 { 3 int num0; char chgetchar(); 4 while(ch<0&&ch>9) chgetchar(); //过滤前面非数字字符 5 while(ch>0&&ch<9) {num*10;numch-0;chgetchar();} 6 return num…

mysql整数索引没用到_MYSQL 索引无效和索引有效的详细介绍

1、WHERE字句的查询条件里有不等于号(WHERE column!...)&#xff0c;MYSQL将无法使用索引2、类似地&#xff0c;如果WHERE字句的查询条件里使用了函数(如&#xff1a;WHERE DAY(column)...)&#xff0c;MYSQL将无法使用索引3、在JOIN操作中(需要从多个数据表提取数据时)&#x…

如何参与一个GitHub开源项目

Github作为开源项目的著名托管地&#xff0c;可谓无人不知&#xff0c;越来越多的个人和公司纷纷加入到Github的大家族里来&#xff0c;为开源尽一份绵薄之力。对于个人来讲&#xff0c;你把自己的项目托管到Github上并不表示你参与了Github开源项目&#xff0c;只能说你开源了…

mysql数据库的多实例_MySQL数据库多实例应用实战 - 橙子柠檬's Blog

本文采用的是/data目录作为mysql多实例总的根目录&#xff0c;然后规划不同 的MySQL实例端口号来作为/data下面的二级目录&#xff0c;不同的端口号就是不同实例目录&#xff0c;以区别不同的实例&#xff0c;二级目录下包含mysql数据文件&#xff0c;配置文件以及启动文件的目…

微信企业号开发[二]——获取用户信息

注&#xff1a;文中绿色部分为摘自微信官方文档 在《微信企业号开发[一]——创建应用》介绍了如何创建应用&#xff0c;但是当用户点击应用跳转到我们设定的URL时&#xff0c;其实并没有带上用户的任何信息&#xff0c;为了获取用户信息&#xff0c;我们需要借助微信提供的OAut…

渗透思维导图

转载于:https://www.cnblogs.com/DonAndy/p/5914747.html

【计算机视觉】论文笔记:Ten years of pedestrian detection, what have we learned?

最近正在研究行人检测&#xff0c;学习了一篇2014年发表在ECCV上的一篇综述性的文章&#xff0c;是对行人检测过去十年的一个回顾&#xff0c;从dataset&#xff0c;main approaches的角度分析了近10年的40多篇论文提出的方法&#xff0c;发现有三种方法&#xff08;DPM变体&am…

02-合并frame

进入IJKMediaPlayer工程--->--->选择release--->选择6s或者其他模拟器&#xff0c;Commandb编译--->选择真机版本&#xff0c;Commandb编译&#xff0c;查看finder&#xff0c;生成真机和模拟器两个版本的frameWork--->找到这个文件----> 真机和模拟器的IJKm…

mysql lib 5.5.28_mysql5.5.28在Linux下的安装

mysql5.5.28在Linux下的安装1. 下载mysql2. 解压假如tar包在/home/zdw/software目录下#tar -xvf mysql-5.5.28-linux2.6-i686.tar.gz3. 移动到/usr/local/mysql#mv mysql-5.5.28-linux2.6-i686 /usr/local/添加快捷方式mysql指向mysql-5.5.28-linux2.6-i686#ln -s mysql-5.5.28…

mysql与缓存脏读_MySQL 事务的隔离级别问题 之 脏读

1. 脏读所谓的脏读就是指一个事务读取了另一个事务未提取的数据。试想一下&#xff1a;a账户要给b账户100元购买商品&#xff0c;如果a账户开启一个事务&#xff0c;执行下面的update语句做了如下转账的工作&#xff1a;update account set moneymoney-100 where namea;update …

easyUI文本框textbox笔记

知识点&#xff1a; 1.图标位置 Icon Align属性&#xff0c;有left和right两个&#xff1b; 2.textbox的setvalue方法&#xff0c;getvalue方法。 <div style"margin:10px 0 20px 0"><span>Select Icon Align: </span><select οnchange"$…

《A First Course in Probability》-chape4-离散型随机变量-几种典型分布列

超几何分布&#xff1a; 超几何分布基于这样一个模型&#xff0c;一个坛子中有N个球&#xff0c;其中m个白球&#xff0c;N-m个黑球&#xff0c;从中随机取n(不放回)&#xff0c;令X表示取出来的白球数&#xff0c;那么&#xff1a; 我们称随机变量X满足参数为(n,m,M)的超几何分…

java内联_JAVA中的内联函数

在说内联函数之前&#xff0c;先说说函数的调用过程。调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址&#xff0c;将函数的程序内容执行完后&#xff0c;再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址&#xff0…

两端对齐布局与text-align:justify

百分比实现 首先最简单的是使用百分比实现&#xff0c;如下一个展示列表&#xff1a; 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"UTF-8">5 <title></title>6 <style type"text/cs…

java拆分单元格_Java 拆分Excel单元格数据为多列

一、概述及使用工具在Excel表格里面&#xff0c;可设置将单元格中的文本数据按分隔符拆分为多列&#xff0c;下面通过Java程序来介绍具体实现方法。这里使用Free Spire.XLS for Java(免费版)来实现数据分列&#xff0c;需要导入Spire.Xls.jar文件到Java程序&#xff0c;可参考以…

win10下安装centos7双系统

国庆最后一天了&#xff0c;闲来无事装个双系统&#xff0c;用虚拟机的linux总有些不方便。 window下安装linux双系统有两中方法&#xff1a; 1.U盘安装 &#xff08;我采用的方法&#xff0c;后面详述&#xff09; 2.EasyBCD工具安装 &#xff08;使用EasyBCD完美实现Windows7…

java swing进度条_Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)

本文将讲解如何做一个类似MyEclipse启动画面的闪屏&#xff0c;为Java Swing应用程序增添魅力。首先看一下效果图吧&#xff0c;原理很简单&#xff0c;就是创建一个Dialog&#xff0c;Dialog有一个进度条和一个Label用来分别显示进度和进度信息&#xff0c;而Dialog的宽度和高…

【JZOJ4817】【NOIP2016提高A组五校联考4】square

题目描述 输入 输出 样例输入 3 4 1 1 0 1 0 1 1 0 0 1 1 0 5 1 1 2 3 2 1 3 2 3 2 3 4 1 1 3 4 1 2 3 4 样例输出 1 1 1 2 2 数据范围 解法 设f[i][j]为以(i,j)为右下角的正方形的最大边长。 则f[i][j]min(f[i−1][j],f[i−1][j−1],f[i][j−1])1(a[i][j]1) 考虑…