【3】基于多设计模式下的同步&异步日志系统-设计模式

详细介绍设计模式

单例模式

⼀个类只能创建⼀个对象,即单例模式,该设计模式可以保证系统中该类只有⼀个实例,并提供⼀个访问它的全局访问点,该实例被所有程序模块共享。⽐如在某个服务器程序中,该服务器的配置信息存放在⼀个⽂件中,这些配置数据由⼀个单例对象统⼀读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种⽅式简化了在复杂环境下的配置管理。

单例模式有两种实现模式:饿汉模式和懒汉模式

饿汉模式

程序启动时就会创建⼀个唯⼀的实例对象。 因为单例对象已经确定, 所以⽐较适⽤于多线程环境中, 多线程获取单例对象不需要加锁, 可以有效的避免资源竞争, 提⾼性能。

// 饿汉模式
template<typename T>
class Singleton {
private:
 static Singleton _eton;
private:
 Singleton(){}
 ~Singleton(){}
public:
 Singleton(const Singleton&) = delete;
 Singleton& operator=(const Singleton&) = delete;
 static T& getInstance() 
 {
 	return _eton;
 }
};
Singleton Singleton::_eton;	

懒汉模式

第⼀次使⽤要使⽤单例对象的时候创建实例对象。如果单例对象构造特别耗时或者耗费资源(加载插件、加载⽹络资源等), 可以选择懒汉模式, 在第⼀次使⽤的时候才创建对象。不过在多线程环境下等待某事发生都会有麻烦。处理这个麻烦的一种做法是:在程序的单线程启动阶段手工调用所有reference-returning函数,这可消除与初始化有关的“竞速形势”。
这⾥介绍的是《Effective C++》⼀书作者 Scott Meyers 提出的⼀种更加优雅简便的单例模式Meyers’ Singleton in C++。
C++11 Static local variables 特性以确保C++11起,静态变量将能够在满⾜ thread-safe 的前提下唯⼀地被构造和析构

// 懒汉模式
template <typename T> 
class Singleton { 
private:
 Singleton(){}
 ~Singleton(){}
public: 
 Singleton(const Singleton&) = delete;
 Singleton& operator=(const Singleton&) = delete;
 static T& getInstance() 
 { 
 	static Singleton _eton;
	return _eton; 
 } 
};

工厂模式

⼯⼚模式是⼀种创建型设计模式, 它提供了⼀种创建对象的最佳⽅式。在⼯⼚模式中,我们创建对象时不会对上层暴露创建逻辑,⽽是通过使⽤⼀个共同结构来指向新创建的对象,以此实现创建-使⽤的分离。
工厂模式可以分为:简单工厂模式,工厂方法模式,抽象工厂模式。

简单工厂模式

简单⼯⼚模式实现由⼀个⼯⼚对象通过类型决定创建出来指定产品类的实例。假设有个⼯⼚能⽣产出⽔果,当客⼾需要产品的时候明确告知⼯⼚⽣产哪类果,⼯⼚需要接收⽤⼾提供的类别信息,当新增产品的时候,⼯⼚内部去添加新产品的⽣产⽅式。

//简单⼯⼚模式:通过参数控制可以⽣产任何产品
// 优点:简单粗暴,直观易懂。使⽤⼀个⼯⼚⽣产同⼀等级结构下的任意产品
// 缺点:
// 1. 所有东西⽣产在⼀起,产品太多会导致代码量庞⼤
// 2. 开闭原则遵循(开放拓展,关闭修改)的不是太好,要新增产品就必须修改⼯⼚⽅法。
#include <iostream>
#include <string>
#include <memory>
class Fruit {
 public:
 Fruit(){}
 virtual void show() = 0;
};
class Apple : public Fruit {
 public:
 Apple() {}
 virtual void show() {
 std::cout << "我是⼀个苹果" << std::endl;
 }
};
class Banana : public Fruit {
 public:
 Banana() {}
 virtual void show() {
 std::cout << "我是⼀个⾹蕉" << std::endl;
 }
};
class FruitFactory {
 public:
 static std::shared_ptr<Fruit> create(const std::string &name) {
 if (name == "苹果") {
 return std::make_shared<Apple>();
 }else if(name == "⾹蕉") {
 return std::make_shared<Banana>();
 }
 return std::shared_ptr<Fruit>();
 }
};
int main()
{
 std::shared_ptr<Fruit> fruit = FruitFactory::create("苹果");
 fruit->show();
 fruit = FruitFactory::create("⾹蕉");
 fruit->show();
 return 0;
}

这个模式的结构和管理产品对象的⽅式⼗分简单, 但是它的扩展性⾮常差,当我们需要新增产品的时候,就需要去修改⼯⼚类新增⼀个类型的产品创建逻辑,违背了开闭原则。

工厂方法模式

在简单⼯⼚模式下新增多个⼯⼚,多个产品,每个产品对应⼀个⼯⼚。假设现在有
A、B 两种产品,则开两个⼯⼚,⼯⼚ A 负责⽣产产品 A,⼯⼚ B 负责⽣产产品 B,⽤⼾只知道产品
的⼯⼚名,⽽不知道具体的产品信息,⼯⼚不需要再接收客⼾的产品类别,⽽只负责⽣产产品。

#include <iostream>
#include <string>
#include <memory>
//⼯⼚⽅法:定义⼀个创建对象的接⼝,但是由⼦类来决定创建哪种对象,使⽤多个⼯⼚分别⽣产指定
的固定产品
// 优点: 
// 1. 减轻了⼯⼚类的负担,将某类产品的⽣产交给指定的⼯⼚来进⾏
// 2. 开闭原则遵循较好,添加新产品只需要新增产品的⼯⼚即可,不需要修改原先的⼯⼚类
// 缺点:对于某种可以形成⼀组产品族的情况处理较为复杂,需要创建⼤量的⼯⼚类.
class Fruit {
 public:
 Fruit(){}
 virtual void show() = 0;
};
class Apple : public Fruit {
 public:
 Apple() {}
 virtual void show() {
 std::cout << "我是⼀个苹果" << std::endl;
 }
 private:
 std::string _color;
};
class Banana : public Fruit {
 public:
 Banana() {}
 virtual void show() {
 std::cout << "我是⼀个⾹蕉" << std::endl;
 }
};
class FruitFactory {
 public:
 virtual std::shared_ptr<Fruit> create() = 0;
};
class AppleFactory : public FruitFactory {
 public:
 virtual std::shared_ptr<Fruit> create() {
 return std::make_shared<Apple>();
 }
};
class BananaFactory : public FruitFactory {
 public:
 virtual std::shared_ptr<Fruit> create() {
 return std::make_shared<Banana>();
  }
};
int main()
{
 std::shared_ptr<FruitFactory> factory(new AppleFactory());
 fruit = factory->create();
 fruit->show();
 factory.reset(new BananaFactory());
 fruit = factory->create();
 fruit->show();
 return 0;
}

⼯⼚⽅法模式每次增加⼀个产品时,都需要增加⼀个具体产品类和⼯⼚类,这会使得系统中类的个数成倍增加,在⼀定程度上增加了系统的耦合度。

抽象工厂模式

⼯⼚⽅法模式通过引⼊⼯⼚等级结构,解决了简单⼯⼚模式中⼯⼚类职责太重的问题,但由于⼯⼚⽅法模式中的每个⼯⼚只⽣产⼀类产品,可能会导致系统中存在⼤量的⼯⼚类,势必会增加系统的开销。此时,我们可以考虑将⼀些相关的产品组成⼀个产品族(位于不同产品等级结构中功能相关联的产品组成的家族),由同⼀个⼯⼚来统⼀⽣产,这就是抽象⼯⼚模式的基本思想。

#include <iostream>
#include <string>
#include <memory>
//抽象⼯⼚:围绕⼀个超级⼯⼚创建其他⼯⼚。每个⽣成的⼯⼚按照⼯⼚模式提供对象。
// 思想:将⼯⼚抽象成两层,抽象⼯⼚ & 具体⼯⼚⼦类, 在⼯⼚⼦类种⽣产不同类型的⼦产品
class Fruit {
 public:
 Fruit(){}
 virtual void show() = 0;
};
class Apple : public Fruit {
 public:
 Apple() {}
 virtual void show() {
 std::cout << "我是⼀个苹果" << std::endl;
 }
 private:
 std::string _color;
};
class Banana : public Fruit {
 public:
 Banana() {}
 virtual void show() {
 std::cout << "我是⼀个⾹蕉" << std::endl;
 }
};
class Animal {
 public:
 virtual void voice() = 0;
};
class Lamp: public Animal {
 public:
 void voice() { std::cout << "咩咩咩\n"; }
};
class Dog: public Animal {
 public:
 void voice() { std::cout << "汪汪汪\n"; }
};
class Factory {
 public:
 virtual std::shared_ptr<Fruit> getFruit(const std::string &name) = 0;
 virtual std::shared_ptr<Animal> getAnimal(const std::string &name) = 0;
};
class FruitFactory : public Factory {
 public:
 virtual std::shared_ptr<Animal> getAnimal(const std::string &name) {
 return std::shared_ptr<Animal>();
 }
 virtual std::shared_ptr<Fruit> getFruit(const std::string &name) {
 if (name == "苹果") {
 return std::make_shared<Apple>();
 }else if(name == "⾹蕉") {
 return std::make_shared<Banana>();
 }
 return std::shared_ptr<Fruit>();
 }
};
class AnimalFactory : public Factory {
 
 public:
 virtual std::shared_ptr<Fruit> getFruit(const std::string &name) {
 return std::shared_ptr<Fruit>();
 }
 virtual std::shared_ptr<Animal> getAnimal(const std::string &name) {
 if (name == "⼩⽺") {
 return std::make_shared<Lamp>();
 }else if(name == "⼩狗") {
 return std::make_shared<Dog>();
 }
 return std::shared_ptr<Animal>();
 }
};
class FactoryProducer {
 public:
 static std::shared_ptr<Factory> getFactory(const std::string &name) {
 if (name == "动物") {
 return std::make_shared<AnimalFactory>();
 }else {
 return std::make_shared<FruitFactory>();
 }
 }
};
int main()
{
 std::shared_ptr<Factory> fruit_factory = FactoryProducer::getFactory("⽔
果");
 std::shared_ptr<Fruit> fruit = fruit_factory->getFruit("苹果");
 fruit->show();
 fruit = fruit_factory->getFruit("⾹蕉");
 fruit->show();
 std::shared_ptr<Factory> animal_factory = FactoryProducer::getFactory("动
物");
 std::shared_ptr<Animal> animal = animal_factory->getAnimal("⼩⽺");
 animal->voice();
 animal = animal_factory->getAnimal("⼩狗");
 animal->voice();
 return 0;
}

抽象⼯⼚模式适⽤于⽣产多个⼯⼚系列产品衍⽣的设计模式,增加新的产品等级结构复杂,需要对原有系统进⾏较⼤的修改,甚⾄需要修改抽象层代码,违背了“开闭原则”。

建造者模式

建造者模式是⼀种创建型设计模式, 使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象,能够将⼀个复杂的对象的构建与它的表⽰分离,提供⼀种创建对象的最佳⽅式。主要⽤于解决对象的构建过于复杂的问题

建造者模式主要基于四个核⼼类实现:
• 抽象产品类:
• 具体产品类:⼀个具体的产品对象类
• 抽象Builder类:创建⼀个产品对象所需的各个部件的抽象接⼝
• 具体产品的Builder类:实现抽象接⼝,构建各个部件
• 指挥者Director类:统⼀组建过程,提供给调⽤者使⽤,通过指挥者来构造产品

#include<iostream>
#include<string>
#include<memory>


class Computer//抽象电脑类
{
    public:
        Computer(){}
        void SetBoard(const std::string& Board)
        {
            _board=Board;
        }

        void SetDisplay(const std::string& Display)
        {
            _display=Display;
        }

       virtual void SetOs()=0;

       void showParamaters()
       {
            std::string param="Computer Paramaters:\n";
            param+="\tBoard:"+_board+"\n";
            param+="\tDisplay:"+_display+"\n";
            param+="\tOs:"+_os+"\n";
            std::cout<<param<<std::endl;
       }
    protected:
        std::string _board;//主板
        std::string _display;//显示器
        std::string _os;//操作系统
};


class MacBook:public Computer//具体电脑类
{
    public:    
        void SetOs() override
        {
            _os="Mac Os x12";
        }
};


class Builder//抽象建造者类
{
    public:  
        virtual void buildBoard(const std::string& board)=0;
       
        virtual void buildDisplay(const std::string& display)=0;

        virtual void buildOs()=0;

        virtual std::shared_ptr<Computer> Build()=0;
};


class MacBookBuilder:public Builder//具体建造者类
{
    public:
        MacBookBuilder():_computer(new MacBook()){}
        void buildBoard(const std::string& board)
        {
            _computer->SetBoard(board);
        }

        void buildDisplay(const std::string& display)
        {
            _computer->SetDisplay(display);
        }

        virtual void buildOs()
        {
            _computer->SetOs();
        }

        std::shared_ptr<Computer> Build()
        {
            return _computer;
        }

    private:
        std::shared_ptr<Computer> _computer;//利用多态
};

class Director//指挥者,产品必须按照某种顺序来生产
{
    public:
        Director(Builder* builder):_builder(builder){}

        void construct(const std::string& board,const std::string& display)
        {
            //按顺序建造
            _builder->buildBoard(board);
            _builder->buildDisplay(display);
            _builder->buildOs();
        }
    private:
        std::shared_ptr<Builder> _builder;


};





int main()
{
    Builder* builder=new MacBookBuilder();
    std::unique_ptr<Director> director(new Director(builder));
    director->construct("英特尔","三星");
    std::shared_ptr<Computer> computer=builder->Build();

    computer->showParamaters();

    return 0;
}

代理模式

代理模式指代理控制对其他对象的访问, 也就是代理对象控制对原对象的引⽤。在某些情况下,⼀个对象不适合或者不能直接被引⽤访问,⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。
代理模式的结构包括⼀个是真正的你要访问的对象(⽬标类)、⼀个是代理对象。⽬标对象与代理对象实现同⼀个接⼝,先访问代理类再通过代理类访问⽬标对象。

代理模式分为静态代理、动态代理:

静态代理指的是,在编译时就已经确定好了代理类和被代理类的关系。也就是说,在编译时就已经确定了代理类要代理的是哪个被代理类。
动态代理指的是,在运⾏时才动态⽣成代理类,并将其与被代理类绑定。这意味着,在运⾏时才能确定代理类要代理的是哪个被代理类。

以租房为例,房东将房⼦租出去,但是要租房⼦出去,需要发布招租启⽰, 带⼈看房,负责维修,这些⼯作中有些操作并⾮房东能完成,因此房东为了图省事,将房⼦委托给中介进⾏租赁。 代理模式实现:

/*房东要把⼀个房⼦通过中介租出去理解代理模式*/
#include <iostream>
#include <string>
class RentHouse {
 public:
 virtual void rentHouse() = 0;
};
/*房东类:将房⼦租出去*/
class Landlord : public RentHouse {
 public: 
 void rentHouse() {
 std::cout << "将房⼦租出去\n";
 }
};
/*中介代理类:对租房⼦进⾏功能加强,实现租房以外的其他功能*/
class Intermediary : public RentHouse {
public:
 void rentHouse() {
 std::cout << "发布招租启⽰\n";
 std::cout << "带⼈看房\n";
 _landlord.rentHouse();
 std::cout << "负责租后维修\n";
 }
 private:
 Landlord _landlord;
};
int main()
{
 Intermediary intermediary;
 intermediary.rentHouse();
 return 0;
}
  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
易优企业官网系统是一款开源的THinkphp5.0 的 Blog系统,其衍生于优秀的内容管理系统易优cms。 易优企业官网系统秉承了易优CMS的先进设计理念,并且专注于企业。 易优企业官网系统特点: 简单方便 易优企业官网系统安装十分方便,只需输入域名,然后再点次鼠标,期间填入一些必要的安装信息就可以轻松完成整个安装过程。 使用十分便捷,安装后进后台,无需事先进行任何设置操作。 要进行网站设置也十分简单,几分钟就可以完成。 易优企业官网系统功能介绍: 1、会员系统 2、支付功能 3、标签功能 4、熊掌号提交功能 5、文章发布功能 6、SEO设置功能 7、多语言版(后台一键开启) 8、插件功能 9、多语言功能 10、水印功能 易优企业官网系统安装环境要求: 操作系统:Linux/Unix/Windows 软件环境:Apache/Nginx/IIS + PHP 5.5~7.1 + MySQL 5.1 及以上 本地电脑推荐使用PHPstudy安装,及安装在合适的网站空间、虚拟主机上。 默认后台 域名/login.php 易优企业官网系统更新日志: 1、[安全]修复已知存在的安全漏洞; 2、[新增]广告位置的多种类型,适用于片碎化管理; 3、[新增]批量新增Tag标签的功能; 4、[新增]发布/编辑视频文档时,支持批量导入视频链接的功能; 5、[新增]内置腾讯云COS对象存储的逻辑,可以安装COS插件使用; 6、[新增]内置升级模式,可选择升级新版本,也可选择只升级安全补丁; 7、[新增]整点秒杀、优惠券(仅限于可视化商城小程序插件内使用); 8、[新增]商品评价功能,请参考comment标签手册(仅限于专业版商业授权); 9、[新增]商城退换货售后处理(仅限于专业版商业授权); 10、[新增]内置问答悬赏模型(仅限于专业版商业授权); 11、[优化]后台更多功能加入到管理员权限控制里; 12、[优化]tag列表页不存在的URL直接显示404; 13、[优化]后台会员列表支持用户名或昵称搜索; 14、[优化]前台列表页调用arclist标签后,不会生成多余的分页静态文件; 15、[优化]管理员可以预览待审核稿件的逻辑,保护内容隐私被盗取; 16、[优化]插件内置升级前后置方法,便于更好的插件在线升级; 17、[优化]后台更多功能新增通知管理入口; 18、[优化]后台栏目支持上级移动,栏目保持最多3级的逻辑; 19、[优化]后台商品规格的规格值支持是否同步更新; 20、[优化]多图上传的用户体验; 21、[优化]广告管理逻辑体验; 22、[修复]在IE系列浏览器中,会员升级支付无法进行; 23、[修复]样式影响了留言导出按钮被隐藏; 24、[修复]微站点开启之后,手机端会员中心无法退出的问题; 25、[修复]回收站还原文档报错的问题; 26、[修复]视频模型发布文档时不显示编辑器的问题; 27、[修复]部分前台模板的手机端收藏弹窗的兼容性; 28、[修复]后台编辑会员时,没有邮箱或手机属性时报错; 29、[修复]微信支付支持异步回调,确保用户行为中断不影响业务自动处理; 30、[修复]后台站内信通知删除报错的问题; 31、[修复]做了一些已知问题的修正和完善;
建筑设计行业绿色风格整站源码是一款开源的THinkphp5.0 的 Blog系统,其衍生于优秀的内容管理系统易优cms。 建筑设计行业绿色风格整站源码秉承了易优CMS的先进设计理念,并且专注于旧物回收。 建筑设计行业绿色风格整站源码使用十分便捷,便捷到您只需直接开始发布旧物回收就可以了。  建筑设计行业绿色风格整站源码特点: 简单方便 建筑设计行业绿色风格整站源码安装十分方便,只需输入域名,然后再点次鼠标,期间填入一些必要的安装信息就可以轻松完成整个安装过程。 使用十分便捷,安装后进后台,直接写旧物回收内容就可以了,无需事先进行任何设置操作。 要进行网站设置也十分简单,几分钟就可以完成。 建筑设计行业绿色风格整站源码功能介绍: 1、会员系统 2、支付功能 3、标签功能 4、熊掌号提交功能 5、文章发布功能 6、SEO设置功能 7、多语言版(后台一键开启) 8、插件功能 9、多语言功能 10、水印功能 建筑设计行业绿色风格整站源码安装环境要求: 操作系统:Linux/Unix/Windows 软件环境:Apache/Nginx/IIS + PHP 5.5~7.1 + MySQL 5.1 及以上 本地电脑推荐使用PHPstudy安装,及安装在合适的网站空间、虚拟主机上。 默认后台 域名/login.php 建筑设计行业绿色风格整站源码更新日志: bulid2041 1、[安全]修复已知存在的安全漏洞; 2、[新增]广告位置的多种类型,适用于片碎化管理; 3、[新增]批量新增Tag标签的功能; 4、[新增]发布/编辑视频文档时,支持批量导入视频链接的功能; 5、[新增]内置腾讯云COS对象存储的逻辑,可以安装COS插件使用; 6、[新增]内置升级模式,可选择升级新版本,也可选择只升级安全补丁; 7、[新增]整点秒杀、优惠券(仅限于可视化商城小程序插件内使用); 8、[新增]商品评价功能,请参考comment标签手册(仅限于专业版商业授权); 9、[新增]商城退换货售后处理(仅限于专业版商业授权); 10、[新增]内置问答悬赏模型(仅限于专业版商业授权); 11、[优化]后台更多功能加入到管理员权限控制里; 12、[优化]tag列表页不存在的URL直接显示404; 13、[优化]后台会员列表支持用户名或昵称搜索; 14、[优化]前台列表页调用arclist标签后,不会生成多余的分页静态文件; 15、[优化]管理员可以预览待审核稿件的逻辑,保护内容隐私被盗取; 16、[优化]插件内置升级前后置方法,便于更好的插件在线升级; 17、[优化]后台更多功能新增通知管理入口; 18、[优化]后台栏目支持上级移动,栏目保持最多3级的逻辑; 19、[优化]后台商品规格的规格值支持是否同步更新; 20、[优化]多图上传的用户体验; 21、[优化]广告管理逻辑体验; 22、[修复]在IE系列浏览器中,会员升级支付无法进行; 23、[修复]样式影响了留言导出按钮被隐藏; 24、[修复]微站点开启之后,手机端会员中心无法退出的问题; 25、[修复]回收站还原文档报错的问题; 26、[修复]视频模型发布文档时不显示编辑器的问题; 27、[修复]部分前台模板的手机端收藏弹窗的兼容性; 28、[修复]后台编辑会员时,没有邮箱或手机属性时报错; 29、[修复]微信支付支持异步回调,确保用户行为中断不影响业务自动处理; 30、[修复]后台站内信通知删除报错的问题; 31、[修复]做了一些已知问题的修正和完善;
工业电子元件开源系统是一款开源的THinkphp5.0 的 Blog系统,其衍生于优秀的内容管理系统易优cms。 工业电子元件开源系统秉承了易优CMS的先进设计理念,并且专注于工业。 工业电子元件开源系统特点: 简单方便 工业电子元件开源系统安装十分方便,只需输入域名,然后再点次鼠标,期间填入一些必要的安装信息就可以轻松完成整个安装过程。 使用十分便捷,安装后进后台,无需事先进行任何设置操作。 要进行网站设置也十分简单,几分钟就可以完成。 工业电子元件开源系统功能介绍: 1、会员系统 2、支付功能 3、标签功能 4、熊掌号提交功能 5、文章发布功能 6、SEO设置功能 7、多语言版(后台一键开启) 8、插件功能 9、多语言功能 10、水印功能 工业电子元件开源系统安装环境要求: 操作系统:Linux/Unix/Windows 软件环境:Apache/Nginx/IIS + PHP 5.5~7.1 + MySQL 5.1 及以上 本地电脑推荐使用PHPstudy安装,及安装在合适的网站空间、虚拟主机上。 默认后台 域名/login.php 工业电子元件开源系统更新日志: 1、[安全]修复已知存在的安全漏洞; 2、[新增]广告位置的多种类型,适用于片碎化管理; 3、[新增]批量新增Tag标签的功能; 4、[新增]发布/编辑视频文档时,支持批量导入视频链接的功能; 5、[新增]内置腾讯云COS对象存储的逻辑,可以安装COS插件使用; 6、[新增]内置升级模式,可选择升级新版本,也可选择只升级安全补丁; 7、[新增]整点秒杀、优惠券(仅限于可视化商城小程序插件内使用); 8、[新增]商品评价功能,请参考comment标签手册(仅限于专业版商业授权); 9、[新增]商城退换货售后处理(仅限于专业版商业授权); 10、[新增]内置问答悬赏模型(仅限于专业版商业授权); 11、[优化]后台更多功能加入到管理员权限控制里; 12、[优化]tag列表页不存在的URL直接显示404; 13、[优化]后台会员列表支持用户名或昵称搜索; 14、[优化]前台列表页调用arclist标签后,不会生成多余的分页静态文件; 15、[优化]管理员可以预览待审核稿件的逻辑,保护内容隐私被盗取; 16、[优化]插件内置升级前后置方法,便于更好的插件在线升级; 17、[优化]后台更多功能新增通知管理入口; 18、[优化]后台栏目支持上级移动,栏目保持最多3级的逻辑; 19、[优化]后台商品规格的规格值支持是否同步更新; 20、[优化]多图上传的用户体验; 21、[优化]广告管理逻辑体验; 22、[修复]在IE系列浏览器中,会员升级支付无法进行; 23、[修复]样式影响了留言导出按钮被隐藏; 24、[修复]微站点开启之后,手机端会员中心无法退出的问题; 25、[修复]回收站还原文档报错的问题; 26、[修复]视频模型发布文档时不显示编辑器的问题; 27、[修复]部分前台模板的手机端收藏弹窗的兼容性; 28、[修复]后台编辑会员时,没有邮箱或手机属性时报错; 29、[修复]微信支付支持异步回调,确保用户行为中断不影响业务自动处理; 30、[修复]后台站内信通知删除报错的问题; 31、[修复]做了一些已知问题的修正和完善;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值