会员服务3-3_Lib

这篇博客记录了会员服务开发中的库使用经验,包括锁屏解屏时的生命周期管理、异常处理、资源文件命名规范、自定义ActionBar、TabLayout的使用细节以及Fragment与TabLayout的交互。重点探讨了如何在不同场景下正确操作和优化应用行为。

这是记录会员服务开发时的一些Lib,仅供再次翻阅。

1.锁屏,解屏时的生命周期

在做指纹解锁时,需要判定当前的屏幕状态是不是锁屏。
按照我的理解,指纹解锁应该是传感器,使用它需要获取Authenticate。当锁屏的状态下,需要两次指纹解锁,锁屏到开屏时的指纹解锁,以及我们程序的指纹解锁。但是如果这个Authenticate被系统获取,那么软件中需要重新获取;如果Authenticate被软件获取,系统就不能用指纹开锁。所以监听了屏幕状态,在锁屏时释放Authenticate,解屏时获取Authenticate。

关于锁屏解屏时的生命周期可看这篇文章:关于锁屏和回到桌面的activity生命周期的疑问

在onPause() 和 onResume() 方法中分别释放Authenticate和获取Authenticate。

2.异常

异常信息:Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
错误原因:在adapter中设计点击Intent跳转activity事件,传入的Context不是activity的context
解决办法:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

FLAG_ACTIVITY_NEW_TASK:默认的跳转类型,它会重新创建一个新的Activity,不过与这种情况,比如说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在AndroidManifest.xml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity。如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.

3.tips

一个项目,有很多module,或者lib,或者aar引用,记得使用的资源文件名,特别是layout,mipmap,drawable文件名,不要重名。

否则就会出现,多module时,依赖包加载的仍是主module的资源

4.actionBar相关

actionBar有一个setCustomView( int layoutId )函数,用于自定义actionbar样式。注意下高度和侧边。

5.tablayout

( 1 ) 改变选中不同tab时的背景颜色

tablayout改变字体颜色倒是方便,动态改变背景颜色确实有点麻烦

首先定义一个drawable

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/mem_tab_select" android:state_selected="true" />
    <item android:drawable="@drawable/mem_tab_unselect" android:state_focused="false" android:state_selected="false" />
</selector>

其次,定义drawable/mem_tab_select

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#0b0b0c" />
</shape>

其次,在style文件中设置以下格式:

<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
        <item name="tabBackground">@drawable/mem_tab_bg</item>
        <item name="tabIndicatorHeight">0dp</item>
    </style>

最后,代码中setupWithViewPager后,执行以下方法:

  for (int i = 0; i < titles.length; i++) {
            tab.getTabAt(i).setText(titles[i]);
        }

        for (int i = 0; i < tab.getTabCount(); i++) {
            TabLayout.Tab tabLittle = this.tab.getTabAt(i);
            if (tabLittle != null) {
                tabLittle.setCustomView(getTabView(i));
            }
        }

上面代码片中的getTabView()方法如下:

 private View getTabView(int pos) {

        View view = LayoutInflater.from(HomeMainActivity.this).inflate(R.layout.mem_tab, null);
        TextView tv = ((TextView) view.findViewById(R.id.mem_tab_txt));
        tv.setText(titles[pos]);
        ImageView image = ((ImageView) view.findViewById(R.id.mem_tab_pic));
        image.setImageDrawable(drawable);
        return view;
    }
( 2 ) 在子fragment中获取父activity的控件的问题

首先,父activity定义一个方法

public TabLayout getTab() {
        return tab;
    }

其次,子fragment获取activity(注意判断是否为空以及是否是父activity类型)

if (getActivity() != null && getActivity() instanceof HomeMainActivity) {
            TabLayout tab = ((HomeMainActivity) getActivity()).getTab();
            }
( 3 )子fragment监听tablayout的切换

此处在项目中的需求是,当切换tab后,当前fragment正在播放的音频停止;
由于viewpager中只有三个fragment,viewpager切换fragment的时候不能重走生命周期【重走的话相当于重新加载,那么这个viewpager负担的也太重了】,因此只能从tablayout下手。

tablayout提供了一个回调:addOnTabSelectedListener

tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    if (tab.getPosition() == 2) {
                                            //当前tab(位于第三个的位置)被选中
                                    }
                }

                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                    if (tab.getPosition() == 2) {
                        //选中了其他tab,调用这个回调后切换tab
                }

                @Override
                public void onTabReselected(TabLayout.Tab tab) {

                }
            });

6.tips

(1)在Library文件中不可使用 switch( view.getId() ) 方法
(2)TextView中字段间的行距间距设置:

android:lineSpacingExtra
android:lineSpacingMultiplier
# -*- coding: utf-8 -*- """ 京东高价值客户识别与全链路行为预测系统 作者:李梓翀 李富生 数据来源:京东公开数据(模拟生成) """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime, timedelta import random import time import os from faker import Faker from sklearn.preprocessing import LabelEncoder, StandardScaler from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.cluster import KMeans from sklearn.metrics import (roc_auc_score, precision_score, recall_score, f1_score, mean_absolute_error, roc_curve) from sklearn.decomposition import PCA # -------------------------- # 数据爬取与模拟生成 # -------------------------- def generate_jd_simulation_data(num_users=5000, num_records=50000): """ 模拟生成京东用户行为数据 """ print("开始生成模拟京东数据...") fake = Faker(&#39;zh_CN&#39;) np.random.seed(42) # 创建用户基础数据 users = pd.DataFrame({ &#39;user_id&#39;: [f&#39;U{str(i).zfill(6)}&#39; for i in range(1, num_users+1)], &#39;age&#39;: np.random.randint(18, 65, num_users), &#39;gender&#39;: np.random.choice([&#39;男&#39;, &#39;女&#39;], num_users, p=[0.55, 0.45]), &#39;city&#39;: [fake.city() for _ in range(num_users)], &#39;is_plus_member&#39;: np.random.choice([0, 1], num_users, p=[0.7, 0.3]), &#39;join_date&#39;: [fake.date_between(start_date=&#39;-3y&#39;, end_date=&#39;today&#39;) for _ in range(num_users)] }) # 创建行为数据 behavior_types = [&#39;浏览&#39;, &#39;加购&#39;, &#39;购买&#39;, &#39;评价&#39;, &#39;收藏&#39;] categories = { &#39;家电&#39;: [&#39;冰箱&#39;, &#39;洗衣机&#39;, &#39;空调&#39;, &#39;电视&#39;, &#39;微波炉&#39;], &#39;手机&#39;: [&#39;智能手机&#39;, &#39;配件&#39;, &#39;平板&#39;, &#39;智能手表&#39;], &#39;电脑&#39;: [&#39;笔记本&#39;, &#39;台式机&#39;, &#39;显示器&#39;, &#39;外设&#39;], &#39;数码&#39;: [&#39;相机&#39;, &#39;耳机&#39;, &#39;音箱&#39;, &#39;存储设备&#39;], &#39;家居&#39;: [&#39;家具&#39;, &#39;家纺&#39;, &#39;厨具&#39;, &#39;灯具&#39;] } records = [] for _ in range(num_records): user_id = f&#39;U{str(np.random.randint(1, num_users+1)).zfill(6)}&#39; behavior_time = fake.date_time_between(start_date=&#39;-90d&#39;, end_date=&#39;now&#39;) # 随机选择品类和子类 main_cat = random.choice(list(categories.keys())) sub_cat = random.choice(categories[main_cat]) # 行为类型概率分布 behavior_prob = [0.5, 0.2, 0.15, 0.1, 0.05] behavior_type = np.random.choice(behavior_types, p=behavior_prob) # 订单相关数据 order_amount = 0 if behavior_type == &#39;购买&#39;: # 高价商品概率 if main_cat == &#39;家电&#39; and np.random.random() < 0.3: order_amount = np.random.uniform(3000, 20000) else: order_amount = np.random.uniform(100, 3000) # 促销活动参与 is_promotion = 1 if np.random.random() < 0.4 else 0 # 物流评分 delivery_rating = np.random.randint(3, 6) if behavior_type == &#39;购买&#39; else 0 records.append({ &#39;user_id&#39;: user_id, &#39;behavior_time&#39;: behavior_time, &#39;behavior_type&#39;: behavior_type, &#39;main_category&#39;: main_cat, &#39;sub_category&#39;: sub_cat, &#39;order_amount&#39;: order_amount, &#39;is_promotion&#39;: is_promotion, &#39;delivery_rating&#39;: delivery_rating }) # 创建DataFrame df = pd.DataFrame(records) # 添加未来行为标签(模拟未来3个月行为) print("添加未来行为标签...") user_purchase_future = df[df[&#39;behavior_type&#39;] == &#39;购买&#39;].groupby(&#39;user_id&#39;)[&#39;order_amount&#39;].sum().reset_index() # 修正语法错误:括号匹配 user_purchase_future[&#39;will_buy_high_end&#39;] = np.where( (user_purchase_future[&#39;order_amount&#39;] > 5000) & (np.random.random(len(user_purchase_future)) > 0.3), 1, 0) # PLUS会员续费倾向 - 修正语法错误 plus_users = users[users[&#39;is_plus_member&#39;] == 1][&#39;user_id&#39;].tolist() user_purchase_future[&#39;will_renew_plus&#39;] = np.where( user_purchase_future[&#39;user_id&#39;].isin(plus_users), np.random.choice([0, 1], len(user_purchase_future)), 0) # 合并数据 df = pd.merge(df, users, on=&#39;user_id&#39;, how=&#39;left&#39;) df = pd.merge(df, user_purchase_future[[&#39;user_id&#39;, &#39;will_buy_high_end&#39;, &#39;will_renew_plus&#39;]], on=&#39;user_id&#39;, how=&#39;left&#39;).fillna(0) # 保存数据 os.makedirs(&#39;data&#39;, exist_ok=True) df.to_csv(&#39;data/jd_simulated_data.csv&#39;, index=False) print(f"模拟数据生成完成,共 {len(df)} 条记录,保存至 data/jd_simulated_data.csv") return df # -------------------------- # 数据预处理 # -------------------------- def preprocess_data(df): """数据预处理与特征工程""" print("\n开始数据预处理与特征工程...") # 1. 数据清洗 # 过滤异常订单(金额异常) df = df[df[&#39;order_amount&#39;] <= 50000] # 修复时间戳错误(示例:修复未来时间戳) current_date = datetime.now() df = df[df[&#39;behavior_time&#39;] <= current_date] # 2. 特征工程 - 基础特征 # 计算用户活跃天数(最近90天) active_days = df.groupby(&#39;user_id&#39;)[&#39;behavior_time&#39;].apply( lambda x: x.dt.date.nunique()).reset_index(name=&#39;active_days&#39;) # 促销敏感度(参与促销活动比例) promo_sensitivity = df[df[&#39;is_promotion&#39;] == 1].groupby(&#39;user_id&#39;).size().reset_index(name=&#39;promo_count&#39;) total_actions = df.groupby(&#39;user_id&#39;).size().reset_index(name=&#39;total_actions&#39;) promo_sensitivity = pd.merge(promo_sensitivity, total_actions, on=&#39;user_id&#39;) promo_sensitivity[&#39;promo_sensitivity&#39;] = promo_sensitivity[&#39;promo_count&#39;] / promo_sensitivity[&#39;total_actions&#39;] # 品类浏览集中度 category_concentration = df.groupby([&#39;user_id&#39;, &#39;main_category&#39;]).size().reset_index(name=&#39;category_count&#39;) category_concentration = category_concentration.groupby(&#39;user_id&#39;)[&#39;category_count&#39;].apply( lambda x: (x.max() / x.sum())).reset_index(name=&#39;category_concentration&#39;) # 3. 高价值客户标签定义 high_value_criteria = df.groupby(&#39;user_id&#39;).agg( total_spend=(&#39;order_amount&#39;, &#39;sum&#39;), purchase_count=(&#39;behavior_type&#39;, lambda x: (x == &#39;购买&#39;).sum()), category_count=(&#39;main_category&#39;, &#39;nunique&#39;) ).reset_index() high_value_criteria[&#39;is_high_value&#39;] = np.where( (high_value_criteria[&#39;total_spend&#39;] > 5000) | (high_value_criteria[&#39;purchase_count&#39;] > 8) | (high_value_criteria[&#39;category_count&#39;] >= 3), 1, 0) # 4. 合并特征 features = pd.merge(active_days, promo_sensitivity[[&#39;user_id&#39;, &#39;promo_sensitivity&#39;]], on=&#39;user_id&#39;) features = pd.merge(features, category_concentration, on=&#39;user_id&#39;) features = pd.merge(features, high_value_criteria[[&#39;user_id&#39;, &#39;is_high_value&#39;]], on=&#39;user_id&#39;) # 5. 添加用户基本信息 user_base = df[[&#39;user_id&#39;, &#39;age&#39;, &#39;gender&#39;, &#39;city&#39;, &#39;is_plus_member&#39;, &#39;join_date&#39;]].drop_duplicates() features = pd.merge(features, user_base, on=&#39;user_id&#39;) # 6. 添加时间相关特征 df[&#39;last_activity&#39;] = df.groupby(&#39;user_id&#39;)[&#39;behavior_time&#39;].transform(&#39;max&#39;) features[&#39;last_activity_gap&#39;] = (datetime.now() - features[&#39;join_date&#39;]).dt.days # 7. 添加行为统计特征 behavior_counts = pd.crosstab(df[&#39;user_id&#39;], df[&#39;behavior_type&#39;]).reset_index() features = pd.merge(features, behavior_counts, on=&#39;user_id&#39;) # 8. 品类偏好特征 for cat in [&#39;家电&#39;, &#39;手机&#39;, &#39;电脑&#39;, &#39;数码&#39;, &#39;家居&#39;]: cat_users = df[df[&#39;main_category&#39;] == cat][&#39;user_id&#39;].unique() features[f&#39;prefers_{cat}&#39;] = np.where(features[&#39;user_id&#39;].isin(cat_users), 1, 0) print(f"特征工程完成,共生成 {len(features.columns)} 个特征") return features # -------------------------- # 探索性数据分析 (EDA) # -------------------------- def perform_eda(df, features): """执行探索性数据分析""" print("\n开始探索性数据分析...") # 设置绘图风格 sns.set_style("whitegrid") plt.figure(figsize=(18, 12)) # 1. 用户行为类型分布 plt.subplot(2, 2, 1) behavior_counts = df[&#39;behavior_type&#39;].value_counts() sns.barplot(x=behavior_counts.index, y=behavior_counts.values, palette="viridis") plt.title(&#39;用户行为类型分布&#39;) plt.ylabel(&#39;数量&#39;) # 2. PLUS会员与非会员客单价对比 plt.subplot(2, 2, 2) purchase_df = df[df[&#39;behavior_type&#39;] == &#39;购买&#39;] sns.boxplot(x=&#39;is_plus_member&#39;, y=&#39;order_amount&#39;, data=purchase_df, palette="Set2") plt.title(&#39;PLUS会员 vs 非会员客单价对比&#39;) plt.xlabel(&#39;PLUS会员&#39;) plt.ylabel(&#39;订单金额&#39;) # 3. 物流评分与复购率关系 plt.subplot(2, 2, 3) # 计算复购率 repurchase_users = purchase_df.groupby(&#39;user_id&#39;).filter(lambda x: len(x) > 1)[&#39;user_id&#39;].unique() purchase_df[&#39;is_repurchase&#39;] = purchase_df[&#39;user_id&#39;].isin(repurchase_users).astype(int) # 按物流评分分组计算复购率 delivery_repurchase = purchase_df.groupby(&#39;delivery_rating&#39;)[&#39;is_repurchase&#39;].mean().reset_index() sns.lineplot(x=&#39;delivery_rating&#39;, y=&#39;is_repurchase&#39;, data=delivery_repurchase, marker=&#39;o&#39;, linewidth=2.5, color=&#39;darkorange&#39;) plt.title(&#39;物流评分对复购率的影响&#39;) plt.xlabel(&#39;物流评分&#39;) plt.ylabel(&#39;复购率&#39;) plt.ylim(0, 1) # 4. 高价值客户特征热力图 plt.subplot(2, 2, 4) corr_matrix = features[[&#39;active_days&#39;, &#39;promo_sensitivity&#39;, &#39;category_concentration&#39;, &#39;购买&#39;, &#39;加购&#39;, &#39;is_high_value&#39;]].corr() sns.heatmap(corr_matrix, annot=True, cmap=&#39;coolwarm&#39;, fmt=".2f") plt.title(&#39;行为特征相关性&#39;) plt.tight_layout() plt.savefig(&#39;results/eda_results.png&#39;, dpi=300) plt.show() # 5. 高价值客户人口统计特征 plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) sns.countplot(x=&#39;gender&#39;, hue=&#39;is_high_value&#39;, data=features, palette="Set1") plt.title(&#39;高价值客户性别分布&#39;) plt.xlabel(&#39;性别&#39;) plt.ylabel(&#39;数量&#39;) plt.subplot(1, 2, 2) sns.boxplot(x=&#39;is_high_value&#39;, y=&#39;age&#39;, data=features, palette="Set2") plt.title(&#39;高价值客户年龄分布&#39;) plt.xlabel(&#39;是否高价值客户&#39;) plt.ylabel(&#39;年龄&#39;) plt.tight_layout() plt.savefig(&#39;results/high_value_demographics.png&#39;, dpi=300) plt.show() print("EDA分析完成,结果保存至 results/ 目录") # -------------------------- # 预测模型构建 # -------------------------- def build_prediction_models(features, target_column): """构建预测模型""" print(f"\n构建预测模型: {target_column}") # 1. 数据准备 # 选择特征 model_features = features.drop([&#39;user_id&#39;, &#39;join_date&#39;, &#39;will_buy_high_end&#39;, &#39;will_renew_plus&#39;], axis=1, errors=&#39;ignore&#39;) # 处理分类变量 categorical_cols = [&#39;gender&#39;, &#39;city&#39;] model_features = pd.get_dummies(model_features, columns=categorical_cols, drop_first=True) # 定义目标变量 y = features[target_column] # 2. 划分训练集/测试集 X_train, X_test, y_train, y_test = train_test_split( model_features, y, test_size=0.25, random_state=42, stratify=y) # 3. 模型初始化 models = { &#39;XGBoost&#39;: RandomForestClassifier( n_estimators=150, max_depth=8, min_samples_split=10, class_weight=&#39;balanced&#39;, random_state=42 ), &#39;随机森林&#39;: RandomForestClassifier( n_estimators=150, max_depth=8, min_samples_split=10, class_weight=&#39;balanced&#39;, random_state=42 ), &#39;逻辑回归&#39;: LogisticRegression( max_iter=1000, class_weight=&#39;balanced&#39;, penalty=&#39;l2&#39;, C=0.1, random_state=42, solver=&#39;liblinear&#39; ) } # 4. 模型训练与评估 results = {} feature_importances = {} for name, model in models.items(): print(f"训练 {name} 模型...") start_time = time.time() model.fit(X_train, y_train) train_time = time.time() - start_time # 预测 y_pred = model.predict(X_test) y_proba = model.predict_proba(X_test)[:, 1] if hasattr(model, &#39;predict_proba&#39;) else [0]*len(y_test) # 关键指标计算 auc = roc_auc_score(y_test, y_proba) if len(np.unique(y_test)) > 1 else 0.5 precision = precision_score(y_test, y_pred, zero_division=0) recall = recall_score(y_test, y_pred, zero_division=0) f1 = f1_score(y_test, y_pred, zero_division=0) # 自定义加权MAE(高价商品权重更高) weights = np.where(features.loc[y_test.index, &#39;is_high_value&#39;] == 1, 2.0, 1.0) mae = mean_absolute_error(y_test, y_proba, sample_weight=weights) if len(np.unique(y_test)) > 1 else 0 results[name] = { &#39;AUC&#39;: auc, &#39;精确率&#39;: precision, &#39;召回率&#39;: recall, &#39;F1分数&#39;: f1, &#39;加权MAE&#39;: mae, &#39;训练时间(秒)&#39;: train_time } # 保存重要特征 if hasattr(model, &#39;feature_importances_&#39;): feat_imp = pd.Series(model.feature_importances_, index=X_train.columns) feature_importances[name] = feat_imp.sort_values(ascending=False) # 绘制ROC曲线 if len(np.unique(y_test)) > 1: plt.figure(figsize=(8, 6)) fpr, tpr, _ = roc_curve(y_test, y_proba) plt.plot(fpr, tpr, label=f&#39;{name} (AUC = {auc:.2f})&#39;) plt.plot([0, 1], [0, 1], &#39;k--&#39;) plt.xlabel(&#39;假阳性率&#39;) plt.ylabel(&#39;真阳性率&#39;) plt.title(f&#39;{target_column} ROC曲线&#39;) plt.legend() plt.savefig(f&#39;results/{target_column}_{name}_roc_curve.png&#39;, dpi=300) plt.close() # 5. 特征重要性可视化 for model_name, imp in feature_importances.items(): plt.figure(figsize=(10, 8)) imp.head(15).sort_values().plot(kind=&#39;barh&#39;) plt.title(f&#39;{model_name} - 特征重要性 (Top 15)&#39;) plt.tight_layout() plt.savefig(f&#39;results/{target_column}_{model_name}_feature_importance.png&#39;, dpi=300) plt.close() return results, models # -------------------------- # 客户分群与画像 # -------------------------- def customer_segmentation(features): """客户分群与画像生成""" print("\n进行客户分群...") # 选择特征 cluster_features = features[[ &#39;active_days&#39;, &#39;promo_sensitivity&#39;, &#39;category_concentration&#39;, &#39;浏览&#39;, &#39;加购&#39;, &#39;购买&#39;, &#39;age&#39; ]] # 标准化 scaler = StandardScaler() X_cluster = scaler.fit_transform(cluster_features) # KMeans聚类 kmeans = KMeans(n_clusters=5, random_state=42, n_init=10) features[&#39;cluster&#39;] = kmeans.fit_predict(X_cluster) # 分析群体特征 cluster_profiles = features.groupby(&#39;cluster&#39;).agg({ &#39;active_days&#39;: &#39;mean&#39;, &#39;promo_sensitivity&#39;: &#39;mean&#39;, &#39;category_concentration&#39;: &#39;mean&#39;, &#39;浏览&#39;: &#39;mean&#39;, &#39;加购&#39;: &#39;mean&#39;, &#39;购买&#39;: &#39;mean&#39;, &#39;age&#39;: &#39;mean&#39;, &#39;is_high_value&#39;: &#39;mean&#39;, &#39;will_buy_high_end&#39;: &#39;mean&#39;, &#39;will_renew_plus&#39;: &#39;mean&#39;, &#39;is_plus_member&#39;: &#39;mean&#39; }).reset_index() # 重命名集群 cluster_names = { 0: &#39;低价值观望者&#39;, 1: &#39;高价值忠诚客户&#39;, 2: &#39;年轻活跃用户&#39;, 3: &#39;促销敏感型用户&#39;, 4: &#39;高消费低频用户&#39; } cluster_profiles[&#39;cluster_name&#39;] = cluster_profiles[&#39;cluster&#39;].map(cluster_names) features[&#39;cluster_name&#39;] = features[&#39;cluster&#39;].map(cluster_names) # 可视化 - 群体价值分布 plt.figure(figsize=(10, 6)) sns.barplot(x=&#39;cluster_name&#39;, y=&#39;is_high_value&#39;, data=cluster_profiles, palette="viridis") plt.title(&#39;各客户群体高价值比例&#39;) plt.xlabel(&#39;客户群体&#39;) plt.ylabel(&#39;高价值客户比例&#39;) plt.xticks(rotation=15) plt.tight_layout() plt.savefig(&#39;results/cluster_high_value_distribution.png&#39;, dpi=300) plt.close() # 保存客户画像 cluster_profiles.to_csv(&#39;results/customer_cluster_profiles.csv&#39;, index=False) features.to_csv(&#39;results/customer_segmented_data.csv&#39;, index=False) print("客户分群完成,结果保存至 results/ 目录") return cluster_profiles # -------------------------- # 生成业务报告 # -------------------------- def generate_business_report(cluster_profiles, model_results): """生成业务策略报告""" print("\n生成业务策略报告...") report = """ # 京东高价值客户识别与行为预测分析报告 ## 1. 项目概述 本项目通过分析京东用户行为数据,构建高价值客户识别模型并预测其全链路行为。研究目标包括: - 建立高价值客户评估体系 - 预测高价商品购买概率(家电3C等) - 预测PLUS会员续费倾向 - 提出精准营销策略 ## 2. 关键发现 ### 2.1 高价值客户特征 - 高价值客户占比: {:.1f}% - 高价值客户主要特征: - 活跃天数比普通客户高{:.1f}倍 - 促销敏感度比普通客户高{:.1f}% - 跨品类消费比例比普通客户高{:.1f}倍 ### 2.2 客户群体分析 我们识别出5类典型客户群体: """.format( cluster_profiles[&#39;is_high_value&#39;].mean() * 100, cluster_profiles[cluster_profiles[&#39;is_high_value&#39;] > 0.5][&#39;active_days&#39;].mean() / cluster_profiles[cluster_profiles[&#39;is_high_value&#39;] < 0.3][&#39;active_days&#39;].mean(), (cluster_profiles[cluster_profiles[&#39;is_high_value&#39;] > 0.5][&#39;promo_sensitivity&#39;].mean() - cluster_profiles[cluster_profiles[&#39;is_high_value&#39;] < 0.3][&#39;promo_sensitivity&#39;].mean()) * 100, cluster_profiles[cluster_profiles[&#39;is_high_value&#39;] > 0.5][&#39;category_concentration&#39;].mean() / cluster_profiles[cluster_profiles[&#39;is_high_value&#39;] < 0.3][&#39;category_concentration&#39;].mean() ) for _, row in cluster_profiles.iterrows(): report += "- **{}**: {:.1f}%为高价值客户,平均年龄{:.1f}岁,主要特征:{}\n".format( row[&#39;cluster_name&#39;], row[&#39;is_high_value&#39;] * 100, row[&#39;age&#39;], get_cluster_description(row) ) report += "\n### 2.3 预测模型性能\n" # 高价商品购买预测结果 report += "**高价商品购买预测**:\n" for model, metrics in model_results[&#39;will_buy_high_end&#39;].items(): report += ("- {}: AUC={:.3f}, 精确率={:.3f}, 召回率={:.3f}, " "F1={:.3f}\n").format( model, metrics[&#39;AUC&#39;], metrics[&#39;精确率&#39;], metrics[&#39;召回率&#39;], metrics[&#39;F1分数&#39;]) # PLUS会员续费预测结果 report += "\n**PLUS会员续费预测**:\n" for model, metrics in model_results[&#39;will_renew_plus&#39;].items(): report += ("- {}: AUC={:.3f}, 精确率={:.3f}, 召回率={:.3f}, " "F1={:.3f}\n").format( model, metrics[&#39;AUC&#39;], metrics[&#39;精确率&#39;], metrics[&#39;召回率&#39;], metrics[&#39;F1分数&#39;]) report += """ ## 3. 业务建议 ### 3.1 高价值客户运营策略 - **高价值忠诚客户**: 提供专属客服、优先配送和限量商品访问权限 - **高消费低频用户**: 通过个性化推荐提高购买频率,推送高端新品 - **促销敏感型用户**: 定向发送优惠券和限时促销信息 ### 3.2 PLUS会员增长策略 - 针对高价值客户群体提供专属会员优惠 - 预测有流失风险的会员,提供续费激励 - 为新会员提供首单立减优惠 ### 3.3 家电3C品类增长策略 - 对高价商品潜在购买者提供分期免息服务 - 结合用户浏览行为推送相关配件和延保服务 - 针对跨品类用户提供组合优惠 ## 4. 实施计划 1. 部署预测模型到京东营销系统 2. 开发客户分群运营平台 3. 设计个性化营销活动 4. 建立效果监测指标体系 """ # 保存报告 os.makedirs(&#39;results&#39;, exist_ok=True) with open(&#39;results/business_report.md&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f: f.write(report) print("业务报告生成完成,保存至 results/business_report.md") return report def get_cluster_description(row): """生成客户群体描述""" desc_map = { &#39;低价值观望者&#39;: "浏览多购买少,促销敏感度低", &#39;高价值忠诚客户&#39;: "高活跃、高消费、多品类购买", &#39;年轻活跃用户&#39;: "活跃度高但消费水平中等", &#39;促销敏感型用户&#39;: "对促销活动高度敏感,购买集中在促销期", &#39;高消费低频用户&#39;: "购买频次低但单次消费金额高" } return desc_map.get(row[&#39;cluster_name&#39;], "未知群体") # -------------------------- # 主执行流程 # -------------------------- if __name__ == "__main__": # 创建结果目录 os.makedirs(&#39;data&#39;, exist_ok=True) os.makedirs(&#39;results&#39;, exist_ok=True) # 生成模拟数据 if not os.path.exists(&#39;data/jd_simulated_data.csv&#39;): df = generate_jd_simulation_data() else: df = pd.read_csv(&#39;data/jd_simulated_data.csv&#39;, parse_dates=[&#39;behavior_time&#39;]) print("加载现有模拟数据...") # 预处理与特征工程 features = preprocess_data(df) # 探索性数据分析 perform_eda(df, features) # 构建预测模型 model_results = {} high_end_results, high_end_models = build_prediction_models(features, &#39;will_buy_high_end&#39;) model_results[&#39;will_buy_high_end&#39;] = high_end_results plus_renew_results, plus_models = build_prediction_models(features, &#39;will_renew_plus&#39;) model_results[&#39;will_renew_plus&#39;] = plus_renew_results # 客户分群 cluster_profiles = customer_segmentation(features) # 生成业务报告 report = generate_business_report(cluster_profiles, model_results) print("\n" + "="*50) print("京东高价值客户分析完成!") print("="*50) print("结果文件:") print("- 原始数据: data/jd_simulated_data.csv") print("- 特征数据: results/customer_segmented_data.csv") print("- 客户画像: results/customer_cluster_profiles.csv") print("- 分析报告: results/business_report.md") print("- 可视化图表: results/ 目录下的图片文件") 这段代码报了如下的错误 Cell In[2], line 564 561 print("加载现有模拟数据...") 563 # 预处理与特征工程 --> 564 features = preprocess_data(df) 566 # 探索性数据分析 567 perform_eda(df, features) Cell In[2], line 180 178 # 6. 添加时间相关特征 179 df[&#39;last_activity&#39;] = df.groupby(&#39;user_id&#39;)[&#39;behavior_time&#39;].transform(&#39;max&#39;) --> 180 features[&#39;last_activity_gap&#39;] = (datetime.now() - features[&#39;join_date&#39;]).dt.days 182 # 7. 添加行为统计特征 183 behavior_counts = pd.crosstab(df[&#39;user_id&#39;], df[&#39;behavior_type&#39;]).reset_index() File c:\Users\lzc\anaconda3\envs\lzc\lib\site-packages\pandas\core\ops\common.py:72, in _unpack_zerodim_and_defer.<locals>.new_method(self, other) 68 return NotImplemented 70 other = item_from_zerodim(other) ---> 72 return method(self, other) File c:\Users\lzc\anaconda3\envs\lzc\lib\site-packages\pandas\core\arraylike.py:114, in OpsMixin.__rsub__(self, other) 112 @unpack_zerodim_and_defer("__rsub__") 113 def __rsub__(self, other): --> 114 return self._arith_method(other, roperator.rsub) ... File c:\Users\lzc\anaconda3\envs\lzc\lib\site-packages\pandas\core\roperator.py:15, in rsub(left, right) 14 def rsub(left, right): ---> 15 return right - left TypeError: unsupported operand type(s) for -: &#39;Timestamp&#39; and &#39;datetime.date&#39;这个报错是怎么回事,帮我改进一下
06-04
<?php /** * 鸿宇多用户商城 在线客服聊天系统-前台 * ============================================================================ * 版权所有 2015-2018 鸿宇多用户商城科技有限公司,并保留所有权利。 * 网站地址: http://bbs.hongyuvip.com; * ---------------------------------------------------------------------------- * 仅供学习交流使用,如需商用请购买正版版权。鸿宇不承担任何法律责任。 * 踏踏实实做事,堂堂正正做人。 * ============================================================================ * $Author: 鸿宇多用户商城 $ * $Id: category.php 17217 2015-02-10 06:29:08Z 鸿宇多用户商城 $ */ define(&#39;IN_ECS&#39;, true); require (&#39;includes/init.php&#39;); require (&#39;includes/lib_chat.php&#39;); /* 载入语言文件 */ require_once (ROOT_PATH . &#39;languages/&#39; . $_CFG[&#39;lang&#39;] . &#39;/user.php&#39;); $action = isset($_REQUEST[&#39;act&#39;]) ? trim($_REQUEST[&#39;act&#39;]) : &#39;chat&#39;; /* 检查用户是否已登录 */ if(empty($_SESSION[&#39;user_id&#39;]) && $action != &#39;act_login&#39; && $action != &#39;check_login&#39;) { // $captcha = intval($_CFG[&#39;captcha&#39;]); // if(($captcha & CAPTCHA_LOGIN) && (! ($captcha & CAPTCHA_LOGIN_FAIL) || (($captcha & CAPTCHA_LOGIN_FAIL) && $_SESSION[&#39;login_fail&#39;] > 2)) && gd_version() > 0) // { // $GLOBALS[&#39;smarty&#39;]->assign(&#39;enabled_captcha&#39;, 1); // $GLOBALS[&#39;smarty&#39;]->assign(&#39;rand&#39;, mt_rand()); // } // 如果未登录跳转到登录页面 /** $smarty->assign(&#39;lang&#39;, $_LANG); $smarty->assign(&#39;back_act&#39;, &#39;&#39;); $smarty->assign(&#39;action&#39;, &#39;login&#39;); $smarty->display(&#39;chat_passport.dwt&#39;); **/ show_message(&#39;您还未登录系统,请先登录!&#39;, array(&#39;登录&#39;, &#39;返回上一页&#39;), array(&#39;user.php?act=login&#39;, &#39;index.php&#39;), &#39;info&#39;); return; } //路由 $function_name = &#39;action_&#39; . $action; if(function_exists($function_name)) { call_user_func($function_name); } else { exit(&#39;函数&#39; . $function_name . &#39;不存在&#39;); } /** * 检查用户是否登录 */ function action_check_login() { $is_login = empty($_SESSION[&#39;user_id&#39;]) ? &#39;false&#39; : &#39;true&#39;; exit($is_login); } /** * 处理会员登录 */ function action_act_login () { $user_id = $_SESSION[&#39;user_id&#39;]; $smarty = get_smarty(); $ecs = get_ecs(); $db = get_database(); /* 处理会员的登录 */ $username = isset($_POST[&#39;username&#39;]) ? trim($_POST[&#39;username&#39;]) : &#39;&#39;; $password = isset($_POST[&#39;password&#39;]) ? trim($_POST[&#39;password&#39;]) : &#39;&#39;; $back_act = isset($_POST[&#39;back_act&#39;]) ? trim($_POST[&#39;back_act&#39;]) : &#39;&#39;; $captcha = intval($_CFG[&#39;captcha&#39;]); if(($captcha & CAPTCHA_LOGIN) && (! ($captcha & CAPTCHA_LOGIN_FAIL) || (($captcha & CAPTCHA_LOGIN_FAIL) && $_SESSION[&#39;login_fail&#39;] > 2)) && gd_version() > 0) { if(empty($_POST[&#39;captcha&#39;])) { $smarty->assign(&#39;lang&#39;, $_LANG); $smarty->assign(&#39;action&#39;, &#39;login&#39;); $smarty->assign(&#39;error&#39;, $_LANG[&#39;invalid_captcha&#39;]); $smarty->display(&#39;chat_passport.dwt&#39;); return; } /* 检查验证码 */ include_once (&#39;includes/cls_captcha.php&#39;); $validator = new captcha(); $validator->session_word = &#39;captcha_login&#39;; if(! $validator->check_word($_POST[&#39;captcha&#39;])) { $smarty->assign(&#39;lang&#39;, $_LANG); $smarty->assign(&#39;action&#39;, &#39;login&#39;); $smarty->assign(&#39;error&#39;, $_LANG[&#39;invalid_captcha&#39;]); $smarty->display(&#39;chat_passport.dwt&#39;); return; } } if(is_email($username)) { $sql = "select user_name from " . $ecs->table(&#39;users&#39;) . " where email=&#39;" . $username . "&#39;"; $username_e = $db->getOne($sql); if($username_e) $username = $username_e; } if(is_telephone($username)) { $sql = "select user_name from " . $ecs->table(&#39;users&#39;) . " where mobile_phone=&#39;" . $username . "&#39;"; $username_res = $db->query($sql); $kkk = 0; while($username_row = $db->fetchRow($username_res)) { $username_e = $username_row[&#39;user_name&#39;]; $kkk = $kkk + 1; } if($kkk > 1) { $smarty->assign(&#39;lang&#39;, $_LANG); $smarty->assign(&#39;action&#39;, &#39;login&#39;); $smarty->assign(&#39;error&#39;, &#39;本网站有多个会员ID绑定了和您相同的手机号,请使用其他登录方式,如:邮箱或用户名。&#39;); $smarty->display(&#39;chat_passport.dwt&#39;); return; } if($username_e) { $username = $username_e; } } if($GLOBALS[&#39;user&#39;]->login($username, $password, isset($_POST[&#39;remember&#39;]))) { update_user_info(); recalculate_price(); // 登录成功 $ucdata = isset($user->ucdata) ? $user->ucdata : &#39;&#39;; // show_message($_LANG[&#39;login_success&#39;] . $ucdata , // array($_LANG[&#39;back_up_page&#39;], $_LANG[&#39;profile_lnk&#39;]), // array($back_act,&#39;user.php&#39;), &#39;info&#39;); // 刷新user_id $user_id = $_SESSION[&#39;user_id&#39;]; header(&#39;Location: chat.php?act=chat&#39;); } else { $_SESSION[&#39;login_fail&#39;] ++; $smarty->assign(&#39;lang&#39;, $_LANG); $smarty->assign(&#39;action&#39;, &#39;login&#39;); $smarty->assign(&#39;error&#39;, $_LANG[&#39;login_failure&#39;]); $smarty->display(&#39;chat_passport.dwt&#39;); return; } } /* ------------------------------------------------------ */ // -- 在线客服聊天 --> 请求聊天 // 聊天窗口右侧默认展示最近订单,如果想要展示商品、订单、店铺则需要在当前页面中设置隐藏域,name必须为 chat_goods_id, // chat_order_id, chat_supp_id /* ------------------------------------------------------ */ function action_chat () { $user_id = $_SESSION[&#39;user_id&#39;]; $smarty = get_smarty(); $ecs = get_ecs(); $db = get_database(); /** * 判断当前用户是为聊天系统的注册用户 */ $exist = check_of_username_exist($user_id); // 获取用户头像 if(! empty($user_id)) { $sql = "select password, headimg from " . $ecs->table(&#39;users&#39;) . " where user_id = &#39;$user_id&#39;"; $row = $db->getRow($sql); $headimg = $row[&#39;headimg&#39;]; $password = $row[&#39;password&#39;]; $smarty->assign(&#39;headimg&#39;, $headimg); } if(! $exist) { // 查询ECShop内用户信息 $sql = &#39;select a.user_id, a.password, a.email, a.user_name from &#39; . $ecs->table(&#39;users&#39;) . &#39; AS a where a.user_id = "&#39; . $user_id . &#39;"&#39;; $user = $GLOBALS[&#39;db&#39;]->getRow($sql); if(empty($user)) { // 根据user_id未查找到任何用户信息 } // 用户不存在,创建用户信息 $username = $user_id; $password = $user[&#39;password&#39;]; $name = $user[&#39;user_name&#39;]; $email = $user[&#39;email&#39;]; $type = 10; $shop_id = - 1; // $result = create_of_user($username, $password, $name, $email, $type, $shop_id);(修改前)) $of_password = md5($password); $result = create_of_user($username, $of_password, $name, $email, $type, $shop_id); if($result) { // 创建成功 } else { // 创建失败 } } // 获取前端传来的商品编号、订单编号、店铺编号等 // 商品编号则显示商品信息 // 订单编号则显示订单信息 // 店铺编号则显示店铺信息 $goods_id = null; $supp_id = - 1; $order_id = null; $customers = null; // 获取客服信息 $tab_items = array(); // 客服类型 $cus_types = CUSTOMER_SERVICE; // 记录需要发给客服的URL if(! empty($_REQUEST[&#39;chat_goods_id&#39;])) { /* 咨询商品信息 */ $goods_id = $_REQUEST[&#39;chat_goods_id&#39;]; $goods = goods_info($goods_id); $smarty->assign(&#39;chat_goods&#39;, $goods); $smarty->assign(&#39;chat_goods_id&#39;, $goods_id); $tab_items[] = array( "id" => "chat_goods","name" => "咨询商品" ); // 客服+售前 $cus_types = CUSTOMER_SERVICE . &#39;,&#39; . CUSTOMER_PRE; } if(! empty($_REQUEST[&#39;chat_order_id&#39;])) { /* 咨询订单信息 */ require (&#39;includes/lib_order.php&#39;); $order_id = $_REQUEST[&#39;chat_order_id&#39;]; // 获取商品和店铺信息 $goods_id = null; $order = order_info($order_id); $supp_id = $order[&#39;supplier_id&#39;]; $order[&#39;order_status_text&#39;] = $GLOBALS[&#39;_LANG&#39;][&#39;os&#39;][$order[&#39;order_status&#39;]] . &#39;,&#39; . $GLOBALS[&#39;_LANG&#39;][&#39;ps&#39;][$order[&#39;pay_status&#39;]] . &#39;,&#39; . $GLOBALS[&#39;_LANG&#39;][&#39;ss&#39;][$order[&#39;shipping_status&#39;]]; $order[&#39;goods_list&#39;] = order_goods($order_id); $smarty->assign(&#39;chat_order&#39;, $order); $smarty->assign(&#39;chat_order_id&#39;, $order_id); $smarty->assign(&#39;chat_order_sn&#39;, $order[&#39;order_sn&#39;]); $tab_items[] = array( "id" => "chat_order","name" => "咨询订单" ); // 客服+售后 $cus_types = CUSTOMER_SERVICE . &#39;,&#39; . CUSTOMER_AFTER; } if(! empty($_REQUEST[&#39;chat_supp_id&#39;]) && $_REQUEST[&#39;chat_supp_id&#39;] != 0) { /* 店铺信息 */ $supp_id = $_REQUEST[&#39;chat_supp_id&#39;]; $supp_info = get_dianpu_baseinfo($supp_id); $smarty->assign(&#39;supp_info&#39;, $supp_info); $smarty->assign(&#39;chat_supp_id&#39;, $supp_id); $tab_items[] = array( "id" => "chat_supp", "name" => "店铺信息" ); // 客服+售前 $cus_types = CUSTOMER_SERVICE . &#39;,&#39; . CUSTOMER_PRE; } if(true) { /* 最近订单列表 */ require (&#39;includes/lib_transaction_1.php&#39;); // 获取用户最近的5条订单列表 $order_list = get_user_orders_1($user_id, 5, 0); // 所有客服忙碌状态,提示web端 $smarty->assign(&#39;order_list&#39;, $order_list); $smarty->assign(&#39;order_count&#39;, count($order_list)); $tab_items[] = array( "id" => "chat_order_list","name" => "最近订单" ); // 客服 $cus_types = CUSTOMER_SERVICE; } // 获取客服信息 $customers = get_customers($cus_types, $supp_id); // 转换为JSON数据 $smarty->assign(&#39;tab_items&#39;, json_encode($tab_items)); $to = null; // 客服获取策略:0-顺序、1-随机、2-竞争 if(! empty($customers)) { // 暂时采用随机策略 $poliy = 1; if($poliy == 0) { foreach($customers as $customer) { $status = $customer[&#39;status&#39;]; if($status == &#39;在线&#39; || $status == &#39;空闲&#39;) { $to = $customer; break; // if(isset($customer[&#39;cus_status&#39;]) && count($customers) > 1) // { // if(time() - $customer[&#39;chat_time&#39;] > 5*60) // { // set_customer_status($customer[&#39;cus_id&#39;], 0); // $customer[&#39;cus_status&#39;] = 0; // } // if($customer[&#39;cus_status&#39;] == 0) // { // $to = $customer; // break; // } // } // else // { // $to = $customer; // break; // } } } } else if($poliy == 1) { /* 随进策略 */ $onlines = array(); foreach($customers as $customer) { $status = $customer[&#39;status&#39;]; if($status == &#39;在线&#39; || $status == &#39;空闲&#39;) { $onlines[] = $customer; } } if(count($onlines) > 0) { $min = 1; $max = count($onlines); $i = mt_rand($min, $max); $to = $onlines[$i - 1]; } } else { } if(empty($to)) { if($supp_id == -1){ // 所有客服忙碌状态,提示web端 $smarty->assign(&#39;system_notice&#39;, &#39;当前客服忙碌,请稍后联系!&#39;); }else{ // 所有客服忙碌状态,提示web端 $smarty->assign(&#39;system_notice&#39;, &#39;当前店铺客服忙碌,请稍后联系!&#39;); } } else { $xmpp_domain = get_xmpp_domain(); $_SESSION[&#39;OF_FROM&#39;] = $user_id . &#39;@&#39; . $xmpp_domain; $_SESSION[&#39;OF_TO&#39;] = $to[&#39;of_username&#39;] . &#39;@&#39; . $xmpp_domain; $smarty->assign(&#39;from&#39;, $_SESSION[&#39;OF_FROM&#39;]); $smarty->assign(&#39;password&#39;, $password); // $smarty->assign(&#39;password&#39;, "123456"); // $smarty->assign(&#39;to&#39;, &#39;==to==&#39;); // 传递正确的客服JID给前端 $smarty->assign(&#39;to&#39;, $_SESSION[&#39;OF_TO&#39;]); $smarty->assign(&#39;username&#39;, $_SESSION[&#39;user_name&#39;]); $smarty->assign(&#39;customername&#39;, $to[&#39;cus_name&#39;]); // 存储在Session中方便其他地方使用 // 所有客服忙碌状态,提示web端 $smarty->assign(&#39;system_notice&#39;, &#39;客服<span class="kf_name">&#39; . $to[&#39;cus_name&#39;] . &#39;</span>已加入会话!&#39;); } } else { // 所有客服忙碌状态,提示web端 $smarty->assign(&#39;system_notice&#39;, &#39;当前客服忙碌,请稍后联系!&#39;); } // 打开聊天页面 $smarty->display(&#39;chat.dwt&#39;); } /* ------------------------------------------------------ */ // -- 在线客服聊天 --> 认证失败,重新设置聊天系统的用户密码 // 聊天窗口右侧默认展示最近订单,如果想要展示商品、订单、店铺则需要在当前页面中设置隐藏域,name必须为 chat_goods_id, // chat_order_id, chat_supp_id /* ------------------------------------------------------ */ function action_authfail () { $user_id = $_SESSION[&#39;user_id&#39;]; $sql = "select user_name, password, email from " . $GLOBALS[&#39;ecs&#39;]->table(&#39;users&#39;) . " where user_id = &#39;$user_id&#39;"; $row = $db->getRow($sql); $success = create_of_user($user_id, $row[&#39;password&#39;], $row[&#39;user_name&#39;], $row[&#39;email&#39;], 10, - 1); if($success) { $result = array( &#39;error&#39; => 1,&#39;message&#39; => &#39;可能由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...&#39;,&#39;content&#39; => &#39;&#39; ); } else { $result = array( &#39;error&#39; => 1,&#39;message&#39; => &#39;由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...&#39;,&#39;content&#39; => &#39;&#39; ); } $result = json_encode($result); exit($result); } /** * 用户离线 */ function action_off_line() { // 用户超过5分钟未发言则视为自动离线,更新客服状态 } function is_telephone ($phone) { $chars = "/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$/"; if(preg_match($chars, $phone)) { return true; } } /** * 获取db对象 * * @return unknown */ function get_database () { return $GLOBALS[&#39;db&#39;]; } /** * 获取smarty对象 * * @return unknown */ function get_smarty () { return $GLOBALS[smarty]; } /** * 获取ecs对象 * * @return unknown */ function get_ecs () { return $GLOBALS[&#39;ecs&#39;]; } /* * 获取商品所对应店铺的店铺基本信息 * @param int $suppid 店铺id * @param int $suppinfo 入驻商的信息 */ function get_dianpu_baseinfo ($suppid = 0) { if(intval($suppid) <= 0) { return; } $sql_supplier = "SELECT s.supplier_id,s.supplier_name,s.add_time,sr.rank_name FROM " . $GLOBALS[&#39;ecs&#39;]->table("supplier") . " as s left join " . $GLOBALS[&#39;ecs&#39;]->table("supplier_rank") . " as sr ON s.rank_id=sr.rank_id WHERE s.supplier_id=" . $suppid . " AND s.status=1"; $supp_info = $GLOBALS[&#39;db&#39;]->getRow($sql_supplier); $sql = "SELECT * FROM " . $GLOBALS[&#39;ecs&#39;]->table(&#39;supplier_shop_config&#39;) . " WHERE supplier_id = " . $suppid; $shopinfo = $GLOBALS[&#39;db&#39;]->getAll($sql); $config = array(); foreach($shopinfo as $value) { $config[$value[&#39;code&#39;]] = $value[&#39;value&#39;]; } $shop_info = array(); $shop_info[&#39;ghs_css_path&#39;] = &#39;themes/&#39; . $config[&#39;template&#39;] . &#39;/images/ghs/css/ghs_style.css&#39;; // 入驻商所选模板样式路径 $shoplogo = empty($config[&#39;shop_logo&#39;]) ? &#39;themes/&#39; . $config[&#39;template&#39;] . &#39;/images/dianpu.jpg&#39; : $config[&#39;shop_logo&#39;]; $shop_info[&#39;shoplogo&#39;] = $shoplogo; // 商家logo $shop_info[&#39;shopname&#39;] = htmlspecialchars($config[&#39;shop_name&#39;]); // 店铺名称 $shop_info[&#39;suppid&#39;] = $suppid; // 商家名称 $shop_info[&#39;suppliername&#39;] = htmlspecialchars($supp_info[&#39;supplier_name&#39;]); // 商家名称 $shop_info[&#39;userrank&#39;] = htmlspecialchars($supp_info[&#39;rank_name&#39;]); // 商家等级 $shop_info[&#39;region&#39;] = get_province_city($config[&#39;shop_province&#39;], $config[&#39;shop_city&#39;]); $shop_info[&#39;address&#39;] = $config[&#39;shop_address&#39;]; $shop_info[&#39;serviceqq&#39;] = $config[&#39;qq&#39;]; $shop_info[&#39;serviceww&#39;] = $config[&#39;ww&#39;]; $shop_info[&#39;serviceemail&#39;] = $config[&#39;service_email&#39;]; $shop_info[&#39;servicephone&#39;] = $config[&#39;service_phone&#39;]; $shop_info[&#39;createtime&#39;] = gmdate(&#39;Y-m-d&#39;, $config[&#39;add_time&#39;]); // 商家创建时间 $suppid = (intval($suppid) > 0) ? intval($suppid) : intval($_GET[&#39;suppId&#39;]); return $shop_info; function get_xmpp_domain() { return &#39;yfw.szrengjing.com&#39;; // 替换为你的Openfire服务器域名 } } ?>
11-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值