feat(ota): 新增OTA远程升级功能
- 创建OTA版本管理表结构,支持版本名称、构建号、APK文件等信息存储 - 实现后台OTA版本管理界面,包含新增、编辑、删除和发布功能 - 开发API接口用于设备版本检查和更新包下载 - 实现版本发布逻辑,自动归档旧版本并计算APK文件哈希值 - 添加强制更新、目标设备白名单和最低版本限制功能 - 集成文件上传和选择组件,支持APK文件管理 - 实现版本状态管理(草稿、已发布、已归档)和权限控制
This commit is contained in:
89
application/admin/view/ota/version/edit.html
Normal file
89
application/admin/view/ota/version/edit.html
Normal file
@@ -0,0 +1,89 @@
|
||||
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Version_name')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-version_name" data-rule="required" class="form-control" name="row[version_name]" type="text" value="{$row.version_name|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Version_code')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-version_code" data-rule="required" min="0" class="form-control" name="row[version_code]" type="number" value="{$row.version_code|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Apk_file')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<div class="input-group">
|
||||
<input id="c-apk_file" data-rule="required" class="form-control" size="50" name="row[apk_file]" type="text" value="{$row.apk_file|htmlentities}">
|
||||
<div class="input-group-addon no-border no-padding">
|
||||
<span><button type="button" id="faupload-apk_file" class="btn btn-danger faupload" data-input-id="c-apk_file" data-multiple="false" data-preview-id="p-apk_file"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||
<span><button type="button" id="fachoose-apk_file" class="btn btn-primary fachoose" data-input-id="c-apk_file" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||
</div>
|
||||
<span class="msg-box n-right" for="c-apk_file"></span>
|
||||
</div>
|
||||
<ul class="row list-inline faupload-preview" id="p-apk_file"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('File_size')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-file_size" min="0" class="form-control" name="row[file_size]" type="number" value="{$row.file_size|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Sha256')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-sha256" class="form-control" name="row[sha256]" type="text" value="{$row.sha256|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Update_log')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<textarea id="c-update_log" data-rule="required" class="form-control " rows="5" name="row[update_log]" cols="50">{$row.update_log|htmlentities}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Is_force_update')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-is_force_update" data-rule="required" min="0" class="form-control" name="row[is_force_update]" type="number" value="{$row.is_force_update|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
|
||||
<div class="radio">
|
||||
{foreach name="statusList" item="vo"}
|
||||
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="$row.status"}checked{/in} /> {$vo}</label>
|
||||
{/foreach}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Target_devices')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<textarea id="c-target_devices" class="form-control " rows="5" name="row[target_devices]" cols="50">{$row.target_devices|htmlentities}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Min_version')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-min_version" class="form-control" name="row[min_version]" type="text" value="{$row.min_version|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Creator_id')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-creator_id" min="0" data-rule="required" data-source="creator/index" class="form-control selectpage" name="row[creator_id]" type="text" value="{$row.creator_id|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group layer-footer">
|
||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
Reference in New Issue
Block a user