Fecmall

第 2 位会员

会员
个人信息
  • 加入于 2017-05-31 17:38:45
  • 城市 Qingdao
  • GitHub https://github.com/fecshop
  • 最后登录时间 11天前
  • 签名 净化自己,潜心编码
个人简介
Terry,Fecmall开源产品作者,12年电商经验一线程序员开发者,擅长规划产品,架构设计。
个人成就
  • 发表文章次数 744
  • 发布回复次数 5760
  • 个人主页浏览次数 683
关于Fecshop 产品属性的实战讲解7年前

产品属性是商城里面一个比较复杂和重要的部分,很多商城的功能差异也体现在这里的处理。

magento在这个地方处理的比较优秀,因此fecshop参考的是magento的处理方案。

关于产品数据要两次查询才能获取有没有可优化的空间?7年前

如果想一次查询是可以的,

@fecshop/services/product/ProductMongodb.php 里面有一个方法, 直接查询出来产品数据,不是AR的方式。

/**
     * @property $primaryKey | String 主键
     * @return  array ,和getByPrimaryKey()的不同在于,该方式不走active record,因此可以获取产品的所有数据的。
     */
    public function apiGetByPrimaryKey($primaryKey)
    {
        $collection = $this->_productModel->find()->getCollection();
        $cursor = $collection->findOne(['_id' => $primaryKey]);
        $arr = [];
        foreach ($cursor as $k => $v) {
            $arr[$k] = $v;
        }

        return $arr;
    }

这种方式失去了AR的开发便利性。

关于产品数据要两次查询才能获取有没有可优化的空间?7年前

1.如果使用active recode 的方式,我没有找到可以一次查询的方式,原因如下:

1.1 AR方式,因为需要得到对象的各个attributes,对应到数据库表的各个字段,对于mysql的AR是先查询表结构,然后得到各个attributes,然后在进行下一步的查询,对于mongodb是没有表结构的,所以只能在AR里面通过方法定义,譬如: @fecshop/models/mongodb/Product.php方法中的 public function attributes()方法。

1.2 对于产品数据,引入了属性组的概念,不同的属性组对应的属性不同,因此,对于attributes()方法,是由两部分组成,默认定义的属性和动态引入的属性合并起来。也就是

Yii::$service->product->addGroupAttrs($attr_group);

执行后会设置$_customProductAttrs,进而将属性添加到AR中,代码如下:

/**
     * mongodb是没有表结构的,因此不能像mysql那样取出来表结构的字段作为model的属性
     * 因此,需要自己定义model的属性,下面的方法就是这个作用
     */
    public function attributes()
    {
        $origin = [
            '_id',
            'name',
            'spu',
            'sku',
            'weight',
            'score',
            'status',
            'qty',
            'min_sales_qty',
            'is_in_stock',
            'visibility',
            'url_key',
            //'url_path',
            'category',
            'price',
            'cost_price',
            'special_price',
            'special_from',
            'special_to',
            'tier_price',
            'final_price',   // 算出来的最终价格。这个通过脚本赋值。
            'new_product_from',
            'new_product_to',
            'freeshipping',
            'featured',
            'upc',
            'meta_title',
            'meta_keywords',
            'meta_description',
            'image',
            'sell_7_count',
            'sell_30_count',
            'sell_90_count',
            'description',
            'short_description',
            'custom_option',
            'remark',
            'created_at',
            'updated_at',
            'created_user_id',
            'attr_group',
            'reviw_rate_star_average',    //评论平均评分
            'review_count',                    //评论总数
            'reviw_rate_star_average_lang', //(语言)评论平均评分
            'review_count_lang',            //(语言)评论总数
            'favorite_count',                // 产品被收藏的次数。
            'relation_sku',            // 相关产品
            'buy_also_buy_sku',        // 买了的还买了什么
            'see_also_see_sku',        // 看了的还看了什么

        ];
        if (is_array(self::$_customProductAttrs) && !empty(self::$_customProductAttrs)) {
            $origin = array_merge($origin, self::$_customProductAttrs);
        }

        return $origin;
    }

因此对于使用AR的方式,我没有找到省略一次查询的方法,因为必须先经过第一次查询得到属性组,

2.如果不使用AR,是可以的,直接查出来就行,但是AR的很多便利性就不能用了。

3.mongodb的并发查询非常优秀,按照主键查2次并不会带来太大的问题,最后折中的方案,就是您上面贴的代码,消耗一次查询带来开发的遍历性

4.产品页面,分类页面,一般要做整页缓存,动态数据用ajax加载,因此产品页面的两次查询的次数又被削弱

最后,如果您找到好的方式,就贴一下代码,一起学习

为何不提供git clone 安装方式7年前

1.composer 就可以拉取,使用的github的版本数据源,里面有版本信息。

2.一个系统除了需要fecshop本身的代码,还需要yii2框架,还需要其他很多的库包,这个都在composer中通过包依赖的方式加载过来,这个和centos里面的yum安装类似,如果还不懂,自己查资料吧,composer在线包依赖安装的方式,让我们告别了下载各种库包,然后上传,然后还要解决包冲突的问题。

3.建议无效,多去学习

fecshop 怎么部署到线上啊? lnmp环境7年前

@shiyongzhe88 #8楼 在linux安装教程中,涉及到的安装的php,php的扩展,redis,mongodb,mysql,nginx,等安装好即可。

在windows mac linux下面安装都是可以的

不过对于后台的脚本,目前只写了linux下执行的shell命令行脚本,其他的操作系统没有写,自己需要自己调整了。

还是建议用linux,我目前的开发测试都是在linux 下面进行的

数据库四表树状关联7年前
$db = Yii::$app->db;
$sql = ''; // 这里写你的mysql的join sql。
$data = []; // 这里是sql中出现的  :xx 等进行替换的值,如果你的sql是纯字符串,那么这里为空
$result = $db->createCommand($sql,$data)->queryAll();

数据库四表树状关联7年前

我对Yii2框架封装的join了解不深,我几乎没有用过,因为被magento的join伤的太深。

我一般用多次in查询来解决这类问题,当然,如果多字段排序,而且这几个用于排序的字段存在于多个个表中,就只能用join了

用sql写个多表查询的sql语句,然后用yii2执行sql,也能出来结果的。

不使用vagrant来管理可以7年前

Fecshop交流qq群 (入群验证:fecshop): 186604851

有问题在这里发帖就行。

不使用vagrant来管理可以7年前

只不过我没有教程在windows下安装redis,mongo,mysql等,群里面有在windows下安装的

不使用vagrant来管理可以7年前

没有影响的,windows都可以安装fecshop的,只不过我没有教程安装redis,mongo,mysql等

【置顶】Fecmall 线上项目案例7年前

好的,有问题直接在这里发帖就行。

配置的第一步 ,配置 fecshop app advanced,找不着main-local.php文件7年前

文件搞下来之后需要执行init http://www.fecshop.com/doc/fecshop-guide/develop/cn-1.0/guide-fecshop-about-hand-install.html#2

cd fecshop   
./init

你肯定是init没有执行,或者没有执行成功

请教一下高级模板中environments的使用7年前

另外,在文件 /environments/index.php中,你会注意到这里配置

'setCookieValidationKey' => [
            'appadmin/config/main-local.php',
            'appapi/config/main-local.php',
            'appfront/config/main-local.php',
            'apphtml5/config/main-local.php',
            'appserver/config/main-local.php',
        ]

打开 appfront/config/main-local.php,你会发现如下:

<?php

$config = [
	'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'FoOwzm-NS4xrnCPaCEhUP0QYOmnAdHjL',
        ],
		'redis' => [
            'database' => '3',
        ],
    ],
];

执行init 命令,会设置这里 cookieValidationKey的值,这样任何人安装yii2,他们的 cookieValidationKey,是不相同的,这样cookie也肯定不一样,增强安全性。

这个操作的代码,是在init文件里面可以找到下面的代码:


function setCookieValidationKey($root, $paths)
{
    foreach ($paths as $file) {
        echo "   generate cookie validation key in $file\n";
        $file = $root . '/' . $file;
        $length = 32;
        $bytes = openssl_random_pseudo_bytes($length);
        $key = strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.');
        $content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($file));
        file_put_contents($file, $content);
    }
}

就是这个函数生成cookiekey然后保存到相应文件里面的

请教一下高级模板中environments的使用7年前

在fecshop安装的时候,使用文档: http://www.fecshop.com/doc/fecshop-guide/develop/cn-1.0/guide-fecshop-about-hand-install.html#2

cd fecshop   
./init

会执行./init

打开init文件你会看到

if (!extension_loaded('openssl')) {
    die('The OpenSSL PHP extension is required by Yii2.');
}

$params = getParams();
$root = str_replace('\\', '/', __DIR__);
$envs = require("$root/environments/index.php");
$envNames = array_keys($envs);
...

/environments/index.php

这个文件里面就是要复制的文件的配置,里面的 Development 是开发环境的文件,Production是生产环境的文件,也就是把这个配置数组里面的文件,按照逻辑复制到相应的app入口下面,详细看代码,一点一点的捋。

在执行./init命令的时候,会让你输入prod 还是develop(用数字1,2标示),如果是prod,复制的就是Development的文件,如果是develop,复制的就是Production的文件。

Yii部署流程7年前

appfront,apphtml5,appadmin之类的是独立的。但实际发现还是有不少存在混杂引用,有耦合嫌疑

回复:请找出来appfront中有引用apphtml5或者其他入口的代码,哪里存在混杂引用!

Yii部署流程7年前

但实际发现还是有不少存在混杂引用,有耦合嫌疑。要拆分部署就要大幅改动入口项目。我在做docker化的时候发现即便做出来分享出来也没多大用,每个人情况都不一样。现在是揉在一起部署,吓跑不少小白用户。拆开应该会逻辑清晰,有利简化部署

回复:

1.不要空说,上代码举例说明你具体的意思。

2.fecshop的servcies是一个结构层,不是微服务化的那个服务,别搞混。

3.你理解的小白是什么层面,解释一下,看不懂

4.给予详细的方案,代码举例解释你的思路

5.升级是不会改变配置文件的,因为升级只会更改vendor下面的文件,本地的配置文件不会更改,本地的配置文件在初始化的时候会覆盖fecshop的配置文件,从而达到重写的目的

Yii部署流程7年前

现在的实现思路肯定会存在某些问题,fecshop也是有很大的工作量在里面,fecshop开发到现在2年之久,没有一分投资,也没有经济收入,别总是抱着完美的态度去看待,用残缺的眼光健全的心态来把这个东西优化好,比理论聊这些更好,本人想抛砖引玉,让更多的人来使用优化,给程序员一个高起点,不管如何,现在是一个可以跑起来的程序,也达到了我当时设计fecshop的初衷,至少满足了我当时的期望,当然,fecshop也会存在这样那样的问题,这样那样的缺陷,在你没有能力提出更好的方式替代现在的代码之前,那么,目前的方式就是最好的。

感觉哪里存在问题,或者不爽的地方,先自己想明白了,是否有可以替代目前的方式的更好方式,然后直接上代码。

Yii部署流程7年前

1.想扔到数据库里面管理配置,可以自己二开去扔,别什么都想fecshop都开发好,做点代码贡献。

2.基于什么原理用配置文件,那么我想反问,基于什么原理,不用配置文件呢?

3.就用linux shell ,本人没有那么多精力兼顾那么多东西,其他的自己二开,fecshop不是一个商业产品,提供一个基础的开源框架,缺什么东西,自己二开,想提什么意见,直接show your code,不想空谈一些纯理论的东西,你感觉xxx比较好,你可以按照你的路子实现,直接展示你的代码。

4.其他的不用说,有建议,直接上你建议的代码,本人不想空谈。另外别把自己的个人需求当成全部人的需求,别把一个开源框架的产品当成一个拿过来直接用的产品。

一句话,有问题就发帖,有建议就上你的php代码。

Yii部署流程7年前

@renothing #13楼 常用的配置扔到数据库里面,然后初始化的时候从数据库加载过来,然后和config文件的配置合并。

这个没做,可以根据自己的需求,自己二开一下。

Your Site Analytics