Commit 8fb47f5a authored by Chen Jiping's avatar Chen Jiping

feat:完成模板调整

parent ce304201
...@@ -128,5 +128,8 @@ ...@@ -128,5 +128,8 @@
} }
} }
}, },
"defaultProject": "ng-template-generator" "defaultProject": "ng-template-generator",
"cli": {
"analytics": "9f96abb0-60fd-4368-a556-a8f81f0aca15"
}
} }
\ No newline at end of file
...@@ -25,6 +25,7 @@ import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontaweso ...@@ -25,6 +25,7 @@ import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontaweso
import { fas } from '@fortawesome/free-solid-svg-icons'; import { fas } from '@fortawesome/free-solid-svg-icons';
import { far } from '@fortawesome/free-regular-svg-icons'; import { far } from '@fortawesome/free-regular-svg-icons';
import { UploadDragonBoneComponent } from './common/upload-dragon-bone/upload-dragon-bone.component'; import { UploadDragonBoneComponent } from './common/upload-dragon-bone/upload-dragon-bone.component';
import { LrcEditorComponent } from './common/lrc-editor/lrc-editor.component';
registerLocaleData(zh); registerLocaleData(zh);
...@@ -42,7 +43,8 @@ registerLocaleData(zh); ...@@ -42,7 +43,8 @@ registerLocaleData(zh);
UploadVideoComponent, UploadVideoComponent,
CustomHotZoneComponent, CustomHotZoneComponent,
UploadDragonBoneComponent, UploadDragonBoneComponent,
PlayerContentWrapperComponent PlayerContentWrapperComponent,
LrcEditorComponent
], ],
imports: [ imports: [
......
import { Obj } from "./ObjBean";
export class ExercisesBean extends Obj{
//字母数组
wordArr = [];
//单词数组
word2Arr = [];
}
export function getDefaultExercises(){
let exercises = new ExercisesBean();
return exercises;
}
export function getDefaultWord(){
let word = new Obj();
return word;
}
\ No newline at end of file
export class Obj{
/**音频材料 */
audioUrl: String;
/**图片材料 */
picUrl:String;
val : String;
}
\ No newline at end of file
import { EventEmitter } from '@angular/core';
export class AudioDelegate {
audioObj = new Audio();
public audioPlayTimestamp = new EventEmitter();
public audioDataLoaded = new EventEmitter();
public audioPlayBarPosition = new EventEmitter();
public audioPlayEnd = new EventEmitter();
syncAudioCurrentTimeId: number = null;
private arrayBuffer = null;
formatter = new Intl.NumberFormat('en', {
minimumIntegerDigits: 2,
minimumFractionDigits: 3,
maximumFractionDigits: 3,
useGrouping: false,
});
constructor() {
this.audioObj.onloadeddata = this.onAudioDataLoaded.bind(this);
this.audioObj.onplay = this.onAudioPlay.bind(this);
this.audioObj.onpause = this.onAudioPause.bind(this);
this.audioObj.ontimeupdate = this.onAudioTimeUpdate.bind(this);
this.audioObj.onratechange = this.onAudioRateChange.bind(this);
this.audioObj.onended = this.onAudioEnded.bind(this);
this.audioObj.onerror = () => {
};
}
set playbackRate(val) {
this.audioObj.playbackRate = val;
}
set src(val) {
this.audioObj.src = val;
}
get src() {
return this.audioObj.src;
}
convertTagToTime(tag) {
tag = tag.replace('[', '');
tag = tag.replace(']', '');
const parts = tag.split(':');
let h = 0;
let m = 0;
let s = 0;
if (parts.length === 3) {
h = parseInt(parts[0], 10);
m = parseInt(parts[1], 10);
s = parseInt(parts[2], 10);
} else if (parts.length === 2) {
m = parseInt(parts[0], 10);
s = parseFloat(parts[1] );
}
return h * 60 * 60 + m * 60 + s;
}
convertTimeToTag(time, withBracket = true): string {
if (time === undefined) {
return '';
}
const hh = Math.floor(time / 60 / 60)
.toString()
.padStart(2, '0');
const mm = Math.floor(time / 60)
.toString()
.padStart(2, '0');
const ss = this.formatter.format(time % 60);
return withBracket ? `[${hh}:${mm}:${ss}]` : `${hh}:${mm}:${ss}`;
}
setSource(ab) {
this.arrayBuffer = ab;
const blob = new Blob([ab], { type: 'audio/wav' });
this.audioObj.src = URL.createObjectURL(blob);
}
getDataBuffer() {
return this.arrayBuffer;
}
getBufferClip(start, end) {
return this.arrayBuffer.slice(start * this.arrayBuffer.length, end * this.arrayBuffer.length);
}
load() {
this.audioObj.load();
}
syncAudioCurrentTime() {
this.audioPlayTimestamp.emit({
timeFormat: this.convertTimeToTag(this.audioObj.currentTime, false),
time: this.audioObj.currentTime
});
this.syncAudioCurrentTimeId = requestAnimationFrame(() => {
this.syncAudioCurrentTime();
});
}
onAudioDataLoaded(evt) {
console.log('onAudioDataLoaded', evt);
this.audioDataLoaded.emit(this.arrayBuffer);
}
onAudioPlay() {
this.syncAudioCurrentTimeId = requestAnimationFrame(() => {
this.syncAudioCurrentTime();
});
console.log('onAudioPlay');
}
onAudioPause() {
console.log('onAudioPause');
cancelAnimationFrame(this.syncAudioCurrentTimeId);
}
onAudioEnded() {
console.log('onAudioEnded');
this.audioPlayEnd.emit()
cancelAnimationFrame(this.syncAudioCurrentTimeId);
}
onAudioTimeUpdate() {
// console.log('onAudioTimeUpdate', this.convertTimeToTag(this.audioObj.currentTime));
// this.audioPlayTimestamp.emit(this.convertTimeToTag(this.audioObj.currentTime));
}
onAudioRateChange() {
console.log('onAudioRateChange');
}
get isPlaying() {
return !!(this.audioObj.currentTime > 0
&& !this.audioObj.paused
&& !this.audioObj.ended
&& this.audioObj.readyState > 2);
}
currentTimeFormatted(time?) {
let t = this.audioObj.currentTime;
if (typeof time !== 'undefined') {
t = time;
}
return this.convertTimeToTag(t);
}
get currentTime() {
return this.audioObj.currentTime;
}
set currentTime(val) {
this.audioPlayBarPosition.emit({
time: val
});
this.audioObj.currentTime = val;
}
get duration() {
return this.audioObj.duration;
}
get durationFormatted() {
return this.convertTimeToTag(this.audioObj.duration, false);
}
get currentSrc() {
return this.audioObj.currentSrc;
}
pause() {
this.audioObj.pause();
}
async play() {
return this.audioObj.play();
}
}
import { EventEmitter } from '@angular/core';
export class DragElement {
onMove = new EventEmitter();
canMove = false;
dragEl = null;
relX = 0;
private readonly bindMove: any;
private readonly maxWidth: any;
private readonly bindDown: any;
private readonly bindUp: any;
constructor(el, maxWidth) {
this.dragEl = el;
this.maxWidth = maxWidth;
this.bindMove = this.move.bind(this);
this.bindDown = this.down.bind(this);
this.bindUp = this.up.bind(this);
this.dragEl.addEventListener('mousedown', this.bindDown, false);
document.addEventListener('mouseup', this.bindUp, false);
}
dispose() {
this.dragEl.removeEventListener('mousedown', this.bindDown, false);
}
down(e) {
document.addEventListener('mousemove', this.bindMove, false);
// relX = e.pageX - this.timeLine.offsetWidth || 0;
// const left = parseInt(el.offsetWidth|| 0)
const matrix = new DOMMatrix(this.dragEl.style.transform);
this.relX = e.pageX - matrix.m41 || 0;
this.canMove = true;
}
up(e) {
this.canMove = false;
document.removeEventListener('mousemove', this.bindMove, false);
}
move(e) {
if (!this.canMove) {
return;
}
const matrix = new DOMMatrix(this.dragEl.style.transform);
const w = matrix.m41;
if (w > this.maxWidth) {
this.dragEl.style.transform = `translateX(${this.maxWidth}px)`;
return;
}
if (w < 0 ) {
this.dragEl.style.transform = `translateX(0px)`;
return;
}
// this.dragEl.style.transform = `translateX(${(e.pageX - this.relX)}px)`;
this.onMove.emit({
position: e.pageX - this.relX,
});
}
}
<div class="cmp-lrc-editor" >
<div id="step2" class="step" >
<nz-spin [nzSpinning]="isLoadingAudioBuffer" style="width: 100%;height: 100%;">
<div class="content">
<div class="center" >
<div style="display: flex; line-height: 36px;">
<span style="margin-right: 20px">{{currentAudioTime}}/{{currentAudioDuration}}</span>
&nbsp;
<app-audio-recorder [audioUrl]="LRCData.audio_url"
(audioUploaded)="onAudioUploaded($event)"></app-audio-recorder>
&nbsp;
<button nz-button nzSize="default"
nzType="primary"
nz-tooltip nzTooltipTitle="上剪头播放暂停,下箭头打点,左右剪头微调"
(click)="togglePlayAudio($event)">
<ng-container *ngIf="isPlaying"><i nz-icon nzType="pause" nzTheme="outline"></i>暂停(上箭头)</ng-container>
<ng-container *ngIf="!isPlaying"><i nz-icon nzType="caret-right" nzTheme="outline"></i>播放(上箭头)</ng-container>
</button>
&nbsp;
<button nz-button nzSize="default"
nzType="primary"
nz-tooltip nzTooltipTitle="上剪头播放暂停,下箭头打点,左右剪头微调"
id="enterbtn"
(click)="setTimestampPoint()">打点(下箭头)</button>
&nbsp;
<button nz-button nzSize="default"
nzType="danger"
(click)="saveUserData()"><i nz-icon nzType="cloud-upload" nzTheme="outline"></i>保存</button>
</div>
<div style="display: flex; line-height: 36px;">
<span>播放速度:</span>&nbsp;
<span style="width: 150px;">
<nz-slider [(ngModel)]="playbackRate"
(ngModelChange)="changePlaybackRate($event)"
[nzMax]="2" [nzMin]="0.25" [nzStep]="0.25"></nz-slider>
</span>
<!-- <label style="margin-right: 20px;margin-left: 20px">文字大小: <nz-input-number [(ngModel)]="LRCData.fontSize" [nzMin]="1" [nzMax]="100" [nzStep]="1"></nz-input-number></label> -->
<!-- <label style="">行高: <nz-input-number [(ngModel)]="LRCData.lineHeight" [nzMin]="1" [nzMax]="100" [nzStep]="1"></nz-input-number></label> -->
<input type="file" onclick="this.value=null;" accept=".lrc" style="display: none" #uploadBtn>
<button [disabled]="!LRCData.audio_url" nz-button nzType="link" (click)="uploadLRC()">上传LRC文件</button>
<nz-select [(ngModel)]="lrcFileEncoding" (ngModelChange)="changeLrcFileEncoding($event)">
<nz-option nzValue="UTF-8" nzLabel="UTF-8"></nz-option>
<nz-option nzValue="GB18030" nzLabel="GB18030"></nz-option>
</nz-select>
</div>
<!-- <span>{{currentAudioTime}}/{{currentAudioDuration}}</span>-->
<!-- <nz-radio-group (ngModelChange)="changeMode($event)" [(ngModel)]="LRCData.mode" class="mode">-->
<!-- <label nz-radio [nzValue]="MODE.TEXT">文本模式</label>-->
<!-- <label nz-radio [nzValue]="MODE.IMAGE">图片模式</label>-->
<!-- </nz-radio-group>-->
<!-- <span style="width: 150px;">-->
<!-- <nz-slider [(ngModel)]="playbackRate"-->
<!-- (ngModelChange)="changePlaybackRate($event)"-->
<!-- [nzMax]="2" [nzMin]="0.25" [nzStep]="0.25"></nz-slider>-->
<!-- </span>-->
</div>
<div class="timestamp-container">
<ng-template #insertLineContentTemplate>
<div>
<p>Content</p>
<p>Content</p>
</div>
</ng-template>
<div class="timestamp-line"
(click)="selectTimePoint(i)"
[ngClass]="{selected: selectHighlightTimePointIndex === i}"
*ngFor="let item of timePointData; let i = index">
<div class="time-tag" [ngClass]="{warn: item.warn}">{{item.timeFormatted}}</div>
<div class="add-line" style="margin-right: 4px;">
<button nz-tooltip nzTooltipTitle="向后插入一行" nz-button nzType="danger" nzSize="small" nzShape="circle"
(click)="insertTimePoint(i)">
<i nz-icon nzType="plus" nzTheme="outline"></i>
</button>
</div>
<!--
<div class="time-content">
<input nz-input [(ngModel)]="item.data" />
</div>
<div class="line-break">
<label nz-checkbox nz-tooltip nzTitle="添加换行" [(ngModel)]="item.newLine"></label>
</div>
-->
<div class="time-del">
<button nz-button nzType="primary" nzSize="small" nzShape="circle" (click)="removeTimePoint(i)">
<i nz-icon nzType="delete" nzTheme="outline"></i>
</button>
</div>
</div>
</div>
</div>
</nz-spin>
</div>
<div class="wave-player" [ngStyle]="{visibility: LRCData.audio_url ? 'visible' : 'hidden'}" >
<canvas #waveEl ></canvas>
<div class="time-line" #timeLineEl>
<div class="ctrl-bar">
</div>
<div class="play-bar"></div>
</div>
<div class="point-line">
<div *ngFor="let item of timePointData; let i = index"
[ngStyle]="{transform: item.position, zIndex: selectHighlightTimePointIndex === i ? 1 : 0}">
<div class="arrow-up"
nzTrigger="click"
nzTitle="⇽⇾左右方向键可以微调该时间点"
nzPlacement="bottom"
nz-tooltip
[ngClass]="{selected: selectHighlightTimePointIndex === i}">
<div class="ctrl-bar" (click)="selectTimePoint(i)"></div>
</div>
</div>
</div>
<!-- [nzDisabled]="isScaleTimeLine"-->
<nz-slider nzRange style="flex: 1" [nzTipFormatter]="formatter" [nzStep]="0.01" [nzMax]="timeRangeObj.max" [nzMin]="timeRangeObj.min"
(nzOnAfterChange)="timeRangeAfterChange($event)"
[(ngModel)]="timeRangeSelector"></nz-slider>
<div style="width: 100%;
position: relative;
height: 30px;
display: flex;
flex-direction: row-reverse;">
<!-- *ngIf="!isScaleTimeLine"-->
<!-- *ngIf="isScaleTimeLine"-->
<button [disabled]="!isScaleTimeLine" style="margin-right: 8px;" nz-button nzSize="small"
(click)="restoreTimeLine()"
nzType="primary">
返回</button>
<button style="margin-right: 8px;" nz-button nzSize="small"
(click)="scaleTimeLine()"
nzType="primary">
缩放时间轴</button>
</div>
</div>
</div>
@import '../../style/common_mixin.css';
:host ::ng-deep .cmp-lrc-editor .ant-spin-container {
width: 100%;
height: 100%;
}
.cmp-lrc-editor{
width: 100%;
.step{
width: 100%;
height: 500px;
position: relative;
.content{
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
}
.flex1{
flex: 1;
}
.wave-player{
display: inline-block;
position: relative;
width: 100%;
canvas{
width: 100%;
height: 100px;
}
}
.time-line{
height: 100%;
position: absolute;
border: 0;
top: 0;
opacity: 0.5;
width: 0px;
z-index: 1;
}
.line-break{
margin: 0 4px 0 8px;
}
.time-tag.warn{
background: firebrick;
}
.time-tag:after {
content: "\27A4";
}
.timestamp-container{
width: 100%;
flex: 1;
overflow: auto;
}
.timestamp-line.selected{
background: green;
}
.timestamp-line{
display: flex;
margin: 2px 0;
height: 36px;
line-height: 36px;
.time-tag{
flex: 0;
margin-right: 4px;
}
.time-content{
flex: 1;
}
.time-del{
margin-left: 4px;
flex: 0;
}
}
.ctrl-bar{
height: 100%;
width: 0px;
transform: translateX(50%);
position: absolute;
cursor: ew-resize;
user-select: none;
padding: 0 2px;
//box-shadow: 0.5px 0 0 blue;
box-shadow: none!important;
box-shadow: none;
width: 1px;
background: blue;
transform: translateX(100%);
padding: 0;
}
.drag-bar{
box-shadow: none;
width: 4px;
background: blue;
transform: translateX(3px);
padding: 0;
}
.point-line{
position: relative;
height: 5px;
.arrow-up.selected{
border-bottom-color: #faad14;
}
.arrow-up {
width: 0;
height: 0;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
position: absolute;
border-bottom: 5px solid black;
//transform: translateX(-100%);
.ctrl-bar{
bottom: 0;
transform: translateX(-50%);
box-shadow: 0.5px 0 0 blue;
height: 100px;
position: absolute;
}
}
}
}
This diff is collapsed.
<div class="model-content"> <div class="model-content">
<div nz-row>
<div style="padding: 10px;"> <div nz-col nzOffset='4'>
<h1 nz-title>课程练习内容编辑</h1>
<div style="width: 300px;" align='center'>
<span>图1: </span>
<app-upload-image-with-preview
[picUrl]="item.pic_url"
(imageUploaded)="onImageUploadSuccess($event, 'pic_url')">
</app-upload-image-with-preview>
</div>
<div style="width: 300px; margin-top: 5px;" align='center'>
<span>图2: </span>
<app-upload-image-with-preview
[picUrl]="item.pic_url_2"
(imageUploaded)="onImageUploadSuccess($event, 'pic_url_2')">
</app-upload-image-with-preview>
</div> </div>
<div style="width: 300px; margin-top: 15px;">
<span>文本: </span>
<input type="text" nz-input [(ngModel)]="item.text" (blur)="save()">
</div> </div>
<!--练习题-->
<div nz-row>
<div nz-col [nzSpan]="23" nzOffset="1">
<nz-divider nzText="内容编辑" nzOrientation="left"></nz-divider>
<nz-form-item>
<nz-form-label [nzSpan]="2" nzFor="guideAudioUrl1">字母</nz-form-label>
<nz-form-control [nzSpan]="4">
<input type="text" nz-input [(ngModel)]="item.letter" (blur)="save()">
</nz-form-control>
</nz-form-item>
<div style="margin-top: 5px"> <nz-form-item>
<span>音频: </span> <nz-form-label [nzSpan]="2" nzFor="guideAudioUrl1">CC引导音频1</nz-form-label>
<app-audio-recorder <nz-form-control [nzSpan]="4">
[audioUrl]="item.audio_url" <app-audio-recorder [audioUrl]="item.guideAudioUrl1" id="guideAudioUrl1"
(audioUploaded)="onAudioUploadSuccess($event, 'audio_url')" (audioUploaded)="onAudioUploadSuccess($event, item, 'guideAudioUrl1')">
></app-audio-recorder> </app-audio-recorder>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="2" nzFor="guideAudioUrl2">CC引导音频2</nz-form-label>
<nz-form-control [nzSpan]="4">
<app-audio-recorder [audioUrl]="item.guideAudioUrl2" id="guideAudioUrl2"
(audioUploaded)="onAudioUploadSuccess($event, item, 'guideAudioUrl2')">
</app-audio-recorder>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="2" nzFor="guideAudioUrl3">CC引导音频3</nz-form-label>
<nz-form-control [nzSpan]="4">
<app-audio-recorder [audioUrl]="item.guideAudioUrl3" id="guideAudioUrl3"
(audioUploaded)="onAudioUploadSuccess($event, item, 'guideAudioUrl3')">
</app-audio-recorder>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="2">图片</nz-form-label>
<nz-form-control [nzSpan]="4">
<app-upload-image-with-preview style="width: 100%" [picUrl]="item.exercises.picUrl"
(imageUploaded)="onImageUploadSuccess($event, item.exercises, 'picUrl')">
</app-upload-image-with-preview>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="2" nzFor="add-btn">字母添加</nz-form-label>
<nz-form-control [nzSpan]="4">
<button nz-button nzType="dashed" class="add-btn" id="add-btn" (click)="addWordItem(item.exercises, 'wordArr')" [disabled]="item.exercises.wordArr.length == 2 ? true : false">
<i nz-icon nzType="plus-circle" nzTheme="outline"></i>添加
</button>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-control [nzOffset]="2" [nzSpan]="15">
<nz-table #wordTable nzBordered [nzData]="item.exercises.wordArr" nzBordered nzTitle="字母数组"
[nzShowPagination]=true>
<thead>
<tr>
<th>序号</th>
<th>字母</th>
<th>音频</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let row of wordTable.data;let j = index">
<td>{{ j+1 }}</td>
<td><input type="text" nz-input [(ngModel)]="row.val" (blur)="save()" maxlength="1"></td>
<td>
<app-audio-recorder [audioUrl]="row.audioUrl"
(audioUploaded)="onAudioUploadSuccess($event, row, 'audioUrl')">
</app-audio-recorder>
</td>
<td>
<button nz-button nzType="dashed" id="del-btn" (click)="delWord(item.exercises, 'wordArr', j)">
<i nz-icon nzType="delete" nzTheme="outline"></i>删除
</button>
</td>
</tr>
</tbody>
</nz-table>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="2" nzFor="add-btn">单词添加</nz-form-label>
<nz-form-control [nzSpan]="4">
<button nz-button nzType="dashed" class="add-btn" id="add-word-btn" (click)="addWordItem(item.exercises, 'word2Arr')" [disabled]="item.exercises.word2Arr.length == 2 ? true : false">
<i nz-icon nzType="plus-circle" nzTheme="outline"></i>添加
</button>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-control [nzOffset]="2" [nzSpan]="15">
<nz-table #wordTable2 nzBordered [nzData]="item.exercises.word2Arr" nzBordered nzTitle="单词数组"
[nzShowPagination]=true>
<thead>
<tr>
<th>序号</th>
<th>单词</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let row of wordTable2.data;let j = index">
<td>{{ j+1 }}</td>
<td><input type="text" nz-input [(ngModel)]="row.val" (blur)="save()"></td>
<td>
<button nz-button nzType="dashed" id="del-word-btn" (click)="delWord(item.exercises, 'word2Arr', j)">
<i nz-icon nzType="delete" nzTheme="outline"></i>删除
</button>
</td>
</tr>
</tbody>
</nz-table>
</nz-form-control>
</nz-form-item>
<nz-divider nzText="音频编辑" nzOrientation="left"></nz-divider>
<app-lrc-editor [LRCData]="item.exercises.lrcData" (editFinished)="getLRC($event, item.exercises)">
</app-lrc-editor>
</div> </div>
</div> </div>
</div> </div>
\ No newline at end of file
import { Component, EventEmitter, Input, OnDestroy, OnChanges, OnInit, Output, ApplicationRef, ChangeDetectorRef } from '@angular/core'; import { Component, EventEmitter, Input, OnDestroy, OnChanges, OnInit, Output, ApplicationRef, ChangeDetectorRef } from '@angular/core';
import { JsonPipe } from '@angular/common'; import { JsonPipe } from '@angular/common';
import { getDefaultExercises, getDefaultWord } from '../bean/ExercisesBean';
@Component({ @Component({
...@@ -10,7 +11,7 @@ import { JsonPipe } from '@angular/common'; ...@@ -10,7 +11,7 @@ import { JsonPipe } from '@angular/common';
export class FormComponent implements OnInit, OnChanges, OnDestroy { export class FormComponent implements OnInit, OnChanges, OnDestroy {
// 储存数据用 // 储存数据用
saveKey = "test_001"; saveKey = "OP-03-2";
// 储存对象 // 储存对象
item; item;
...@@ -37,6 +38,8 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -37,6 +38,8 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
this.item = {}; this.item = {};
this.item.exercises = getDefaultExercises();
// 获取存储的数据 // 获取存储的数据
(<any>window).courseware.getData((data) => { (<any>window).courseware.getData((data) => {
...@@ -44,6 +47,8 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -44,6 +47,8 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
this.item = data; this.item = data;
} }
console.log(JSON.stringify(this.item));
this.init(); this.init();
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detectChanges();
...@@ -60,6 +65,17 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -60,6 +65,17 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
init() { init() {
if(!this.item.exercises){
this.item.exercises = getDefaultExercises();
}
if(!this.item.exercises.wordArr){
this.item.exercises.wordArr = [];
}
if(!this.item.exercises.word2Arr){
this.item.exercises.word2Arr = [];
}
} }
...@@ -67,9 +83,9 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -67,9 +83,9 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
* 储存图片数据 * 储存图片数据
* @param e * @param e
*/ */
onImageUploadSuccess(e, key) { onImageUploadSuccess(e, item, key) {
this.item[key] = e.url; item[key] = e.url;
this.save(); this.save();
} }
...@@ -77,20 +93,12 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -77,20 +93,12 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
* 储存音频数据 * 储存音频数据
* @param e * @param e
*/ */
onAudioUploadSuccess(e, key) { onAudioUploadSuccess(e, item, key) {
this.item[key] = e.url;
this.save();
}
onWordAudioUploadSuccess(e, idx) { item[key] = e.url;
this.item.wordList[idx].audio = e.url;
this.save(); this.save();
} }
onBackWordAudioUploadSuccess(e, idx) {
this.item.wordList[idx].backWordAudio = e.url;
this.save();
}
/** /**
* 储存数据 * 储存数据
...@@ -111,4 +119,29 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -111,4 +119,29 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
}, 1); }, 1);
} }
addWordItem(item, key) {
let word = getDefaultWord();
item[key].push(word);
item[key] = [...item[key]];
this.save();
}
delWord(item, key, index) {
if (index !== -1) {
item[key].splice(index, 1);
item[key] = [...item[key]];
this.save();
}
}
getLRC(evt, it) {
it.lrcData = evt;
it.audioUrl = evt.audio_url;
this.save();
}
} }
\ No newline at end of file
This diff is collapsed.
{ {
"ver": "1.1.2", "ver": "1.1.2",
"uuid": "c35bb2f6-f24a-4850-ae44-643f2fdc7541", "uuid": "18f88177-7837-4040-acbc-043cbb64bb1e",
"isBundle": false, "isBundle": false,
"bundleName": "", "bundleName": "",
"priority": 1, "priority": 1,
......
{
"ver": "2.0.1",
"uuid": "c58ea9c7-40f6-4fdf-a423-cf8189186748",
"downloadMode": 0,
"duration": 4.176,
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.0.1",
"uuid": "58b7914c-5652-4c51-b14e-5c99e5627fcc",
"downloadMode": 0,
"duration": 8.696417,
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.0.1",
"uuid": "58839a84-d8f6-4df3-aef2-ecaab688f0f3",
"downloadMode": 0,
"duration": 5.84,
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.0.1",
"uuid": "3f07060f-b7a8-46f7-9c84-e9dde678a660",
"downloadMode": 0,
"duration": 4.608,
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.0.1",
"uuid": "77f54cb1-a7d6-4ad3-81d0-1b6aabc5873c",
"downloadMode": 0,
"duration": 3.996,
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.0.1",
"uuid": "b3db0b11-8bb2-44f7-b32d-b4989c3b8197",
"downloadMode": 0,
"duration": 3.384,
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.0.1",
"uuid": "b77d16ca-097b-4106-bd9c-970aa3440fcf",
"downloadMode": 0,
"duration": 1.512,
"subMetas": {}
}
\ No newline at end of file
{
"ver": "1.1.2",
"uuid": "4b5a9e31-5415-402a-8602-79434ebeb5f9",
"isBundle": false,
"bundleName": "",
"priority": 1,
"compressionType": {},
"optimizeHotUpdate": {},
"inlineSpriteFrames": {},
"isRemoteBundle": {},
"subMetas": {}
}
\ No newline at end of file
This diff is collapsed.
{
"ver": "1.0.1",
"uuid": "3b762855-a2f2-4947-a9a8-5fbefe3c5806",
"subMetas": {}
}
\ No newline at end of file
{"name":"mao","imagePath":"mao_tex.png","SubTexture":[{"name":"猫01/影子","x":1,"height":66,"y":343,"width":337},{"name":"猫01/尾巴","x":1,"height":109,"y":188,"width":175},{"name":"猫01/右腿","x":178,"height":117,"y":188,"width":104},{"name":"猫01/左腿","x":1,"height":115,"y":569,"width":64},{"name":"猫01/右手","x":427,"height":122,"y":590,"width":69},{"name":"猫01/左手","x":301,"height":74,"y":590,"width":124},{"name":"猫01伸/左手伸直","x":299,"height":169,"y":1,"width":168},{"name":"猫01伸/右手伸直","x":299,"height":169,"y":172,"width":168},{"name":"猫01/身体","x":340,"height":180,"y":343,"width":122},{"name":"猫01/领带","x":1,"height":156,"y":411,"width":120},{"name":"猫01/右耳","x":155,"height":76,"y":602,"width":90},{"name":"猫01/左耳","x":67,"height":85,"y":602,"width":86},{"name":"猫01/组_1","x":1,"height":185,"y":1,"width":296},{"name":"猫01/右眼","x":247,"height":60,"y":666,"width":59},{"name":"猫01/右眉毛","x":67,"height":5,"y":595,"width":33},{"name":"猫01/左眼","x":1,"height":60,"y":686,"width":59},{"name":"猫01/左眉毛","x":247,"height":12,"y":602,"width":31},{"name":"猫01/眼镜","x":301,"height":63,"y":525,"width":170},{"name":"猫01/胡子","x":123,"height":85,"y":515,"width":176},{"name":"猫01/鼻子","x":67,"height":24,"y":569,"width":28},{"name":"猫01/嘴","x":1,"height":30,"y":299,"width":65},{"name":"猫01/帽子","x":123,"height":102,"y":411,"width":158}],"height":1024,"width":512}
\ No newline at end of file
{
"ver": "1.0.1",
"uuid": "13437f14-c456-4c90-8a52-0b3de4838632",
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.3.5",
"uuid": "6cb0a3b3-48aa-42a7-a692-58c5a5f6c46c",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 512,
"height": 1024,
"platformSettings": {},
"subMetas": {
"mao_tex": {
"ver": "1.0.4",
"uuid": "c36b1fcb-9a9c-422b-9910-e6f6688a8b12",
"rawTextureUuid": "6cb0a3b3-48aa-42a7-a692-58c5a5f6c46c",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": -7.5,
"offsetY": 138.5,
"trimX": 1,
"trimY": 1,
"width": 495,
"height": 745,
"rawWidth": 512,
"rawHeight": 1024,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
{
"ver": "1.1.2",
"uuid": "2e8737c9-ef76-4dcd-98bd-03379d8c5634",
"isBundle": false,
"bundleName": "",
"priority": 1,
"compressionType": {},
"optimizeHotUpdate": {},
"inlineSpriteFrames": {},
"isRemoteBundle": {},
"subMetas": {}
}
\ No newline at end of file
{"frameRate":24,"name":"op-osmo","version":"5.5","compatibleVersion":"5.5","armature":[{"type":"Armature","frameRate":24,"name":"armatureName","aabb":{"x":-391.6,"y":-286.4,"width":773,"height":598},"bone":[{"name":"root","transform":{"scX":0.6,"scY":0.6}},{"length":139,"name":"书","parent":"root","transform":{"x":-15.6,"y":245.3,"skX":-90,"skY":-90}},{"length":222,"name":"指屏幕","parent":"root","transform":{"x":171.4,"y":309.7,"skX":-105.1567,"skY":-105.1567}},{"length":357,"name":"光","parent":"root","transform":{"x":-12.15,"y":-275.95,"skX":90.7286,"skY":90.7286}},{"name":"bone","parent":"root"},{"length":57,"name":"右-上手","parent":"书","transform":{"x":-48.45,"y":339.05,"skX":-12.5288,"skY":-12.5288}},{"length":38,"name":"左-上手","parent":"书","transform":{"x":-26.55,"y":-332.85,"skX":11.8232,"skY":11.8232}},{"name":"右-下手","parent":"右-上手","transform":{"x":48.6792,"y":76.43}},{"name":"左-下手","parent":"左-上手","transform":{"x":38.0594,"y":-62.2181}}],"slot":[{"name":"480","parent":"bone"},{"name":"左-下手","parent":"左-下手"},{"name":"右-下手","parent":"右-下手"},{"name":"书","parent":"书"},{"name":"左-上手","parent":"左-上手"},{"name":"右-上手","parent":"右-上手"},{"name":"p","parent":"root"},{"name":"闪光灯","parent":"root","color":{"aM":0}},{"name":"绿色按钮","parent":"root","color":{"aM":0}},{"name":"指屏幕","parent":"指屏幕","color":{"aM":0}},{"name":"光","parent":"光","color":{"aM":0}}],"skin":[{"slot":[{"name":"书","display":[{"name":"书","transform":{"x":82.3,"y":7.1,"skX":90,"skY":90}}]},{"name":"光","display":[{"name":"光","transform":{"x":296.92,"y":-4.43,"skX":-90.73,"skY":-90.73}}]},{"name":"指屏幕","display":[{"type":"mesh","name":"指屏幕","width":255,"height":430,"vertices":[7.88,-68.68,-5.66,-18.68,-28.7,66.35,-1.19,73.81,54.52,78.69,100.13,74.99,121.12,81.81,158.46,100.01,187.95,109.14,213.39,120.59,242.85,104.58,305.16,76.91,328.61,49.02,353.45,37.47,392.66,32.13,424.55,28.18,438.53,-13.67,443.18,-36.39,402.6,-42.83,357.83,-45.84,355.12,-86.51,347.41,-95.9,272.94,-116.07,229.62,-107.97,176.46,-97.24,124.04,-85.18,76.58,-74.05],"uvs":[0.45118,1.00012,0.65431,1.00012,0.9998,1.00012,0.9998,0.93384,0.96118,0.80581,0.90039,0.7057,0.90471,0.65442,0.93529,0.55953,0.93961,0.48779,0.95686,0.42372,0.86608,0.36733,0.69745,0.2443,0.56784,0.2086,0.49863,0.15988,0.43824,0.07512,0.39059,0.00593,0.21784,0,0.12706,0.00337,0.14431,0.09837,0.17882,0.2007,0.02765,0.23151,0,0.25453,0,0.43395,0.0751,0.52628,0.1702,0.63907,0.26961,0.74942,0.36039,0.84919],"triangles":[1,2,3,4,1,3,10,8,9,5,26,4,26,1,4,24,7,8,10,24,8,24,6,7,23,24,10,25,5,6,24,25,6,25,26,5,12,23,11,11,23,10,22,23,19,19,23,12,26,0,1,13,19,12,14,19,13,18,19,14,15,16,14,16,18,14,21,22,19,20,21,19,17,18,16],"edges":[0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,0],"userEdges":[]}]},{"name":"绿色按钮","display":[{"name":"绿色按钮","transform":{"x":-11.5,"y":-168.5}}]},{"name":"闪光灯","display":[{"name":"闪光灯","transform":{"x":-10.5,"y":-276}}]},{"name":"p","display":[{"name":"p","transform":{"x":-9,"y":-157.5}}]},{"name":"右-上手","display":[{"name":"右-上手","transform":{"x":42.43,"y":17.67,"skX":102.53,"skY":102.53}}]},{"name":"左-上手","display":[{"name":"左-上手","transform":{"x":22.95,"y":-4.34,"skX":78.18,"skY":78.18}}]},{"name":"左-下手","display":[{"name":"左-下手","transform":{"x":-0.41,"y":57.35,"skX":78.18,"skY":78.18}}]},{"name":"480","display":[{"name":"480","transform":{"scX":1.68,"scY":1.68}}]},{"name":"右-下手","display":[{"name":"右-下手","transform":{"x":8.12,"y":-56.59,"skX":102.53,"skY":102.53}}]}]}],"animation":[{"duration":130,"playTimes":0,"name":"normal","bone":[{"name":"书","translateFrame":[{"duration":11,"tweenEasing":0,"y":319.58},{"duration":26,"tweenEasing":0},{"duration":12,"tweenEasing":0},{"duration":24,"tweenEasing":0,"x":-136.71},{"duration":12,"tweenEasing":0,"x":-136.71},{"duration":45,"x":141.15}]},{"name":"右-上手","translateFrame":[{"duration":99},{"duration":15,"tweenEasing":0},{"duration":16,"x":-284.55}]},{"name":"左-上手","translateFrame":[{"duration":99},{"duration":15,"tweenEasing":0},{"duration":16,"x":-306.45,"y":2.98}]},{"name":"指屏幕","translateFrame":[{"duration":50},{"duration":5,"tweenEasing":0},{"duration":3,"tweenEasing":0,"x":-73.19,"y":-78.84},{"duration":3,"tweenEasing":0,"x":-73.19,"y":-78.84},{"duration":69}]}],"slot":[{"name":"闪光灯","colorFrame":[{"duration":11},{"tweenEasing":0,"value":{"aM":0}},{"duration":2,"tweenEasing":0},{"tweenEasing":0},{"tweenEasing":0,"value":{"aM":0}},{"tweenEasing":0,"value":{"aM":0}},{"tweenEasing":0},{"tweenEasing":0},{"duration":111,"value":{"aM":0}}]},{"name":"光","colorFrame":[{"duration":18,"tweenEasing":0,"value":{"aM":0}},{"tweenEasing":0,"value":{"aM":0}},{"duration":111}]}],"ffd":[{"name":"指屏幕","slot":"指屏幕","frame":[{"duration":50},{"duration":5,"tweenEasing":0},{"duration":3,"tweenEasing":0,"vertices":[-79.69,-6.05,-97.34,0,-92.79,10.19]},{"duration":3,"tweenEasing":0,"vertices":[-79.69,-6.05,-97.34,0,-92.79,10.19]},{"duration":26,"tweenEasing":0},{"duration":5,"tweenEasing":0},{"duration":3,"tweenEasing":0,"vertices":[-79.69,-6.05,-97.34,0,-92.79,10.19]},{"duration":3,"tweenEasing":0,"vertices":[-79.69,-6.05,-97.34,0,-92.79,10.19]},{"duration":32}]}]}],"defaultActions":[{"gotoAndPlay":"normal"}],"canvas":{"width":760,"height":510}}]}
\ No newline at end of file
{
"ver": "1.0.1",
"uuid": "4645d6d5-a682-4781-ae60-15a57701ee55",
"subMetas": {}
}
\ No newline at end of file
{"name":"op-osmo","SubTexture":[{"name":"480","x":1,"height":488,"y":601,"width":728},{"name":"左-下手","x":772,"height":172,"y":1,"width":179},{"name":"右-下手","x":772,"height":172,"y":175,"width":179},{"name":"书","x":1,"height":312,"y":1091,"width":773},{"name":"左-上手","x":772,"height":143,"y":349,"width":102},{"name":"右-上手","x":876,"height":143,"y":349,"width":101},{"name":"p","x":1,"height":285,"y":1405,"width":362},{"name":"闪光灯","x":762,"height":27,"y":1033,"width":28},{"name":"绿色按钮","x":731,"height":29,"y":1033,"width":29},{"name":"指屏幕","x":731,"height":430,"y":601,"width":255},{"name":"光","x":1,"height":598,"y":1,"width":769}],"imagePath":"op-osmo_tex.png","height":2048,"width":1024}
\ No newline at end of file
{
"ver": "1.0.1",
"uuid": "71ab854c-938f-45ed-877a-a35bb3a4525b",
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.3.5",
"uuid": "aac322ca-9f15-4ef2-aaf5-847f7ca1b29d",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 1024,
"height": 2048,
"platformSettings": {},
"subMetas": {
"op-osmo_tex": {
"ver": "1.0.4",
"uuid": "ed323cb2-ab5d-4da1-8dce-09de5e3ef255",
"rawTextureUuid": "aac322ca-9f15-4ef2-aaf5-847f7ca1b29d",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": -18.5,
"offsetY": 178.5,
"trimX": 1,
"trimY": 1,
"width": 985,
"height": 1689,
"rawWidth": 1024,
"rawHeight": 2048,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
{ {
"ver": "1.2.9", "ver": "1.2.9",
"uuid": "57ea7c61-9b8b-498a-b024-c98ee9124beb", "uuid": "dc1f1180-1ff4-4e67-b2e5-ad8dd02745b0",
"asyncLoadAssets": false, "asyncLoadAssets": false,
"autoReleaseAssets": true, "autoReleaseAssets": false,
"subMetas": {} "subMetas": {}
} }
\ No newline at end of file
This diff is collapsed.
{ {
"ver": "1.0.8", "ver": "1.0.8",
"uuid": "f4ede462-f8d7-4069-ba80-915611c058ca", "uuid": "c996f06a-f561-4a96-a811-9c8e3d63efbf",
"isPlugin": false, "isPlugin": false,
"loadPluginInWeb": true, "loadPluginInWeb": true,
"loadPluginInNative": true, "loadPluginInNative": true,
......
export const defaultData = {
"exercises":{
"wordArr":[
{
"val":"A",
"audioUrl":"http://staging-teach.cdn.ireadabc.com/8b5ecca5d4509e1b8a7e81e69d8db615.mp3"
},
{
"val":"a",
"audioUrl":"http://staging-teach.cdn.ireadabc.com/607af37644501e678de6cbafee555948.mp3"
}
],
"word2Arr":[
{
"val":"Angry"
},
{
"val":"Apple"
}
],
"picUrl":"http://staging-teach.cdn.ireadabc.com/101cdabba6404b73292d3b676f4683b1.png",
"audioUrl":"http://staging-teach.cdn.ireadabc.com/bbab99eb9f5fe3cbe2d24cf80594d8c9.mp3",
"lrcData":{
"audio_url":"http://staging-teach.cdn.ireadabc.com/bbab99eb9f5fe3cbe2d24cf80594d8c9.mp3",
"fontSize":24,
"lineHeight":32,
"lyrics":[
{
"time":0.503067,
"data":"",
"newLine":false
},
{
"time":1.503067,
"data":"",
"newLine":false
},
{
"time":3.438793,
"data":"",
"newLine":false
}
]
}
}
,
"guideAudioUrl1":"http://staging-teach.cdn.ireadabc.com/c3b83a24fd8f9b37ee72409cdb45e3f7.mp3",
"guideAudioUrl2":"http://staging-teach.cdn.ireadabc.com/9f6ff5d0617bf274ee2d9af4cfc93c62.mp3",
"guideAudioUrl3":"http://staging-teach.cdn.ireadabc.com/c3b83a24fd8f9b37ee72409cdb45e3f7.mp3"
}
{ {
"ver": "2.3.5", "ver": "2.3.5",
"uuid": "efa5fa09-a4dd-4bfc-ab7e-17c19f85408f", "uuid": "e2b9da86-9338-4023-9e54-6b11ffaf2a3f",
"type": "sprite", "type": "sprite",
"wrapMode": "clamp", "wrapMode": "clamp",
"filterMode": "bilinear", "filterMode": "bilinear",
"premultiplyAlpha": false, "premultiplyAlpha": false,
"genMipmaps": false, "genMipmaps": false,
"packable": true, "packable": true,
"width": 366, "width": 1088,
"height": 336, "height": 800,
"platformSettings": {}, "platformSettings": {},
"subMetas": { "subMetas": {
"1orange": { "bg_bg": {
"ver": "1.0.4", "ver": "1.0.4",
"uuid": "43d1e79d-6de8-4dcb-b8ce-d767df7913aa", "uuid": "ee79b5fd-7a10-49eb-9071-742ba98290c9",
"rawTextureUuid": "efa5fa09-a4dd-4bfc-ab7e-17c19f85408f", "rawTextureUuid": "e2b9da86-9338-4023-9e54-6b11ffaf2a3f",
"trimType": "auto", "trimType": "auto",
"trimThreshold": 1, "trimThreshold": 1,
"rotated": false, "rotated": false,
"offsetX": 0, "offsetX": 0,
"offsetY": -0.5, "offsetY": 0,
"trimX": 0, "trimX": 0,
"trimY": 1, "trimY": 0,
"width": 366, "width": 1088,
"height": 335, "height": 800,
"rawWidth": 366, "rawWidth": 1088,
"rawHeight": 336, "rawHeight": 800,
"borderTop": 0, "borderTop": 0,
"borderBottom": 0, "borderBottom": 0,
"borderLeft": 0, "borderLeft": 0,
......
{
"ver": "2.3.5",
"uuid": "2dbd4b21-0cc8-416f-916b-f2100592e3d2",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 1088,
"height": 231,
"platformSettings": {},
"subMetas": {
"bg_front": {
"ver": "1.0.4",
"uuid": "deb43340-7520-4981-b2d6-7cf54beaddda",
"rawTextureUuid": "2dbd4b21-0cc8-416f-916b-f2100592e3d2",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 1088,
"height": 231,
"rawWidth": 1088,
"rawHeight": 231,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
{
"ver": "2.3.5",
"uuid": "ab390cd9-a10b-4d53-879c-b816e0f46cab",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 1031,
"height": 515,
"platformSettings": {},
"subMetas": {
"bg_green": {
"ver": "1.0.4",
"uuid": "7571be05-f6ee-4272-b7af-46eaf5a8958e",
"rawTextureUuid": "ab390cd9-a10b-4d53-879c-b816e0f46cab",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": -12.5,
"trimX": 0,
"trimY": 25,
"width": 1031,
"height": 490,
"rawWidth": 1031,
"rawHeight": 515,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
export const defaultData = {
"pic_url": "http://staging-teach.cdn.ireadabc.com/ed94332a503c31e0908bd4c6923a2665.png",
"pic_url_2": "http://staging-teach.cdn.ireadabc.com/5fb60317ade0195d35ad8034d5370a7f.png",
"text": "This is a test label.",
"audio_url": "http://staging-teach.cdn.ireadabc.com/f47f1d7b5c160fe1c59500d180346240.mp3"
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment