应用分发平台之应用信息表定义以及前端解析(二)

news/2024/7/10 1:38:02 标签: django, vue

Django的数据库model

django 数据库还真好使,抛开效率问题,感觉简直好用的不得了

apps表结构分析

  • 该APP所属用户
  • APP平台类型【android|ios】
  • 应用名称
  • 应用bundleId
  • 创建时间
  • 授权下载访问密码
  • 下载页可见
  • 描述
  • 更新时间
  • 是否有关联应用【下载码合并】

基于表分析,然后得出django model 大概设计字段

class Apps(models.Model):
    app_id = models.CharField(max_length=64, unique=True, db_index=True)  # ,唯一标识
    user_id = models.ForeignKey(to="UserInfo", verbose_name="用户ID", on_delete=models.CASCADE)
    type_choices = ((0, 'android'), (1, 'ios'))
    type = models.SmallIntegerField(choices=type_choices, default=0, verbose_name="类型")
    status_choices = ((0, '封禁'), (1, '正常'), (2, '违规'))
    status = models.SmallIntegerField(choices=status_choices, default=1, verbose_name="应用状态")
    name = models.CharField(max_length=32, blank=True, null=True, verbose_name="应用名称")
    short = models.CharField(max_length=16, unique=True, verbose_name="短链接", db_index=True)
    bundle_id = models.CharField(max_length=64, blank=True, verbose_name="bundle id")
    has_combo = models.OneToOneField(to="Apps", related_name='combo_app_info',
                                     verbose_name="关联应用", on_delete=models.SET_NULL, null=True, blank=True)
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    count_hits = models.BigIntegerField(verbose_name="下载次数", default=0)
    password = models.CharField(verbose_name="访问密码", blank=True, help_text='默认 没有密码', max_length=32)
    isshow = models.BooleanField(verbose_name="下载页可见", default=True)
    description = models.TextField('描述', blank=True, null=True, default=None, )
    updated_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        verbose_name = '应用信息'
        verbose_name_plural = "应用信息"
        indexes = [models.Index(fields=['app_id']), models.Index(fields=['id', 'user_id', 'type'])]

    def __str__(self):
        return "%s %s-%s" % (self.name, self.get_type_display(), self.short)

这个仅仅是应用表数据,还需要更详细的版本表记录

class AppReleaseInfo(models.Model):
    is_master = models.BooleanField(verbose_name="是否master版本", default=True)
    release_id = models.CharField(max_length=64, unique=True, verbose_name="release 版本id", db_index=True)
    app_id = models.ForeignKey(to="Apps", on_delete=models.CASCADE, verbose_name="属于哪个APP")
    build_version = models.CharField(max_length=64, verbose_name="build版本", blank=True)
    app_version = models.CharField(max_length=64, verbose_name="app版本", blank=True)
    release_choices = ((0, 'android'), (1, 'adhoc'), (2, 'Inhouse'), (3, 'unknown'))
    release_type = models.SmallIntegerField(choices=release_choices, default=0, verbose_name="版本类型")
    minimum_os_version = models.CharField(max_length=64, verbose_name="应用可安装的最低系统版本")
    binary_size = models.BigIntegerField(verbose_name="应用大小")
    binary_url = models.CharField(max_length=128, blank=True, verbose_name="第三方下载URL")
    icon_url = models.CharField(max_length=128, blank=True, verbose_name="图标url")
    changelog = models.TextField('更新日志', blank=True, null=True, default=None, )
    udid = models.TextField('ios内测版 udid', blank=True, null=True, default='', )
    distribution_name = models.CharField(max_length=128, null=True, blank=True, default='', verbose_name="企业签名")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    class Meta:
        verbose_name = '应用详情'
        verbose_name_plural = "应用详情"

    def __str__(self):
        return "%s-%s" % (self.app_id, self.release_id)

这样,通过这两张表,就差不多把应用一些基本信息给包含了,如果有新字段,后期还可以继续增加

那么,我们就可以着手开发上传的api了

Vue上传页面

很明显,我们发现了好多应用的信息,比如应用名称,应用类型,应用大小等等,这些信息是怎么通过前端web页面获取到呢?
这就不得不提一个好用的js插件了app-info-parser,本人使用的是0.3.9版本,暂未发现问题

"app-info-parser": "^0.3.9"

官方的github app-info-parser 有兴趣的小伙伴可以进去看下

由于IPA和apk应用解析的内容有写差别,为了统一数据格式,需要我们针对这些信息,进行二次封装

export function getappinfo(file, successcallback, errcallback) {
    const AppInfoParser = require('app-info-parser');
    const parser = new AppInfoParser(file);
    let analyseappinfo = {};
    parser.parse().then(result => {
        analyseappinfo.icon = result.icon;
        analyseappinfo.filename = file.name;
        analyseappinfo.filesize = file.size;
        if (result.CFBundleDisplayName) {
            analyseappinfo.appname = result.CFBundleDisplayName;
            analyseappinfo.bundleid = result.CFBundleIdentifier;
            analyseappinfo.version = result.CFBundleShortVersionString;
            analyseappinfo.buildversion = result.CFBundleVersion;
            analyseappinfo.miniosversion = result.MinimumOSVersion;
            if (result.mobileProvision.ProvisionedDevices) {
                analyseappinfo.release_type = 'Adhoc';
                analyseappinfo.release_type_id = 1;
                analyseappinfo.udid = result.mobileProvision.ProvisionedDevices;
            } else {
                analyseappinfo.distribution_name = result.mobileProvision.Name + ": " + result.mobileProvision.TeamName;
                analyseappinfo.release_type = 'Inhouse';
                analyseappinfo.release_type_id = 2;
                analyseappinfo.udid = [];
            }
            analyseappinfo.type = 'iOS';
        } else {
            analyseappinfo.appname = result.application.label[0];
            analyseappinfo.bundleid = result.package;
            analyseappinfo.version = result.versionName;
            analyseappinfo.buildversion = result.versionCode;
            analyseappinfo.miniosversion = result.usesSdk.minSdkVersion;
            analyseappinfo.type = 'Android';
            analyseappinfo.release_type = 'Android';
            analyseappinfo.release_type_id = 0;

        }
        successcallback(analyseappinfo)

    }).catch(err => {
        errcallback(err);
    });
}

封装之后,无论是ipa还是apk,获取的数据都是统一的格式

前端数据解析和后端表结构已经完成,那,接下来就可以上传应用,存储操作了


http://www.niftyadmin.cn/n/1265517.html

相关文章

php按钮启用停用并更新数据库,php 更新数据库中断的解决方法

php 更新数据库中断的解决方法即可解决:set_time_limit(900);这个函数指定了当前所在php脚本的最大执行时间,虽然设定值是900秒,实际上最大执行时间=php.ini里的max_execution_time数值 - 当前脚本已经执行的时间 设定…

应用分发平台之苹果超级签名流程分析及API错误

苹果超级签名实现分析 超级签名指的是将用户udid设备进行注册到苹果个人开发者账号下,并下载相应描述文件,将adhoc包通过描述文件签名后,分发给用户的操作。 为什么需要超级签名?某些原因,无法上架苹果商城&#xff…

Oracle死锁周期,oracle死锁时,杀历程的方法

第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过oracle的管理工具删除有死锁的session,oracle只会将该session标记为ki…

苹果开发者注册设备异常记录

最近收到好多设备注册异常提醒,发现设备状态异常,有下面两种情况 1.设备状态为 processing ,然后苹果官方提示 Registration is being processed for these devices. They may become available for development and ad hoc distribution in…

微信小程序上传图片到阿里云存储

文章目录前言一、微信小程序上传方法二、阿里云OSS1.配置跨域访问(参考文档)2.获取上传签名(重点)三、微信小程序封装上传方法测试总结前言 小程序业务,涉及到上传图片的功能,刚开始使用的是腾讯低代码平台…

创建oracle脚本范例,Oracle脚本创建数据库

Oracle的脚本手动创建数据库第一步:建立实例参数文件,确定实例名称参数文件名:initSID.ora如我的是initlzy03文件夹里面的内容,lzy03是创建的实例名,黄色的是安装的路径,每个人的安装都不一样,要…

如何巧妙找到自己想看的电子书

我有个朋友呢,特爱看电子书,但是他要求还挺多,非完本不看,评分低不看,完本太久远也不看,等等。 某一天,我突然心血来潮,然后他找到我,给我一个电子书网站,让我…

linux nginx虚拟主机配置文件,详述Linux系统中Nginx虚拟主机的配置

Nginx虚拟主机应用Nginx支持的虚拟主机有三种基于域名的虚拟主机.基于IP的虚拟主机基于端口的虚拟主机通过"server{}"配置段实现本篇实验接着上一篇搭建Nginx服务继续搭建,前面Nginx的编译安装不在介绍基于域名的虚拟主机[rootlocalhost nginx-1.12.2]# m…