Commit 77f1d8ef authored by 李维's avatar 李维

dev done

parent 9f3a2900
......@@ -353,64 +353,4 @@ npm start
点击“模板管理” 菜单,找到对应的模板卡片,点击“发布”按钮,在弹出的对话框中选中压缩包,然后点击“确定”,上传完成后,则发布就成功了
## 常见问题汇总
### 静态资源引用路径写法
css文件里面要带 .. , eg:
```
background-image: url("../../assets/playground-house/bg.jpg");
```
其他的文件(html、ts、resources.js)里路径要开头不带斜杠, eg:
```
src="assets/guess-read/btn.png"
```
### no such file or directory,
出现类似如:
```
Error: ENOENT: no such file or directory, open 'C:/publish/resources/xxxx/v1/index.html'
```
这样的代码时, 请确认新建模板的时候表单填写的“配置页面URL”与“展示页面URL” 填写的路径是否正确
### 已经发布的模板,制作课件时看不到
如果模板已经确认发布成功了,制作课件的时候却看不到这个模板,请编辑模板,查看模板类型是否选择为“课中模板”
### 有些模板上传图片或视频时,存在偶尔上传不上去的问题
此问题是因为有些异步的情况下 uploadUrl 获取不到导致的
在 constructor 或者 ngOnInit 方法里,一直轮询,直到获取到 uploadUrl
```
this.uploadUrl = (<any> window).courseware.uploadUrl();
this.uploadData = (<any> window).courseware.uploadData();
const fun = () => {
setTimeout(() => {
this.uploadUrl = (<any> window).courseware.uploadUrl();
this.uploadData = (<any> window).courseware.uploadData();
if(!this.uploadUrl){
fun();
}
}, 1000);
}
if(!this.uploadUrl){
fun();
}
```
### 模板编译CI不通过,报类似如下错误
```
ERROR in ./src/styles.scss Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js): ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js): Error: Node Sass version 5.0.0 is incompatible with ^4.0.0. at getSassImplementation
```
此情况属于老的模板遗留问题,需要在package.json里面锁一下node-sass的版本
```
"node-sass": "4.0.0"
```
\ No newline at end of file
......@@ -32,7 +32,7 @@
"spark-md5": "^3.0.0",
"tslib": "^1.10.0",
"zone.js": "~0.10.2",
"node-sass": "4.0.0"
"node-sass": "^4.0.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.900.3",
......
......@@ -24,6 +24,10 @@ import {AudioRecorderComponent} from './common/audio-recorder/audio-recorder.com
import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome';
import { fas } from '@fortawesome/free-solid-svg-icons';
import { far } from '@fortawesome/free-regular-svg-icons';
import { CoursewareFolderTableComponent } from './common/courseware-folder-table/courseware-folder-table.component';
import { CustomHotZone2Component } from './common/custom-hot-zone-2/custom-hot-zone-2.component';
// import { ImageChildrenEditorComponent } from './common/image-children-editor/image-children-editor.component';
registerLocaleData(zh);
......@@ -41,6 +45,17 @@ registerLocaleData(zh);
UploadVideoComponent,
CustomHotZoneComponent,
CoursewareFolderTableComponent,
CustomHotZone2Component,
// ImageChildrenEditorComponent,
LessonTitleConfigComponent,
PlayerContentWrapperComponent,
PlayerContentWrapperComponent
],
......
<nz-table
class="table-container"
#rowSelectionTable
[nzData]="data"
[nzScroll]="{ y: 'calc(100vh - 29rem)' }"
>
<thead
(nzSortChange)="sort($event)"
>
<tr>
<th nzWidth="62px"></th>
<th nzShowSort nzSortKey="name">Name</th>
<th nzWidth="200px" nzShowSort nzSortKey="updateon">Last</th>
</tr>
</thead>
<tbody>
<tr
*ngFor="let data of rowSelectionTable.data"
(dragstart)="onHandleDragStart($event, data)"
(drop)="data.type === 1 ? dropFolderHandler($event, data) : null"
(dragover)="data.type === 1 ? dragOverHandler($event, data) : null"
(dragleave)="data.type === 1 ? dragLeaveHandler($event) : null"
>
<td
nzShowCheckbox
[(nzChecked)]="data._checked"
[nzDisabled]="data.disabled"
(nzCheckedChange)="onHandleChecked(data)"
></td>
<td>
<div
class="td-type-name-wrap"
*ngIf="data.type === 1"
>
<img
class="p-icon"
src="./assets/folder.png"
(dblclick)="dbClickFolder(data)"
/>
<span>
<div class="p-name" [title]="data.name" *ngIf="!data._inEdit" (dblclick)="onUpdateName(data)">
{{data.name}}
</div>
<input
class="p-name-input"
appAutofocusSelect
*ngIf="data._inEdit"
(blur)="onConfirmFolderName(data)"
(keydown.enter)="onConfirmFolderName(data)"
[(ngModel)]="data._name"/>
</span>
<img class="p-share-pic" *ngIf="isInLinkFolder" src="./assets/link_share.png" (dblclick)="dbClickFile(data)">
</div>
<div
class="td-type-name-wrap"
*ngIf="data.type === 2"
>
<img
class="p-icon"
src="./assets/cw.png"
(dblclick)="dbClickFile(data)"
/>
<span>
<div class="p-name" title="{{data.name}}" *ngIf="!data._inEdit" (dblclick)="onUpdateName(data)">
{{data.name}}
</div>
<input
class="p-name-input"
appAutofocusSelect
*ngIf="data._inEdit"
(blur)="onConfirmCoursewareName(data)"
(keydown.enter)="onConfirmCoursewareName(data)"
[(ngModel)]="data._name"/>
</span>
<img class="p-share-pic" *ngIf="isInLinkFolder" src="./assets/link_share.png" (dblclick)="dbClickFile(data)">
</div>
</td>
<td>{{data.updateon | date : 'yyyy-MM-dd HH:mm:ss'}}</td>
</tr>
</tbody>
</nz-table>
.table-container {
.td-type-name-wrap {
position: relative;
display: flex;
justify-content: flex-start;
align-items: center;
img {
width: 32px;
margin-right: 8px;
}
}
}
.p-share-pic {
width: 0.8rem !important;
height: 0.8rem;
position: absolute;
left: -0.2rem;
top: 1.3rem;
}
import {Component, EventEmitter, Input, Output} from '@angular/core';
@Component({
selector: 'app-courseware-folder-table',
templateUrl: './courseware-folder-table.component.html',
styleUrls : ['./courseware-folder-table.component.scss']
})
export class CoursewareFolderTableComponent {
@Input() data = [];
@Input() isInLinkFolder = false;
@Output() handleSelect = new EventEmitter();
@Output() enterFolder = new EventEmitter();
@Output() enterCourseware = new EventEmitter();
@Output() updateName = new EventEmitter();
@Output() confirmFolderName = new EventEmitter();
@Output() confirmCoursewareName = new EventEmitter();
@Output() moveByDrag = new EventEmitter();
@Output() handleSort = new EventEmitter();
constructor() {
// console.log(this.data);
}
onHandleChecked(item) {
this.handleSelect.emit(item);
}
dbClickFolder(item) {
this.enterFolder.emit(item);
}
dbClickFile(item) {
this.enterCourseware.emit(item);
}
onUpdateName(item) {
if (this.isInLinkFolder) {
return;
}
item._name = item.name;
item._inEdit = true;
this.updateName.emit(item);
}
onConfirmFolderName(item) {
this.confirmFolderName.emit(item);
}
onConfirmCoursewareName(item) {
this.confirmCoursewareName.emit(item);
}
sort(sort: { key: string, value: string }): void {
const { key, value } = sort;
// remove value suffix 'end', origin value ['descend', 'ascend']
const t = value ? value.substr(0, value.length - 3) : value;
this.handleSort.emit({ key, value: t });
}
onHandleDragStart(ev, item) {
if (this.isInLinkFolder) {
return;
}
ev.dataTransfer.setData('sid', item.sid);
ev.dataTransfer.setData('type', item.type);
}
dragOverHandler(ev, item) {
if (this.isInLinkFolder) {
return;
}
ev.preventDefault();
ev.dataTransfer.dropEffect = 'move';
ev.currentTarget.style.background = '#d4d4d4';
}
dragLeaveHandler(ev) {
if (this.isInLinkFolder) {
return;
}
ev.preventDefault();
ev.currentTarget.style.background = '';
}
dropFolderHandler(ev, item) {
if (this.isInLinkFolder) {
return;
}
ev.preventDefault();
ev.currentTarget.style.background = '';
const sid = ev.dataTransfer.getData('sid');
const type = ev.dataTransfer.getData('type');
const object = { sid, type, item };
this.moveByDrag.emit(object);
}
}
This diff is collapsed.
.p-image-children-editor {
width: 100%;
height: 100%;
border-radius: 0.5rem;
min-width: 1200px;
border: 2px solid #ddd;
.preview-box {
margin: auto;
width: 100%;
// height: 35vw;
border: 2px dashed #ddd;
border-radius: 0.5rem;
background-color: #fafafa;
text-align: center;
color: #aaa;
.preview-img {
height: 100%;
width: auto;
}
}
.bg-box {
margin-bottom: 1rem;
}
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.img-box {
margin: 1rem;
}
.img-box-upload {
width: 120px;
height: 80px;
}
.add-btn {
margin-top: 1rem;
width: 200px;
height: 90px;
display: flex;
align-items: center;
justify-content: center;
}
}
.save-box {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
.save-btn {
width: 160px;
height: 40px;
//margin-top: 20px;
margin-bottom: 20px;
display: flex;
align-items: center;
justify-content: center;
}
}
h5 {
margin-top: 1rem;
}
//@import '../../../style/common_mixin';
//
//.p-image-uploader {
// position: relative;
// display: block;
// width: 100%;
// height: 0;
// padding-bottom: 56.25%;
// .p-box {
// position: absolute;
// left: 0;
// top: 0;
// right: 0;
// bottom: 0;
// border: 2px dashed #ddd;
// border-radius: 0.5rem;
// background-color: #fafafa;
// text-align: center;
// color: #aaa;
// .p-upload-icon {
// text-align: center;
// margin: auto;
// .anticon-upload {
// color: #888;
// font-size: 5rem;
// }
// .p-progress-bar {
// position: relative;
// width: 20rem;
// height: 1.5rem;
// border: 1px solid #ccc;
// border-radius: 1rem;
// .p-progress-bg {
// background-color: #1890ff;
// border-radius: 1rem;
// height: 100%;
// }
// .p-progress-value {
// position: absolute;
// top: 0;
// left: 0;
// width: 100%;
// height: 100%;
// text-shadow: 0 0 4px #000;
// color: white;
// text-align: center;
// font-size: 0.9rem;
// line-height: 1.5rem;
// }
// }
// }
// .p-preview {
// width: 100%;
// height: 100%;
// //background-image: url("https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png");
// @include k-img-bg();
// }
// }
//}
//
//.p-btn-delete {
// position: absolute;
// right: -0.5rem;
// top: -0.5rem;
// width: 2rem;
// height: 2rem;
// border: 0.2rem solid white;
// border-radius: 50%;
// font-size: 1.2rem;
// background-color: #fb781a;
// color: white;
// text-align: center;
//}
//
//.p-upload-progress-bg {
// position: absolute;
// width: 100%;
// height: 100%;
// display: flex;
// align-items: center;
// justify-content: center;
// & .i-text {
// position: absolute;
// text-align: center;
// color: white;
// text-shadow: 0 0 2px rgba(0, 0, 0, .85);
// }
// & .i-bg {
// position: absolute;
// left: 0;
// top: 0;
// height: 100%;
// background-color: #27b43f;
// border-radius: 0.5rem;
// }
//}
//
//
//:host ::ng-deep .ant-upload {
// display: block;
//}
......@@ -14,7 +14,7 @@ import {Subject} from 'rxjs';
import {debounceTime} from 'rxjs/operators';
import {EditorItem, HotZoneImg, HotZoneItem, HotZoneLabel, Label, MySprite, removeItemFromArr} from './Unit';
import TWEEN from '@tweenjs/tween.js';
import {getMinScale} from "../../play/Unit";
import {getMinScale} from "./Unit";
import {tar} from "compressing";
......
@import '../style/common_mixin.css';
.model-content {
width: 100%;
height: 100%;
}
This diff is collapsed.
@import '../style/common_mixin';
.colorDemo {
width: 20px;
height: 32px;
margin-left: 5px;
}
.model-content {
width: 100%;
height: 100%;
}
nz-select {
width: 100%;
}
@font-face
{
font-family: 'BRLNSDB';
src: url("../../assets/font/BRLNSDB.TTF") ;
}
@font-face
{
font-family: 'BRLNSB';
src: url("../../assets/font/BRLNSB.TTF") ;
}
@font-face
{
font-family: 'BRLNSR';
src: url("../../assets/font/BRLNSR.TTF") ;
}
@font-face
{
font-family: 'GOTHIC';
src: url("../../assets/font/GOTHIC.TTF") ;
}
@font-face
{
font-family: 'GOTHICB';
src: url("../../assets/font/GOTHICB.TTF") ;
}
@font-face
{
font-family: 'GOTHICBI';
src: url("../../assets/font/GOTHICBI.TTF") ;
}
@font-face
{
font-family: 'GOTHICI';
src: url("../../assets/font/GOTHICI.TTF") ;
}
@font-face
{
font-family: 'MMTextBook';
src: url("../../assets/font/MMTextBook.otf") ;
}
@font-face
{
font-family: 'MMTextBook-Bold';
src: url("../../assets/font/MMTextBook-Bold.otf") ;
}
@font-face
{
font-family: 'MMTextBook-BoldItalic';
src: url("../../assets/font/MMTextBook-BoldItalic.otf") ;
}
@font-face
{
font-family: 'MMTextBook-Italic';
src: url("../../assets/font/MMTextBook-Italic.otf") ;
}
import {Component, EventEmitter, Input, OnDestroy, OnChanges, OnInit, Output, ApplicationRef, ChangeDetectorRef} from '@angular/core';
import {Component, EventEmitter, Input, OnDestroy, OnChanges, OnInit, Output, ApplicationRef} from '@angular/core';
import {ChangeDetectorRef} from '@angular/core';
@Component({
selector: 'app-form',
templateUrl: './form.component.html',
styleUrls: ['./form.component.css']
styleUrls: ['./form.component.scss']
})
export class FormComponent implements OnInit, OnChanges, OnDestroy {
// 储存数据用
saveKey = "test_0011";
// 储存对象
item;
constructor(private appRef: ApplicationRef,private changeDetectorRef: ChangeDetectorRef) {
}
picArr = [];
_item: any;
saveData;
wordArr = [];
saveKey='YM5-6'
constructor(private appRef: ApplicationRef,private changeDetectorRef: ChangeDetectorRef) {}
ngOnInit() {
this.item = {};
this.item = {contentObj: {}};
// 获取存储的数据
(<any> window).courseware.getData((data) => {
(<any> window).courseware.getData(( data ) => {
if(data && !data.contentObj) {data.contentObj={}}
if (data) {
this.item = data;
}
this.init();
this.ngOnInit2()
this.changeDetectorRef.markForCheck();
this.changeDetectorRef.detectChanges();
this.refresh();
}, this.saveKey);
}
@Input()
set item(item) {
this._item = item;
this.getData(item.contentObj.data);
}
get item() {
return this._item;
}
@Output()
update = new EventEmitter();
constructor2() {
}
ngOnInit2() {
// this.initData();
}
ngOnChanges() {
}
ngOnDestroy() {
}
recordingIndex = []
listOfOption = ['1', '2', '3', '4'];
indexAudio = [];
onAudioUploadSuccessByItem_new(e, key, item?) {
if(item){
item[key] = e.url;
}else{
this.indexAudio[key] = e.url;
}
this.save();
}
getData(data) {
this.saveData = {};
this.saveData.title = {
t_font_color1:'#70401e',
t_font1:'BRLNSDB',
t_font_size1:40,
t_font_color:'#000000',
t_font:'BRLNSDB',
t_font_size:40,
t_val1: "C",
t_val2: "Listen, write circle and read"
};
// 获取存储的数据
if (data) {
this.saveData = data;
}
if ( !this.saveData.wordArr ) {
this.saveData.wordArr = [];
}
if(!this.saveData.indexAudio) {
this.saveData.indexAudio = []
}
if(!this.saveData.recordingIndex) {
this.saveData.recordingIndex = []
}
this.init2();
this.item.contentObj.data = this.saveData;
console.log(this.saveData)
}
init() {
mapToOptionLabel(index) {
let lebel = ""
switch(index) {
case "1": lebel = "左上"; break;
case "2": lebel = "左下"; break;
case "3": lebel = "右上"; break;
case "4": lebel = "右下"; break;
}
return lebel
}
init2(){
//标题
if(!this.saveData.title){
this.saveData.title = {
t_font_color1:'#70401e',
t_font1:'BRLNSDB',
t_font_size1:40,
t_font_color:'#000000',
t_font:'BRLNSDB',
t_font_size:40,
t_val1: "", // "C",
t_val2: "" // "Listen, write circle and read"
};
}
if (this.saveData.wordArr) {
this.wordArr = this.saveData.wordArr;
} else {
this.wordArr = this.getDefaultWordArr();
this.saveData.wordArr = this.wordArr;
}
if(this.saveData.indexAudio) {
this.indexAudio = this.saveData.indexAudio
} else {
this.indexAudio = ["", "", "", ""]
this.saveData.indexAudio = this.indexAudio
}
}
......@@ -60,26 +168,122 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
*/
onImageUploadSuccess(e, key) {
this.item[key] = e.url;
this.save();
this.saveData[key] = e.url;
this.save();
}
/**
* 储存音频数据
* @param e
*/
onAudioUploadSuccess(e, key) {
this.item[key] = e.url;
onAudioUploadSuccess(e, item, key) {
item[key] = e.url;
this.save();
}
onAudioUploadSuccessByItem(e, item, key) {
item[key] = e.url;
this.save();
}
/**
* 储存数据
*/
save() {
saveOld() {
this.item.contentObj.data = this.saveData;
this.save();
}
/**
* 刷新 渲染页面
*/
refreshOld() {
// setTimeout(() => {
// this.appRef.tick();
// }, 1);
}
deleteItem(index) {
if (index !== -1) {
this.wordArr.splice(index, 1);
}
// this.save();
this.save();
}
addItem() {
let item = this.wordItemData();
this.wordArr.push(item);
this.saveItem();
}
// addLetterItem(letters){
// let letter = this.letterData();
// letters.push(letter);
// this.save();
// }
deleteLetterItem(letters, index){
if (index !== -1) {
letters.splice(index, 1);
}
this.save();
}
wordItemData() {
let color = "E5F4F9"
switch(this.wordArr.length) {
case 0: color = "E5F4F9"; break;
case 1: color = "F0EAF4"; break;
case 2: color = "F5F9EA"; break;
case 3: color = "FFF1EB"; break;
}
return {
words_left: "",
words_right: "",
correctOption: "left",
word_val: '',
word_audio_url: '',
letters: []
};
}
saveWordItem(index) {
let val = this.wordArr[index].word_val;
this.wordArr[index].letters = [];
for(let i=0;i<val.length;i++){
this.wordArr[index].letters.push({
letter_val: val[i],
letter_color: 'C04',
is_: '0'
});
}
this.save();
}
saveItem() {
this.save();
}
getDefaultWordArr() {
let arr = [];
return arr;
}
save () {
if(this.item && this.saveData) {
if(!this.item.contentObj) {
this.item.contentObj={}
}
this.item.contentObj.data = this.saveData
// console.log(this.saveData)
}
(<any> window).courseware.setData(this.item, null, this.saveKey);
this.refresh();
}
......
This diff is collapsed.
.game-container {
width: 100%;
height: 100%;
background: #ffffff;
background-size: cover;
}
#canvas {
}
@font-face
{
font-family: 'BRLNSDB';
src: url("../../assets/font/BRLNSDB.TTF") ;
}
.game-container {
width: 100%;
height: 100%;
background: #ffffff;
background-size: cover;
}
#canvas {
}
@font-face
{
font-family: 'BRLNSDB';
src: url("../../assets/font/BRLNSDB.TTF") ;
}
@font-face
{
font-family: 'BRLNSB';
src: url("../../assets/font/BRLNSB.TTF") ;
}
@font-face
{
font-family: 'BRLNSR';
src: url("../../assets/font/BRLNSR.TTF") ;
}
@font-face
{
font-family: 'GOTHIC';
src: url("../../assets/font/GOTHIC.TTF") ;
}
@font-face
{
font-family: 'GOTHICB';
src: url("../../assets/font/GOTHICB.TTF") ;
}
@font-face
{
font-family: 'GOTHICBI';
src: url("../../assets/font/GOTHICBI.TTF") ;
}
@font-face
{
font-family: 'GOTHICI';
src: url("../../assets/font/GOTHICI.TTF") ;
}
@font-face
{
font-family: 'MMTextBook';
src: url("../../assets/font/MMTextBook.otf") ;
}
@font-face
{
font-family: 'MMTextBook-Bold';
src: url("../../assets/font/MMTextBook-Bold.otf") ;
}
@font-face
{
font-family: 'MMTextBook-BoldItalic';
src: url("../../assets/font/MMTextBook-BoldItalic.otf") ;
}
@font-face
{
font-family: 'MMTextBook-Italic';
src: url("../../assets/font/MMTextBook-Italic.otf") ;
}
This diff is collapsed.
const res = [
// ['bg', "assets/play/bg.jpg"],
['btn_left', "assets/play/btn_left.png"],
['btn_right', "assets/play/btn_right.png"],
// ['text_bg', "assets/play/text_bg.png"],
// ['bg', "assets/YM5-6/bg.jpg"],
['btn_left', "assets/YM5-6/btn_left.png"],
['btn_right', "assets/YM5-6/btn_right.png"],
['pause', "assets/YM5-6/pause.png"],
['play', "assets/YM5-6/play.png"]
// ['text_bg', "assets/YM5-6/text_bg.png"],
];
......@@ -11,8 +13,11 @@ const res = [
const resAudio = [
['click', "assets/play/music/click.mp3"],
['click', "assets/YM5-6/music/click.mp3"],
['newpage', "assets/YM5-6/music/newpage.mp3"],
['sm-choice-correct', "assets/YM5-6/music/sm-choice-correct.mp3"]
];
export {res, resAudio};
export default {
contentObj: {
data: {
title: {
t_font_color1: "#70401e",
t_font1: "BRLNSDB",
t_font_size1: 40,
t_font_color: "#000000",
t_font: "BRLNSDB",
t_font_size: 40,
t_val1: "C",
t_val2: "Listen, write circle and read",
},
wordArr: [
{
correctOption: "left",
words_left: "ear",
words_right: "eer",
word_val: "pea",
letters: [
{ letter_val: "p", letter_color: "C04", is_: "0" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "a", letter_color: "C05", is_: "1" },
],
},
{
words_left: "ear",
words_right: "eer",
correctOption: "right",
word_val: "steer",
word_audio_url: "",
letters: [
{ letter_val: "s", letter_color: "C04", is_: "0" },
{ letter_val: "t", letter_color: "C04", is_: "0" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "r", letter_color: "C05", is_: "1" },
],
},
{
words_left: "ear",
words_right: "eer",
correctOption: "right",
word_val: "beer",
word_audio_url: "",
letters: [
{ letter_val: "b", letter_color: "C04", is_: "0" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "r", letter_color: "C05", is_: "1" },
],
},
{
words_left: "ear",
words_right: "eer",
correctOption: "left",
word_val: "near",
word_audio_url: "",
letters: [
{ letter_val: "n", letter_color: "C04", is_: "0" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "a", letter_color: "C05", is_: "1" },
{ letter_val: "r", letter_color: "C05", is_: "1" },
],
},
{
words_left: "ear",
words_right: "eer",
correctOption: "right",
word_val: "engineer",
word_audio_url: "",
letters: [
{ letter_val: "e", letter_color: "C04", is_: "0" },
{ letter_val: "n", letter_color: "C04", is_: "0" },
{ letter_val: "g", letter_color: "C04", is_: "0" },
{ letter_val: "i", letter_color: "C04", is_: "0" },
{ letter_val: "n", letter_color: "C04", is_: "0" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "r", letter_color: "C05", is_: "1" },
],
},
{
words_left: "ear",
words_right: "eer",
correctOption: "left",
word_val: "earth",
word_audio_url: "",
letters: [
{ letter_val: "e", letter_color: "C05", is_: "1" },
{ letter_val: "a", letter_color: "C05", is_: "1" },
{ letter_val: "r", letter_color: "C05", is_: "1" },
{ letter_val: "t", letter_color: "C04", is_: "0" },
{ letter_val: "h", letter_color: "C04", is_: "0" },
],
},
{
words_left: "ear",
words_right: "eer",
correctOption: "left",
word_val: "",
word_audio_url: "",
letters: [],
},
{
words_left: "ear",
words_right: "eer",
correctOption: "left",
word_val: "",
word_audio_url: "",
letters: [],
},
],
indexAudio: [],
recordingIndex: [],
blockColor: "F02",
indexColor: "FFFF00",
optionColor_left: "FFFF00",
optionColor_right: "CCCCCC",
},
},
};
......@@ -7,6 +7,13 @@
<!-- <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<style>
html, body{
width: 100%;
height: 100%;
margin: 0;
}
</style>
<script type="text/javascript" src="https://staging-teach.cdn.ireadabc.com/h5template/h5-static-lib/js/air.js"></script>
</head>
......
/* You can add global styles to this file, and also import other style files */
@import "~ng-zorro-antd/ng-zorro-antd.min.css";
\ No newline at end of file
......@@ -21,6 +21,7 @@
]
},
"angularCompilerOptions": {
"enableIvy": false,
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true
}
......
......@@ -92,8 +92,7 @@
"variable-name": false,
"no-unused-expression": false,
"align": false,
"no-string-literal": false
"align": false
},
"rulesDirectory": [
"codelyzer"
......
This diff is collapsed.
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