HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

打包手机端 ali-oss 超过500kb 样式错乱

macOS Catalina

挺常见问题,es6语法没有转换成es5 样式错乱
aliyun-oss-sdk dist完成520kb。。。
解决方案 ali-oss换成4.11

挺常见问题,es6语法没有转换成es5 样式错乱
aliyun-oss-sdk dist完成520kb。。。
解决方案 ali-oss换成4.11

mui升级到uniapp框架旧版本缓存处理兼容新版本

Storage mui uniapp 升级更新

遇到的问题

旧版(mui开发) ID:H53FGS6A
新版(uniapp开发) ID:UNI7B7890D
注意:(我们的程序ID是有变化的,如无变化应该不用这么麻烦操作)
旧版的用户登录信息数据升级到新版时会没有,也就是说升级后新版拿不到旧版的登录信息 这样就需要用户重新登录一次,影响用户体验和使用,所以需要做一个兼容的处理

思路

旧版使用plus.storage.setItem()方法保存的数据,用户更新到新版时,拿到旧版数据然后缓存到新版本对应的位置中
要实现这个过渡,最最主要的是知道旧版的数据保存在哪里 新版的数据保存在哪里
经过一番查找最终实现了新旧版本的无缝切换

操作

Android端

在Android端旧版的plus.storage.setItem()保存的数据是在SP文件中,这个文件在应用包名目录下 比如我们的叫做H53FGS6A_storages.xml;
在Android端新版的plus.storage.setItem()保存的数据是在sqlite数据库中的
但是转移数据时我们不需要操作数据库 更新到最新版的uniapp时 程序会自动把缓存在SP文件中的数据转移到数据库中
所以在Android中做的操作就是把旧的sp数据保存到新的sp文件中,然后程序会自动把新的SP文件数据转移到sqlite数据库中,这样当新版APP打开时就读取到旧版缓存的数据了

Android中新的SP文件叫UNI7B7890_storages.xml

然后再新版APP打开时使用SP工具类转移数据即可 如下图

Android 工具类代码:

/**  
 * SP 更新工具类  之前就旧版(3.4.0之前)缓存保存在 HG88226A_storages.xml文件中  
 *              现在新版(3.5.0之后)改用uniapp  
 */  
public class SPUpdateUtil {  

    private static final String TAG = "SPUpdateUtil";  
    private static final String OLD_SP_FILE_NAME = "HG88226A_storages";  
    private static final String NEW_SP_FILE_NAME = "__UNI__78988302D_storages";  

    /**  
     * 更新SP信息  
     * @param context  
     * 1.拿到旧的sp信息  
     * 2.遍历旧的信息  
     * 3.缓存到新的sp文件中  
     */  
    public static void updateSPInfo(Context context){  
        try {  
            SharedPreferences oldSP = context.getSharedPreferences(OLD_SP_FILE_NAME, Context.MODE_PRIVATE);  

            SharedPreferences newSP = context.getSharedPreferences(NEW_SP_FILE_NAME,Context.MODE_PRIVATE);  

            SharedPreferences.Editor oldEditor = oldSP.edit();  

            SharedPreferences.Editor newEditor = newSP.edit();  

            HashMap<String,Object> oldMap = (HashMap<String, Object>) oldSP.getAll();  

            if (!oldMap.isEmpty()){  
                for (String key : oldMap.keySet()) {  
                    Log.d(TAG,key+": "+oldMap.get(key));  
                    Object object = oldMap.get(key);  
                    if (object instanceof String) {  
                        newEditor.putString(key, (String) object);  
                    } else if (object instanceof Integer) {  
                        newEditor.putInt(key, (Integer) object);  
                    } else if (object instanceof Boolean) {  
                        newEditor.putBoolean(key, (Boolean) object);  
                    } else if (object instanceof Float) {  
                        newEditor.putFloat(key, (Float) object);  
                    } else if (object instanceof Long) {  
                        newEditor.putLong(key, (Long) object);  
                    } else {  
                        newEditor.putString(key, object.toString());  
                    }  
                }  
                //提交数据  
                newEditor.commit();  
                //删除旧数据  
                oldEditor.clear();  
                oldEditor.commit();  
            }  

            //检查数据  
           /* HashMap<String,Object> newMap = (HashMap<String, Object>) newSP.getAll();  
            for (String key : newMap.keySet()) {  
                Log.d("__UNI__78988302D",key+": "+newMap.get(key));  
            }*/  

        } catch (Exception e) {  
            e.printStackTrace();  
        }  

    }  

}

IOS端

IOS端和Android端的思路一样,其中最主要的是找到旧版和新版数据保存的对应位置
在IOS端旧版的plus.storage.setItem()保存的数据是在一个叫做wxstorage.plist文件当中
在IOS端新版的plus.storage.setItem()保存的数据是也是保存在一个叫做wxstorage.plist的文件当中
只是他们所在的文件路径不一样
文件内容如下:

旧版路径:
注意:是在应用沙盒的Documents目录下

新版路径:
注意:是在应用沙盒的Library目录下

然后我们利用工具类把就数据放到新版plist文件中即可 如下图:

IOS 工具类代码
.m文件

/*  
 *版本更新工具类  
 * 之前的mui项目 跟新成uniapp项目  缓存数据位置发生了变化 需要这个工具类吧旧版缓存数据转移过来  
 * 这样旧版更新新版后 不会出现需要用户重新登录等情况  
 */  
#import "UpdateUtil.h"  

@implementation UpdateUtil  

/**  
  转移数据的方法  
 */  
+(void)updateStorageInfo{  
    @try {  
        NSString *oldPlistPath = @"Pandora/apps/H576788FC6A/data/wxstorage/wxstorage.plist";  
        NSString *newPlistDic = @"Pandora/apps/__UNI__78988302D/data/wxstorage/";  
        NSString *newPlistPath = @"Pandora/apps/__UNI__78988302D/data/wxstorage/wxstorage.plist";  

        NSArray *pathDocumentArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
        NSString *pathDocument = [pathDocumentArray objectAtIndex:0];  
        //   /var/mobile/Containers/Data/Application/5817C54A-8C39-4768-A598-EA1357BD785C/Documents  
        NSLog(@"数据保存路径:%@",pathDocument);  

        NSArray *pathLibraryArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);  
        NSString *pathLibrary = [pathLibraryArray objectAtIndex:0];  
        //  /var/mobile/Containers/Data/Application/8789507C-761F-4705-9057-4BBF3E695D3E/Library  
        NSLog(@"数据保存路径:%@",pathLibrary);  

        //旧版数据位置  
        NSString *storageOldFilePath = [pathDocument stringByAppendingPathComponent:oldPlistPath];  
        //读取旧版中的数据 因为已经知道数据保存的是dict  所有使用 NSMutableDictionary来读取  
        NSMutableDictionary *oldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];  
        NSLog(@"旧版数据长度%lu",oldDict.count);  
        if(!oldDict || [oldDict count] == 0){  
            //不需要转移旧数据 这种情况是新版直接安装的情况  
            return;  
        }  
        //新版数据位置  
        NSString *storageNewFilePath = [pathLibrary stringByAppendingPathComponent:newPlistPath];  
        //判断文件是否存在  
        BOOL exist = [[NSFileManager defaultManager] fileExistsAtPath:storageNewFilePath];  
        if (!exist) {  
            //文件不存在  
            //先创建目录  
            NSString *storageNewDirectPath = [pathLibrary stringByAppendingPathComponent:newPlistDic];  
            BOOL dres = [[NSFileManager defaultManager] createDirectoryAtPath:storageNewDirectPath withIntermediateDirectories:YES attributes:nil error:nil];  
            //在创建文件  
            BOOL res = [[NSFileManager defaultManager] createFileAtPath:storageNewFilePath contents:nil attributes:nil];  
            NSLog(@"文件创建结果%@,....%@",dres?@"YES":@"NO",res?@"YES":@"NO");  
        }  
        //读取新版中的数据 如果是首次安装使用 新版中应该还没有数据  
        NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];  
        //如果没有 创建一个新字典  
        if (!newDict) {  
            newDict = [NSMutableDictionary dictionary];  
        }  

        //转移数据  把旧数据放到新的字典中去  
        for (NSString *key in oldDict) {  
            NSString *value = [oldDict valueForKey:key];  
            [newDict setValue:value forKey:key];  
        }  
        NSLog(@"新版数据长度%lu",newDict.count);  

        if([newDict count] > 0){  
            //把新数据设置到文件中  
            BOOL result = [newDict writeToFile:storageNewFilePath atomically:YES];  
            if (result) {  
                NSLog(@"新版数据写入成功");  
            }  
        }  

        //把数据拿出来看下有变化没  
       // NSMutableDictionary *newAndOldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];  
       // NSLog(@"新版数据确认长度%lu",newAndOldDict.count);  
        //清空旧文件中的数据  
        //[oldDict removeAllObjects];  
        NSDictionary *clearDic = [NSDictionary dictionary];  
        BOOL oldResult = [clearDic writeToFile:storageOldFilePath atomically:YES];  
        if (oldResult) {  
            NSLog(@"旧版清空成功");  
        }  
        //NSMutableDictionary *oldoldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];  
       // NSLog(@"旧版数据确认长度%lu",oldoldDict.count);  
    } @catch (NSException *exception) {  
        NSLog(@"程序出错%@",exception);  
    }  
}  

@end  

.h文件

@interface UpdateUtil : NSObject  

+(void)updateStorageInfo;  

@end  
继续阅读 »

遇到的问题

旧版(mui开发) ID:H53FGS6A
新版(uniapp开发) ID:UNI7B7890D
注意:(我们的程序ID是有变化的,如无变化应该不用这么麻烦操作)
旧版的用户登录信息数据升级到新版时会没有,也就是说升级后新版拿不到旧版的登录信息 这样就需要用户重新登录一次,影响用户体验和使用,所以需要做一个兼容的处理

思路

旧版使用plus.storage.setItem()方法保存的数据,用户更新到新版时,拿到旧版数据然后缓存到新版本对应的位置中
要实现这个过渡,最最主要的是知道旧版的数据保存在哪里 新版的数据保存在哪里
经过一番查找最终实现了新旧版本的无缝切换

操作

Android端

在Android端旧版的plus.storage.setItem()保存的数据是在SP文件中,这个文件在应用包名目录下 比如我们的叫做H53FGS6A_storages.xml;
在Android端新版的plus.storage.setItem()保存的数据是在sqlite数据库中的
但是转移数据时我们不需要操作数据库 更新到最新版的uniapp时 程序会自动把缓存在SP文件中的数据转移到数据库中
所以在Android中做的操作就是把旧的sp数据保存到新的sp文件中,然后程序会自动把新的SP文件数据转移到sqlite数据库中,这样当新版APP打开时就读取到旧版缓存的数据了

Android中新的SP文件叫UNI7B7890_storages.xml

然后再新版APP打开时使用SP工具类转移数据即可 如下图

Android 工具类代码:

/**  
 * SP 更新工具类  之前就旧版(3.4.0之前)缓存保存在 HG88226A_storages.xml文件中  
 *              现在新版(3.5.0之后)改用uniapp  
 */  
public class SPUpdateUtil {  

    private static final String TAG = "SPUpdateUtil";  
    private static final String OLD_SP_FILE_NAME = "HG88226A_storages";  
    private static final String NEW_SP_FILE_NAME = "__UNI__78988302D_storages";  

    /**  
     * 更新SP信息  
     * @param context  
     * 1.拿到旧的sp信息  
     * 2.遍历旧的信息  
     * 3.缓存到新的sp文件中  
     */  
    public static void updateSPInfo(Context context){  
        try {  
            SharedPreferences oldSP = context.getSharedPreferences(OLD_SP_FILE_NAME, Context.MODE_PRIVATE);  

            SharedPreferences newSP = context.getSharedPreferences(NEW_SP_FILE_NAME,Context.MODE_PRIVATE);  

            SharedPreferences.Editor oldEditor = oldSP.edit();  

            SharedPreferences.Editor newEditor = newSP.edit();  

            HashMap<String,Object> oldMap = (HashMap<String, Object>) oldSP.getAll();  

            if (!oldMap.isEmpty()){  
                for (String key : oldMap.keySet()) {  
                    Log.d(TAG,key+": "+oldMap.get(key));  
                    Object object = oldMap.get(key);  
                    if (object instanceof String) {  
                        newEditor.putString(key, (String) object);  
                    } else if (object instanceof Integer) {  
                        newEditor.putInt(key, (Integer) object);  
                    } else if (object instanceof Boolean) {  
                        newEditor.putBoolean(key, (Boolean) object);  
                    } else if (object instanceof Float) {  
                        newEditor.putFloat(key, (Float) object);  
                    } else if (object instanceof Long) {  
                        newEditor.putLong(key, (Long) object);  
                    } else {  
                        newEditor.putString(key, object.toString());  
                    }  
                }  
                //提交数据  
                newEditor.commit();  
                //删除旧数据  
                oldEditor.clear();  
                oldEditor.commit();  
            }  

            //检查数据  
           /* HashMap<String,Object> newMap = (HashMap<String, Object>) newSP.getAll();  
            for (String key : newMap.keySet()) {  
                Log.d("__UNI__78988302D",key+": "+newMap.get(key));  
            }*/  

        } catch (Exception e) {  
            e.printStackTrace();  
        }  

    }  

}

IOS端

IOS端和Android端的思路一样,其中最主要的是找到旧版和新版数据保存的对应位置
在IOS端旧版的plus.storage.setItem()保存的数据是在一个叫做wxstorage.plist文件当中
在IOS端新版的plus.storage.setItem()保存的数据是也是保存在一个叫做wxstorage.plist的文件当中
只是他们所在的文件路径不一样
文件内容如下:

旧版路径:
注意:是在应用沙盒的Documents目录下

新版路径:
注意:是在应用沙盒的Library目录下

然后我们利用工具类把就数据放到新版plist文件中即可 如下图:

IOS 工具类代码
.m文件

/*  
 *版本更新工具类  
 * 之前的mui项目 跟新成uniapp项目  缓存数据位置发生了变化 需要这个工具类吧旧版缓存数据转移过来  
 * 这样旧版更新新版后 不会出现需要用户重新登录等情况  
 */  
#import "UpdateUtil.h"  

@implementation UpdateUtil  

/**  
  转移数据的方法  
 */  
+(void)updateStorageInfo{  
    @try {  
        NSString *oldPlistPath = @"Pandora/apps/H576788FC6A/data/wxstorage/wxstorage.plist";  
        NSString *newPlistDic = @"Pandora/apps/__UNI__78988302D/data/wxstorage/";  
        NSString *newPlistPath = @"Pandora/apps/__UNI__78988302D/data/wxstorage/wxstorage.plist";  

        NSArray *pathDocumentArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
        NSString *pathDocument = [pathDocumentArray objectAtIndex:0];  
        //   /var/mobile/Containers/Data/Application/5817C54A-8C39-4768-A598-EA1357BD785C/Documents  
        NSLog(@"数据保存路径:%@",pathDocument);  

        NSArray *pathLibraryArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);  
        NSString *pathLibrary = [pathLibraryArray objectAtIndex:0];  
        //  /var/mobile/Containers/Data/Application/8789507C-761F-4705-9057-4BBF3E695D3E/Library  
        NSLog(@"数据保存路径:%@",pathLibrary);  

        //旧版数据位置  
        NSString *storageOldFilePath = [pathDocument stringByAppendingPathComponent:oldPlistPath];  
        //读取旧版中的数据 因为已经知道数据保存的是dict  所有使用 NSMutableDictionary来读取  
        NSMutableDictionary *oldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];  
        NSLog(@"旧版数据长度%lu",oldDict.count);  
        if(!oldDict || [oldDict count] == 0){  
            //不需要转移旧数据 这种情况是新版直接安装的情况  
            return;  
        }  
        //新版数据位置  
        NSString *storageNewFilePath = [pathLibrary stringByAppendingPathComponent:newPlistPath];  
        //判断文件是否存在  
        BOOL exist = [[NSFileManager defaultManager] fileExistsAtPath:storageNewFilePath];  
        if (!exist) {  
            //文件不存在  
            //先创建目录  
            NSString *storageNewDirectPath = [pathLibrary stringByAppendingPathComponent:newPlistDic];  
            BOOL dres = [[NSFileManager defaultManager] createDirectoryAtPath:storageNewDirectPath withIntermediateDirectories:YES attributes:nil error:nil];  
            //在创建文件  
            BOOL res = [[NSFileManager defaultManager] createFileAtPath:storageNewFilePath contents:nil attributes:nil];  
            NSLog(@"文件创建结果%@,....%@",dres?@"YES":@"NO",res?@"YES":@"NO");  
        }  
        //读取新版中的数据 如果是首次安装使用 新版中应该还没有数据  
        NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];  
        //如果没有 创建一个新字典  
        if (!newDict) {  
            newDict = [NSMutableDictionary dictionary];  
        }  

        //转移数据  把旧数据放到新的字典中去  
        for (NSString *key in oldDict) {  
            NSString *value = [oldDict valueForKey:key];  
            [newDict setValue:value forKey:key];  
        }  
        NSLog(@"新版数据长度%lu",newDict.count);  

        if([newDict count] > 0){  
            //把新数据设置到文件中  
            BOOL result = [newDict writeToFile:storageNewFilePath atomically:YES];  
            if (result) {  
                NSLog(@"新版数据写入成功");  
            }  
        }  

        //把数据拿出来看下有变化没  
       // NSMutableDictionary *newAndOldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];  
       // NSLog(@"新版数据确认长度%lu",newAndOldDict.count);  
        //清空旧文件中的数据  
        //[oldDict removeAllObjects];  
        NSDictionary *clearDic = [NSDictionary dictionary];  
        BOOL oldResult = [clearDic writeToFile:storageOldFilePath atomically:YES];  
        if (oldResult) {  
            NSLog(@"旧版清空成功");  
        }  
        //NSMutableDictionary *oldoldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];  
       // NSLog(@"旧版数据确认长度%lu",oldoldDict.count);  
    } @catch (NSException *exception) {  
        NSLog(@"程序出错%@",exception);  
    }  
}  

@end  

.h文件

@interface UpdateUtil : NSObject  

+(void)updateStorageInfo;  

@end  
收起阅读 »

UNI-APP打包及原生交互教程

uniapp uniapp插件

非广告引流!
UNI-APP打包及原生交互教程
社区的编辑器太难用了,移步链接可以看一下个人见解。

非广告引流!
UNI-APP打包及原生交互教程
社区的编辑器太难用了,移步链接可以看一下个人见解。

解决Mac找不到mumu模拟器的问题

模拟器

adb kill-server

adb start-server

adb devices

adb kill-server

adb start-server

adb devices

现在做外卖CPS晚吗?应该怎样做效果好一点?

公众号

外卖CPS是什么?

外卖CPS简单地说就是外卖平台分销,让用户通过你的链接去领取外卖红包,然后去下单点外卖,但有两个好处,一是用户能够省钱,二是你能够获得佣金,资源主要是饿了么和美团。

相信到现在,经常点外卖的人都会知道有外卖优惠券可以领取,为什么今年几个月时间几乎所有人都了解这个了呢?

那是因为做外卖CPS赚的佣金实际上是外卖公司的广告预算,假设往年广告预算是几个亿,那么今年是三十个亿以上,并且因为比传统广告效果更好,所以外卖公司会持续加大力度推。继而让更多的人了解到这个,一部分人就会去做这个,去用这个。

玩法刚才也讲到了,和淘宝客一样是别人用你的链接买东西你就有产品佣金,不同的是购物必须要买的,但饭是每顿都要吃的,所以这个是一个刚需市场。

那么收益到底好不好呢?

假设用户领取了你25减5的券,但实际付费也在23元左右,外卖平台给你的佣金是6%,那么此单你获得的佣金就是23×6%=1.38元,这么看起来并不是特别多,有的实际支付金额可能更少,那么会赚钱吗?答案是肯定的,有的人可能看不上这一块八毛的,但实际上那些靠这个买房买车的就是这一块八毛的钱累计起来的。

那么在这个行业人数众多的情况下怎样才能让自己的平台脱颖而出呢?

那就是生活IP全面延伸覆盖,增加用户粘性。

在现在,流量就是一切,流量就是现金,只要有了流量有了用户,几乎就是躺着就行。所以前期可以稍微投入一点,将生活方面的优惠都加到自己的平台,个人建议用公众号为载体,这样可以节约成本,并且方便全方面覆盖生活优惠领域。

那么可实施的有哪些呢?

加油站优惠加油,前期如果有成本,那么可以自己做找人做一个h5的加油系统嵌入公众号,如果预算没有那么多,则可以找一些市面上的加油软件,在他们平台上做代理,直接添加到公众号里下载链接,客服负责接待送卡,以及后续的卖卡。
话费优惠,话费充值现在也是比较热的话题,市面上的话费充值接口慢充88折到95折不等,快充差不多97折,这个也是有两种可实施性。一种就是自己申请话费接口,还是一样对接到公众号里就行,还有一种就是做一个简单的页面,后台显示充值者要充值的手机号归属地以及哪家,你只需要记录下来找第三方渠道帮他充值,中间是否赚钱就看你双方设置的了。
淘客,淘客就是上面说的那种,只要用户量上来了,粘性高了,就可以了。
影视会员:影视会员很多人都需要,但是价格却很贵,我们找渠道之后平均每年能省50元,还是相当划算的,
音乐会员,和影视会员一样。
综上所述,只要打造这么一个平台,相对同行只做单品的来说,我们的粘性更高,客户也更愿意使用我们的平台,如果多个平台同时推送信息,客户肯定会选择集优惠为一体的我们,而把另外其他的当做骚扰给排除掉。基本上面的这些优惠我们都是可以获利的,有的虽然是一块八毛的,但是积累起来也是巨大的财富,可以说利润空间巨大!

继续阅读 »

外卖CPS是什么?

外卖CPS简单地说就是外卖平台分销,让用户通过你的链接去领取外卖红包,然后去下单点外卖,但有两个好处,一是用户能够省钱,二是你能够获得佣金,资源主要是饿了么和美团。

相信到现在,经常点外卖的人都会知道有外卖优惠券可以领取,为什么今年几个月时间几乎所有人都了解这个了呢?

那是因为做外卖CPS赚的佣金实际上是外卖公司的广告预算,假设往年广告预算是几个亿,那么今年是三十个亿以上,并且因为比传统广告效果更好,所以外卖公司会持续加大力度推。继而让更多的人了解到这个,一部分人就会去做这个,去用这个。

玩法刚才也讲到了,和淘宝客一样是别人用你的链接买东西你就有产品佣金,不同的是购物必须要买的,但饭是每顿都要吃的,所以这个是一个刚需市场。

那么收益到底好不好呢?

假设用户领取了你25减5的券,但实际付费也在23元左右,外卖平台给你的佣金是6%,那么此单你获得的佣金就是23×6%=1.38元,这么看起来并不是特别多,有的实际支付金额可能更少,那么会赚钱吗?答案是肯定的,有的人可能看不上这一块八毛的,但实际上那些靠这个买房买车的就是这一块八毛的钱累计起来的。

那么在这个行业人数众多的情况下怎样才能让自己的平台脱颖而出呢?

那就是生活IP全面延伸覆盖,增加用户粘性。

在现在,流量就是一切,流量就是现金,只要有了流量有了用户,几乎就是躺着就行。所以前期可以稍微投入一点,将生活方面的优惠都加到自己的平台,个人建议用公众号为载体,这样可以节约成本,并且方便全方面覆盖生活优惠领域。

那么可实施的有哪些呢?

加油站优惠加油,前期如果有成本,那么可以自己做找人做一个h5的加油系统嵌入公众号,如果预算没有那么多,则可以找一些市面上的加油软件,在他们平台上做代理,直接添加到公众号里下载链接,客服负责接待送卡,以及后续的卖卡。
话费优惠,话费充值现在也是比较热的话题,市面上的话费充值接口慢充88折到95折不等,快充差不多97折,这个也是有两种可实施性。一种就是自己申请话费接口,还是一样对接到公众号里就行,还有一种就是做一个简单的页面,后台显示充值者要充值的手机号归属地以及哪家,你只需要记录下来找第三方渠道帮他充值,中间是否赚钱就看你双方设置的了。
淘客,淘客就是上面说的那种,只要用户量上来了,粘性高了,就可以了。
影视会员:影视会员很多人都需要,但是价格却很贵,我们找渠道之后平均每年能省50元,还是相当划算的,
音乐会员,和影视会员一样。
综上所述,只要打造这么一个平台,相对同行只做单品的来说,我们的粘性更高,客户也更愿意使用我们的平台,如果多个平台同时推送信息,客户肯定会选择集优惠为一体的我们,而把另外其他的当做骚扰给排除掉。基本上面的这些优惠我们都是可以获利的,有的虽然是一块八毛的,但是积累起来也是巨大的财富,可以说利润空间巨大!

收起阅读 »

加油优惠APP定制开发

小程序

1.一键加油功能;可以看到油加油的供应商;
2.在线商城功能;线上可以直接进行商品买卖;
3.油卡充值功能;有其他供应商可以直接进行油卡充值的功能;针对这个APP或者针对这个商家,充值消费后可以有优惠;
4.折扣优功能;直接输入加油金额进行折扣优惠,仅限在该APP内使用;

继续阅读 »

1.一键加油功能;可以看到油加油的供应商;
2.在线商城功能;线上可以直接进行商品买卖;
3.油卡充值功能;有其他供应商可以直接进行油卡充值的功能;针对这个APP或者针对这个商家,充值消费后可以有优惠;
4.折扣优功能;直接输入加油金额进行折扣优惠,仅限在该APP内使用;

收起阅读 »

开发过程中出现Maximum call stack size exceeded

App

出现错误:在进行app真机调试时,出现"RangeError: Maximum call stack size exceeded"
排除问题:只是调用了几个接口,没有递归调用,也没有低级错误,在电脑浏览器上可以正常使用
解决:重启一次hbuilderx,提示更新,手机上的hbuilderx调试基座同样进行更新。再次app真机调试成功

继续阅读 »

出现错误:在进行app真机调试时,出现"RangeError: Maximum call stack size exceeded"
排除问题:只是调用了几个接口,没有递归调用,也没有低级错误,在电脑浏览器上可以正常使用
解决:重启一次hbuilderx,提示更新,手机上的hbuilderx调试基座同样进行更新。再次app真机调试成功

收起阅读 »

线上盲盒的盈利模式

默认话题

相对比线下盲盒机和连锁店,线上盲盒商城怎样赚钱
一:盲盒因为盲,所以开盲盒的用户会比较感兴趣并多次充值抽取,这里商家就已经产出收益了
二:如果用户开出的盲盒不是很喜欢,或是重复很多了,可以回购给平台商家,只需要支付一定比例的手续费就可以了,这里商家是属于躺赚的。
三:除开盲盒商品外,还可以设置抽奖,集卡等模式,利用用户拉用户的裂变模式,大范围的开展产品销售,这里商家除开赚取商品利润还可以赚取差价

继续阅读 »

相对比线下盲盒机和连锁店,线上盲盒商城怎样赚钱
一:盲盒因为盲,所以开盲盒的用户会比较感兴趣并多次充值抽取,这里商家就已经产出收益了
二:如果用户开出的盲盒不是很喜欢,或是重复很多了,可以回购给平台商家,只需要支付一定比例的手续费就可以了,这里商家是属于躺赚的。
三:除开盲盒商品外,还可以设置抽奖,集卡等模式,利用用户拉用户的裂变模式,大范围的开展产品销售,这里商家除开赚取商品利润还可以赚取差价

收起阅读 »

个人使用phpstudy搭建PHP本地服务器流程记录

PHP搭建服务器

1.phpstudy创建PHP项目

启动Apache和MySQL


点击左侧网站,创建网页。注意到程序类型就是PHP,这里是创建PHP项目。

<!-- 域名可以任意填写 -->  
www.test02.com  
//端口号最好改8082以免撞了  
<!-- 根目录是自动创建的,也可以自己选择 -->

点击创建数据库,如果现在不选,可以到数据库去新建。


点击高级配置,网站首页设置成index.php。然后就可以点击确认了。

网站首页: index.php index.html error/index.html  
<!-- 改为 -->  
index.php index.html error/index.php  
<!-- 设置完成后可以点击phpstudy的页面管理打开页面。 -->  
<!-- 也可以复制路径,本地接口+路径在浏览器打开 -->  
http://localhost/error/index.php  
http://localhost/ + error/index.php//不知道可以从phpstudy网站首页设置复制

2.配置php文件

打开index.php,设置跨域配置,完成后前端才能访问。
跨域配置

header('Content-type:text/html;charset=utf-8');// 配置json  
header("Access-Control-Allow-Origin:true");// 跨域配置允许访问,Access-Control-Allow-Origin:  
// header("Access-Control-Allow-Origin: *");使用通配符允许所有站点访问私有API是显而易见的坏主意。  
header("Access-Control-Allow-Origin: http://localhost:8080");// 指定域名,写入域名头,只让本地8080端口访问,为了安全

测试运行和访问

<?php  
header('Content-type:text/html;charset=utf-8');  
header("Access-Control-Allow-Origin:true");  
header("Access-Control-Allow-Origin: http://localhost:8080");  
//测试用的数组  
$res = array(  
  "name" => "tom",  
  "age" => "18"  
);  
echo json_encode($res);//返回给前端的  
<!-- 如果未设置跨域访问会返回报错: -->  
已拦截跨源请求:同源策略禁止读取位于 http://localhost/error/index.php 的远程资源。(原因:CORS 头 'Access-Control-Allow-Origin' 不匹配 'true')。


链接指定数据库进行操控

<?php  
header('Content-type:text/html;charset=utf-8');  
header("Access-Control-Allow-Origin:true");  
header("Access-Control-Allow-Origin: http://localhost:8080");  

$link=@mysqli_connect('localhost','root','密码','test01',3306)or die('数据库连接失败');  
mysqli_set_charset($link,'utf8');  
// 接口测试  
$sql = "select * from students";//SQL语句赋值给变量sql  
$select = mysqli_query( $link, $sql );//执行SQL语句函数复制给变量select  
$data = array();//用于返回前端的数组,也以防报错  
 while($getsel = mysqli_fetch_assoc($select)){  
    $data[] = $getsel;  
 }  
 //mysqli_fetch_assoc函数获取数据  
echo json_encode($data);//返回给前端  
// 操作结束关闭数据库   
mysqli_close($link);

继续阅读 »

PHP搭建服务器

1.phpstudy创建PHP项目

启动Apache和MySQL


点击左侧网站,创建网页。注意到程序类型就是PHP,这里是创建PHP项目。

<!-- 域名可以任意填写 -->  
www.test02.com  
//端口号最好改8082以免撞了  
<!-- 根目录是自动创建的,也可以自己选择 -->

点击创建数据库,如果现在不选,可以到数据库去新建。


点击高级配置,网站首页设置成index.php。然后就可以点击确认了。

网站首页: index.php index.html error/index.html  
<!-- 改为 -->  
index.php index.html error/index.php  
<!-- 设置完成后可以点击phpstudy的页面管理打开页面。 -->  
<!-- 也可以复制路径,本地接口+路径在浏览器打开 -->  
http://localhost/error/index.php  
http://localhost/ + error/index.php//不知道可以从phpstudy网站首页设置复制

2.配置php文件

打开index.php,设置跨域配置,完成后前端才能访问。
跨域配置

header('Content-type:text/html;charset=utf-8');// 配置json  
header("Access-Control-Allow-Origin:true");// 跨域配置允许访问,Access-Control-Allow-Origin:  
// header("Access-Control-Allow-Origin: *");使用通配符允许所有站点访问私有API是显而易见的坏主意。  
header("Access-Control-Allow-Origin: http://localhost:8080");// 指定域名,写入域名头,只让本地8080端口访问,为了安全

测试运行和访问

<?php  
header('Content-type:text/html;charset=utf-8');  
header("Access-Control-Allow-Origin:true");  
header("Access-Control-Allow-Origin: http://localhost:8080");  
//测试用的数组  
$res = array(  
  "name" => "tom",  
  "age" => "18"  
);  
echo json_encode($res);//返回给前端的  
<!-- 如果未设置跨域访问会返回报错: -->  
已拦截跨源请求:同源策略禁止读取位于 http://localhost/error/index.php 的远程资源。(原因:CORS 头 'Access-Control-Allow-Origin' 不匹配 'true')。


链接指定数据库进行操控

<?php  
header('Content-type:text/html;charset=utf-8');  
header("Access-Control-Allow-Origin:true");  
header("Access-Control-Allow-Origin: http://localhost:8080");  

$link=@mysqli_connect('localhost','root','密码','test01',3306)or die('数据库连接失败');  
mysqli_set_charset($link,'utf8');  
// 接口测试  
$sql = "select * from students";//SQL语句赋值给变量sql  
$select = mysqli_query( $link, $sql );//执行SQL语句函数复制给变量select  
$data = array();//用于返回前端的数组,也以防报错  
 while($getsel = mysqli_fetch_assoc($select)){  
    $data[] = $getsel;  
 }  
 //mysqli_fetch_assoc函数获取数据  
echo json_encode($data);//返回给前端  
// 操作结束关闭数据库   
mysqli_close($link);

收起阅读 »

自营商城APP定制开发

小程序

自营电商是一种电子商务模式,其特征是以标准化的要求,对其经营产品进行统一生产或采购、产品展示、在线交易,并通过物流配送将产品投放到最终消费群体的行为。国内电子商务发展到今天,这种基于互联网的网上交易活动因其自身特点和商业需要衍生出了很多模式,自营电商(自营式电商)经过一定的发展成功塑造了商城的强有力的品质和售货保障形象,,加强了电商对商品来源、商品质量、商品供应及物流配送的管控能力,实现了商品的垂直化供应,使终端消费方获得更加优质的产品和服务。

继续阅读 »

自营电商是一种电子商务模式,其特征是以标准化的要求,对其经营产品进行统一生产或采购、产品展示、在线交易,并通过物流配送将产品投放到最终消费群体的行为。国内电子商务发展到今天,这种基于互联网的网上交易活动因其自身特点和商业需要衍生出了很多模式,自营电商(自营式电商)经过一定的发展成功塑造了商城的强有力的品质和售货保障形象,,加强了电商对商品来源、商品质量、商品供应及物流配送的管控能力,实现了商品的垂直化供应,使终端消费方获得更加优质的产品和服务。

收起阅读 »

淘客APP开发功能点

5+App开发

淘客APP开发功能点
1.多平台对接
APP需要对接主流电商平台,淘宝、天猫、京东、拼多多、唯品会等数据接口,平台切换简单方便。
2.多用户商城
APP平台化,做成多商户,淘客+商城新模式运营,多,更容易引流。
3.社区团购
依托真实社区,以小区为单位以为载体的一种区域化、小众化、本地化、网络化的团购,依托社区和团长社交关系实现生鲜商品流通、生活服务,集中化管理运营的新零售模式。
4.+合伙人模式
三级(法律允许的多层级)+运营商模式+VIP会员制,多逻辑自由组合,横向纵向双向拓展,轻松实现代理级别新模式运营。
5.营销多样化
通过生成,通过邀请好友,一件分享朋友圈、、知乎、头条、小红书等社交媒体,支持电商直播,支持618、双十一等重大活动宣传海报生成,为运营提前筹备。
6.商品一键
商品实时从第三方平台自动无需手动操作,数据更新快,操作简单,产品上架容易。
7.快速分享挣红包
通过分享挣红包等方式,鼓励消费者分享商品至各社交平台,激活消费者,降低成本,提升推广速度和裂变效果。
8.多维数据分析
产品数据,财务数据,用户数据,平台盈利等多维度数据查询分析让您的决策更加有效。

继续阅读 »

淘客APP开发功能点
1.多平台对接
APP需要对接主流电商平台,淘宝、天猫、京东、拼多多、唯品会等数据接口,平台切换简单方便。
2.多用户商城
APP平台化,做成多商户,淘客+商城新模式运营,多,更容易引流。
3.社区团购
依托真实社区,以小区为单位以为载体的一种区域化、小众化、本地化、网络化的团购,依托社区和团长社交关系实现生鲜商品流通、生活服务,集中化管理运营的新零售模式。
4.+合伙人模式
三级(法律允许的多层级)+运营商模式+VIP会员制,多逻辑自由组合,横向纵向双向拓展,轻松实现代理级别新模式运营。
5.营销多样化
通过生成,通过邀请好友,一件分享朋友圈、、知乎、头条、小红书等社交媒体,支持电商直播,支持618、双十一等重大活动宣传海报生成,为运营提前筹备。
6.商品一键
商品实时从第三方平台自动无需手动操作,数据更新快,操作简单,产品上架容易。
7.快速分享挣红包
通过分享挣红包等方式,鼓励消费者分享商品至各社交平台,激活消费者,降低成本,提升推广速度和裂变效果。
8.多维数据分析
产品数据,财务数据,用户数据,平台盈利等多维度数据查询分析让您的决策更加有效。

收起阅读 »