Commit 9dd6533c authored by wangqinghua's avatar wangqinghua

init

parents
# Specifies intentionally untracked files to ignore when using Git
# http://git-scm.com/docs/gitignore
*~
*.sw[mnpcod]
*.log
*.tmp
*.tmp.*
log.txt
*.sublime-project
*.sublime-workspace
.vscode/
npm-debug.log*
.idea/
.sass-cache/
.tmp/
.versions/
.sourcemaps/
coverage/
node_modules/
tmp/
temp/
hooks/
platforms/
/www
/plugins
*.apk
plugins/android.json
plugins/ios.json
$RECYCLE.BIN/
.DS_Store
Thumbs.db
UserInterfaceState.xcuserstate
/build/www
/build
/build/www/assets/
/build/www/assets/cordova/cordova_android/
build/
npm install ionic serve ionic build --prod cordova build android --release xxxx data-wow-duration: Change the animation duration data-wow-delay: Delay before the animation starts data-wow-offset: Distance to start the animation (related to the browser bottom) data-wow-iteration: Number of times the animation is repeated
\ No newline at end of file
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.SGMW.start.h" version="1.3.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>骏菱学社</name>
<description>An awesome Ionic/Cordova app.</description>
<author email="hi@ionicframework.com" href="http://ionicframework.com/">Ionic Framework Team</author>
<content src="index.html" />
<access origin="*" />
<allow-navigation href="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<preference name="ScrollEnabled" value="false" />
<preference name="android-minSdkVersion" value="19" />
<preference name="BackupWebStorage" value="none" />
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="FadeSplashScreenDuration" value="300" />
<preference name="SplashShowOnlyFirstTime" value="false" />
<preference name="SplashScreen" value="screen" />
<preference name="SplashScreenDelay" value="30000" />
<feature name="CDVWKWebViewEngine">
<param name="ios-package" value="CDVWKWebViewEngine" />
</feature>
<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:networkSecurityConfig="@xml/network_security_config" android:usesCleartextTraffic="true" />
</edit-config>
<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
<allow-intent href="market:*" />
<icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
<icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
<icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
<icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
<icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
<icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
<splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
<splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
<splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
<splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
<splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
<splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
<splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
<splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
<splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
<splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
<splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
<splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<icon height="57" src="resources/ios/icon/icon.png" width="57" />
<icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
<icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
<icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
<icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
<icon height="20" src="resources/ios/icon/icon-20.png" width="20" />
<icon height="40" src="resources/ios/icon/icon-20@2x.png" width="40" />
<icon height="60" src="resources/ios/icon/icon-20@3x.png" width="60" />
<icon height="48" src="resources/ios/icon/icon-24@2x.png" width="48" />
<icon height="55" src="resources/ios/icon/icon-27.5@2x.png" width="55" />
<icon height="29" src="resources/ios/icon/icon-29.png" width="29" />
<icon height="58" src="resources/ios/icon/icon-29@2x.png" width="58" />
<icon height="87" src="resources/ios/icon/icon-29@3x.png" width="87" />
<icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
<icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
<icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
<icon height="88" src="resources/ios/icon/icon-44@2x.png" width="88" />
<icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
<icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
<icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
<icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
<icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
<icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
<icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
<icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
<icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
<icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
<icon height="172" src="resources/ios/icon/icon-86@2x.png" width="172" />
<icon height="196" src="resources/ios/icon/icon-98@2x.png" width="196" />
<icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
<splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
<splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
<splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
<splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
<splash height="1125" src="resources/ios/splash/Default-Landscape-2436h.png" width="2436" />
<splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
<splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
<splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
<splash height="2732" src="resources/ios/splash/Default-Portrait@~ipadpro.png" width="2048" />
<splash height="2048" src="resources/ios/splash/Default-Landscape@~ipadpro.png" width="2732" />
<splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
<splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
<splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
<splash height="2436" src="resources/ios/splash/Default-2436h.png" width="1125" />
<splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
</platform>
<plugin name="cordova-plugin-whitelist" spec="~1.3.3" />
<plugin name="cordova-plugin-statusbar" spec="~2.4.2" />
<plugin name="cordova-plugin-device" spec="~2.0.2" />
<plugin name="cordova-plugin-splashscreen" spec="~5.0.2" />
<plugin name="cordova-plugin-ionic-keyboard" spec="^2.1.3" />
<plugin name="cordova-plugin-nativestorage" spec="~2.3.2" />
<plugin name="cordova-plugin-advanced-http" spec="~2.1.1">
<variable name="OKHTTP_VERSION" value="3.10.0" />
</plugin>
<plugin name="cordova-plugin-file" spec="^6.0.2" />
<plugin name="cordova-plugin-file-opener2" spec="~2.2.1" />
<plugin name="cordova-plugin-inappbrowser" spec="~3.1.0" />
<plugin name="cordova-plugin-app-version" spec="~0.1.9" />
<plugin name="cordova-plugin-photo-library" spec="git+https://github.com/nilebma/cordova-plugin-photo-library.git">
<variable name="PHOTO_LIBRARY_USAGE_DESCRIPTION" value=" " />
</plugin>
</widget>
icon.png

218 KB

{
"name": "ionic-demo",
"integrations": {
"cordova": {}
},
"type": "ionic-angular",
"proxies": [
{
"path": "/wisdomgroup",
"proxyUrl": "http://61.129.91.113/wisdomgroup"
}
]
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "SGMW",
"version": "0.0.1",
"author": "Ionic Framework",
"homepage": "http://ionicframework.com/",
"private": true,
"scripts": {
"start": "ionic-app-scripts serve",
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint"
},
"dependencies": {
"@angular/animations": "5.2.11",
"@angular/common": "5.2.11",
"@angular/compiler": "5.2.11",
"@angular/compiler-cli": "5.2.11",
"@angular/core": "5.2.11",
"@angular/forms": "5.2.11",
"@angular/http": "5.2.11",
"@angular/platform-browser": "5.2.11",
"@angular/platform-browser-dynamic": "5.2.11",
"@ionic-native/app-availability": "^4.20.0",
"@ionic-native/app-version": "^4.20.0",
"@ionic-native/core": "~4.20.0",
"@ionic-native/file": "^4.20.0",
"@ionic-native/file-opener": "^4.20.0",
"@ionic-native/file-transfer": "^4.20.0",
"@ionic-native/http": "^4.20.0",
"@ionic-native/in-app-browser": "^4.20.0",
"@ionic-native/keyboard": "^4.20.0",
"@ionic-native/mobile-accessibility": "^4.20.0",
"@ionic-native/photo-library": "^4.20.0",
"@ionic-native/screen-orientation": "^4.20.0",
"@ionic-native/splash-screen": "~4.20.0",
"@ionic-native/status-bar": "~4.20.0",
"@ionic/storage": "2.2.0",
"com.lampa.startapp": "^6.1.6",
"cordova-android": "^8.0.0",
"cordova-browser": "^6.0.0",
"cordova-ios": "^5.0.1",
"cordova-plugin-add-swift-support": "^2.0.2",
"cordova-plugin-advanced-http": "^2.1.1",
"cordova-plugin-app-version": "^0.1.9",
"cordova-plugin-appavailability": "^0.4.2",
"cordova-plugin-file": "^6.0.2",
"cordova-plugin-file-opener2": "^2.2.1",
"cordova-plugin-imagepicker": "git+https://github.com/giantss/cordova-plugin-ImagePicker.git",
"cordova-plugin-inappbrowser": "^3.1.0",
"cordova-plugin-ionic-webview": "^1.2.1",
"cordova-plugin-nativestorage": "^2.3.2",
"cordova-plugin-network-information": "git+https://github.com/apache/cordova-plugin-network-information.git",
"cordova-plugin-photo-library": "git+https://github.com/nilebma/cordova-plugin-photo-library.git",
"cordova-plugin-screen-orientation": "^3.0.2",
"cordova-res": "^0.6.0",
"echarts": "^4.5.0",
"es6-promise-plugin": "^4.2.2",
"hammerjs": "^2.0.8",
"ionic-angular": "3.9.5",
"ionicons": "3.0.0",
"jsencrypt": "^3.0.0-rc.1",
"mockjs": "^1.1.0",
"ng2-pdf-viewer": "^5.2.0",
"phonegap-plugin-mobile-accessibility": "^1.0.5",
"rxjs": "5.5.11",
"sharp": "^0.23.0",
"sw-toolbox": "3.6.0",
"zone.js": "0.8.29"
},
"devDependencies": {
"@ionic/app-scripts": "3.2.2",
"cordova-plugin-device": "^2.0.2",
"cordova-plugin-ionic-keyboard": "^2.1.3",
"cordova-plugin-splashscreen": "^5.0.2",
"cordova-plugin-statusbar": "^2.4.2",
"cordova-plugin-whitelist": "^1.3.3",
"typescript": "~2.6.2",
"copy-webpack-plugin": "^4.5.1",
"web-webpack-plugin": "^1.10.3",
"webpack-merge": "^4.1.2"
},
"description": "An Ionic project",
"cordova": {
"plugins": {
"cordova-plugin-whitelist": {},
"cordova-plugin-statusbar": {},
"cordova-plugin-device": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-ionic-keyboard": {},
"cordova-plugin-nativestorage": {},
"cordova-plugin-advanced-http": {
"OKHTTP_VERSION": "3.10.0"
},
"cordova-plugin-file-opener2": {
"ANDROID_SUPPORT_V4_VERSION": "27.+"
},
"cordova-plugin-file": {},
"cordova-plugin-inappbrowser": {},
"cordova-plugin-app-version": {},
"cordova-plugin-ionic-webview": {},
"cordova-plugin-appavailability": {},
"com.lampa.startapp": {},
"cordova-plugin-imagepicker": {},
"cordova-plugin-screen-orientation": {},
"phonegap-plugin-mobile-accessibility": {},
"cordova-plugin-file-transfer": {},
"cordova-plugin-photo-library": {}
},
"platforms": [
"browser",
"ios",
"android"
]
}
}
import {Component, ElementRef, ViewChild} from '@angular/core';
import {NavParams, Platform} from 'ionic-angular';
import {StatusBar} from '@ionic-native/status-bar';
import {SplashScreen} from '@ionic-native/splash-screen';
import {TabsPage} from '../pages/tabs/tabs';
import {LoginPage} from "../pages/login/login";
import {Storage} from "@ionic/storage";
import {LoginService} from "../pages/login/login.service";
import {CommonService} from "../core/common.service";
import {timer} from "rxjs/observable/timer";
import {GetRequestService} from "../secret/getRequest.service";
import {AppVersion} from "@ionic-native/app-version";
import {AppUpdateService} from "../core/appUpdate.service";
import {MobileAccessibility} from "@ionic-native/mobile-accessibility";
import {HomePage} from "../pages/home/home";
@Component({
templateUrl: 'app.html'
})
export class MyApp {
@ViewChild('loadImg') loadImg: ElementRef;
rootPage: any;
showSplash = false;
load = {
imgUrl: null,
httpUrl: null
};
app = {
UpdateTips: false,
AppUrl: '',
UpdateText: '',
};
constructor(private platform: Platform, private statusBar: StatusBar, private commonSer: CommonService,
private getRequest: GetRequestService, private appVersion: AppVersion,
private appUpdate: AppUpdateService,
private mobileAccess: MobileAccessibility,
private splashScreen: SplashScreen, private storage: Storage, private loginSer: LoginService) {
this.platform.ready().then(() => {
this.rootPage = TabsPage;
//app字体不跟随手机字体大小变化
this.mobileAccess.usePreferredTextZoom(false);
this.splashScreen.show();
this.statusBar.show();
this.statusBar.overlaysWebView(false);
this.statusBar.backgroundColorByHexString('#343435');
this.statusBar.styleLightContent();
});
}
imgLoad() {
timer(500).subscribe(() => this.splashScreen.hide());
console.log('图片加载完成')
}
//检测版本
checkVersion() {
let versionCode;
let platform;
if (this.platform.is('ios')) platform = 'IOS';
if (this.platform.is('android')) platform = 'android';
this.appVersion.getVersionNumber().then((version: string) => {
versionCode = version.split('.').join('');
const data = {
code: platform
};
let res;
const onlineVersion = res.data.AppVersion.split('.').join('');
if (versionCode != onlineVersion) {
this.app.UpdateTips = true;
this.app.AppUrl = res.data.AppUrl;
this.app.UpdateText = res.data.UpdateText;
}
}).catch(err => {
console.log(err);
});
}
//打开链接
openUrl() {
if (this.load.httpUrl) {
this.commonSer.openUrlByBrowser(this.load.httpUrl);
}
}
}
import * as Mock from 'mockjs'; export const SERVER_API_URL = '/wisdomgroup'; Mock.setup( { timeout:5000, });
\ No newline at end of file
<div *ngIf="showSplash" class="splash">
<img (load)="imgLoad()" tappable (click)="openUrl()" [src]="load.imgUrl">
</div>
<ng-container *ngIf="!showSplash">
<ion-nav [root]="rootPage"></ion-nav>
</ng-container>
<ng-container *ngIf="app.UpdateTips">
<update-app (done)="app.UpdateTips = false" [AppUrl]="app.AppUrl" [UpdateText]="app.UpdateText"></update-app>
</ng-container>
import {NgModule, ErrorHandler, ElementRef} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {IonicApp, IonicModule, IonicErrorHandler, Config, NavParams} from 'ionic-angular';
import {MyApp} from './app.component';
import {HomePage} from '../pages/home/home';
import {TabsPage} from '../pages/tabs/tabs';
import {StatusBar} from '@ionic-native/status-bar';
import {SplashScreen} from '@ionic-native/splash-screen';
import {CoursePage} from "../pages/course/course";
import {MineModule} from "../pages/mine/mine.module";
import {ComponentsModule} from "../components/components.module";
import {LearningPageModule} from "../pages/learning/learning.module";
import {Keyboard} from "@ionic-native/keyboard";
import {CoursePageModule} from "../pages/course/course.module";
import {LoginPageModule} from "../pages/login/login.module";
import {HomeModule} from "../pages/home/home.module";
import {HTTP_INTERCEPTORS, HttpClient, HttpClientModule} from "@angular/common/http";
import {InterceptorProvider} from "../core/auth.interceptor";
import {LoginService} from "../pages/login/login.service";
import {HomeService} from "../pages/home/home.service";
import {IonicStorageModule} from "@ionic/storage";
import {FileTransfer, FileTransferObject} from "@ionic-native/file-transfer";
import {CommonService} from "../core/common.service";
import {HTTP} from "@ionic-native/http";
import {LearnService} from "../pages/learning/learn.service";
import {AppService} from "./app.service";
import {DataFormatService} from "../core/dataFormat.service";
import {BackButtonService} from "../core/backButton.service";
import {EmitService} from "../core/emit.service";
import {FileOpener} from "@ionic-native/file-opener";
import {File} from "@ionic-native/file";
import {FileService} from "../core/file.service";
import {UntilService} from "../core/until.service";
import {MineService} from "../pages/mine/mine.service";
import {ModalFromRightEnter, ModalFromRightLeave, ModalScaleEnter, ModalScaleLeave} from "./modal-transitions";
import {InAppBrowser} from "@ionic-native/in-app-browser";
import {PdfViewerComponent, PdfViewerModule} from "ng2-pdf-viewer";
import {TabService} from "../core/tab.service";
import {AppVersion} from "@ionic-native/app-version";
import {LogoutService} from "../secret/logout.service";
import {GetRequestService} from "../secret/getRequest.service";
import {AppUpdateService} from "../core/appUpdate.service";
import {DatePipe} from "@angular/common";
import {RandomWordService} from "../secret/randomWord.service";
import {MobileAccessibility} from "@ionic-native/mobile-accessibility";
import {ScreenOrientation} from "@ionic-native/screen-orientation";
import {GlobalData} from "../core/GlobleData";
import {VideoJsProvider} from '../providers/video-js/video-js';
import {PhotoLibrary} from "@ionic-native/photo-library";
import {DownloadFileProvider} from '../providers/download-file/download-file';
@NgModule({
declarations: [
MyApp,
TabsPage,
],
imports: [
BrowserModule,
HttpClientModule,
LoginPageModule,
MineModule,
LearningPageModule,
CoursePageModule,
HomeModule,
IonicStorageModule.forRoot(),
IonicModule.forRoot(MyApp, {
tabsHideOnSubPages: 'true',
backButtonText: '', //返回按钮显示中文
statusbarPadding: false,
iconModel: 'ios', //icon显示图标为IOS版
mode: 'ios', //安卓和IOS的样式以IOS样式为准
modalEnter: 'modal-slide-in',
modalLeave: 'modal-slide-out',
swipeBackEnabled: false
},
),
ComponentsModule,
],
bootstrap: [IonicApp],
entryComponents:
[
MyApp,
HomePage,
CoursePage,
TabsPage,
],
providers:
[
StatusBar,
SplashScreen,
Keyboard,
FileOpener,
InAppBrowser,
AppVersion,
File,
FileTransfer,
FileTransfer,
MobileAccessibility,
ScreenOrientation,
PhotoLibrary,
TabService,
LoginService,
HomeService,
CommonService,
LearnService,
MineService,
HTTP,
AppService,
DataFormatService,
BackButtonService,
EmitService,
FileService,
UntilService,
LogoutService,
GetRequestService,
AppUpdateService,
DatePipe,
RandomWordService,
GlobalData,
{provide: ErrorHandler, useClass: IonicErrorHandler},
{
provide: HTTP_INTERCEPTORS, useClass: InterceptorProvider, multi: true,
},
VideoJsProvider,
DownloadFileProvider,
],
})
export class AppModule {
constructor(public config: Config) {
this.setCustomTransitions();
}
private setCustomTransitions() {
this.config.setTransition('modal-from-right-enter', ModalFromRightEnter);
this.config.setTransition('modal-from-right-leave', ModalFromRightLeave);
this.config.setTransition('modal-scale-enter', ModalScaleEnter);
this.config.setTransition('modal-scale-leave', ModalScaleLeave);
}
}
// http://ionicframework.com/docs/theming/
@import "../theme/ionic";
@import "../theme/style";
@import "../theme/tab.icon";
@import "../assets/iconfont/iconfont";
// App Global Sass
// --------------------------------------------------
// Put style rules here that you want to apply globally. These
// styles are for the entire app and not just one component.
// Additionally, this file can be also used as an entry point
// to import other Sass files to be included in the output CSS.
//
// Shared Sass variables, which can be used to adjust Ionic's
// default Sass variables, belong in "theme/variables.scss".
//
// To declare rules for a specific mode, create a child rule
// for the .md, .ios, or .wp mode classes. The mode class is
// automatically applied to the <body> element in the app.
html, body, p {
margin: 0;
}
.space {
height: 10px;
background-color: #f2f2f2;
}
.splash {
position: absolute;
width: 100%;
height: 100%;
z-index: 999;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
}
}
.list-footer-page{
text-align: center;
padding: 20px;
color: #999999;
}
import {Injectable} from '@angular/core';import {BehaviorSubject, Subscription} from 'rxjs'; @Injectable()export class AppService { private mineSource:BehaviorSubject<any> = new BehaviorSubject({}); public mineInfo = this.mineSource.asObservable(); private fileSource:BehaviorSubject<any> = new BehaviorSubject(null); public fileInfo = this.fileSource.asObservable(); private wowSource:BehaviorSubject<any> = new BehaviorSubject(true); public wowInfo = this.wowSource.asObservable(); //个人信息 public setMine(value: any){ this.mineSource.next(value); } //文件信息 public setFile(value: any){ this.fileSource.next(value); } //加载动画 public setWow(value: any){ this.wowSource.next(value); } }
\ No newline at end of file
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
import { Animation, PageTransition } from 'ionic-angular'; /** * modal侧边栏的弹出方式 */ export class ModalFromRightEnter extends PageTransition { public init() { super.init(); const ele = this.enteringView.pageRef().nativeElement; const backdrop = new Animation(this.plt, ele.querySelector('ion-backdrop')); backdrop.beforeStyles({ 'z-index': 0, 'opacity': 0.3, 'visibility': 'visible' }); const wrapper = new Animation(this.plt, ele.querySelector('.modal-wrapper')); wrapper.beforeStyles({ 'opacity': 1 }); wrapper.fromTo('transform', 'translateX(100%)', 'translateX(20%)'); const contentWrapper = new Animation(this.plt, ele.querySelector('ion-content.content')); contentWrapper.beforeStyles({ 'width': '80%' }); this .element(this.enteringView.pageRef()) .duration(300) .easing('cubic-bezier(.25, .1, .25, 1)') .add(backdrop) .add(wrapper) .add(contentWrapper); }} export class ModalFromRightLeave extends PageTransition { public init() { super.init(); const ele = this.leavingView.pageRef().nativeElement; const backdrop = new Animation(this.plt, ele.querySelector('ion-backdrop')); backdrop.beforeStyles({ 'visibility': 'hidden' }); const wrapper = new Animation(this.plt, ele.querySelector('.modal-wrapper')); wrapper.fromTo('transform', 'translateX(20%)', 'translateX(100%)'); this .element(this.leavingView.pageRef()) .duration(300) .easing('cubic-bezier(.25, .1, .25, 1)') .add(backdrop) .add(wrapper); }} export class ModalScaleEnter extends PageTransition { public init() { super.init(); const ele = this.enteringView.pageRef().nativeElement; const wrapper = new Animation(this.plt, ele.querySelector('.modal-wrapper')); wrapper.beforeStyles({ 'opacity': 1 }); wrapper.fromTo('transform', 'scale(0)', 'scale(1)'); this .element(this.enteringView.pageRef()) .duration(400) .easing('cubic-bezier(.1, .7, .1, 1)') .add(wrapper); }} export class ModalScaleLeave extends PageTransition { public init() { super.init(); const ele = this.leavingView.pageRef().nativeElement; const wrapper = new Animation(this.plt, ele.querySelector('.modal-wrapper')); wrapper.fromTo('transform', 'scale(1)', 'scale(0)'); this .element(this.leavingView.pageRef()) .duration(400) .easing('cubic-bezier(.1, .7, .1, 1)') .add(wrapper); }}
\ No newline at end of file
This diff is collapsed.
.nowrap-1{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
}
.nowrap-2{
overflow:hidden;
text-overflow:ellipsis;
/* white-space:nowrap; */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
display: -webkit-box;
}
.nowrap-3{
overflow:hidden;
text-overflow:ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
display: -webkit-box;
}
.edit-div{
flex-shrink: 0;
}
.post-introduction-buttom>span:nth-child(2){
margin-left:10px;
}
.oldDate{
min-width: 80px;
}
.post-introduction-con img{
width: auto;
height:auto ;
min-width: 100%;
min-height: 100%;
max-width: none;
}
.post-introduction-con>.img-div>div{
background: #f2f2f2;
overflow: hidden;
}
.post-introduction-con>.img1{
background-size: cover;
background: #f2f2f2;
overflow: hidden;
}
.post-introduction-con>.img2{
display: flex;
overflow: hidden;
}
.post-introduction-con>.img3{
display: flex;
overflow: hidden;
}
.post-introduction-con>.img3>div{
height: 97px !important;
}
.post-introduction-con>.img3>div>div{
height: 97px !important;
}
.post-introduction-con>.img3>div>div,
.post-introduction-con>.img2>div>div{
background-size: cover;
overflow: hidden;
}
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
This diff is collapsed.
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1567339923088'); /* IE9 */
src: url('iconfont.eot?t=1567339923088#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAWsAAsAAAAACvAAAAVdAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDbAqIIIZfATYCJAMgCxIABCAFhG0HaxtUCSMRZkzSQvaXB9xhuuUIhQjxNJQoGQq4v4GGlG3aMfh/jEum5YI74RAO+n1HedhsUlBKey6F14kOAXAs77uo6C0sLWo2XFs0zQsHuqZUGfblWj5RCdUKU0IF5NHn8xv43N3ebDaF8TWiRlUp9hWyP3+5G5uGdlZhW6fAGxWNRRLFf+hZY4FFBXYXWGJhxLYdPKqhdFNw4JyLCKu2gSbYpuOBxA94uhU3cIGeiuZv6uoL638ce/mXNVi+Xwn01SqTqhZFw90oz3cDimgrnFghjHiLeTXdCZVGvXw/QACdBrQhMF86eEBHGDEiaDg7jg6FTswlXEJC4tZozrlhalQDEfHgaewsAFTr70f/oIZoACYSAvIglwPLCDj5gpc9XkL+dkIEXPcXAIDbRQAHFABQgG5yQ6WVkC0pQEjy87KwNRVgEhcU/YLnynPjRfJifhlHksRl5FESQLIUk3eAll0iAmJCo/3zohCZGAATUabmOcB5AOO5zANUPFd4gJLnBg8gXiQ8QM2LOQC4BVeDZquZaPA5LABYAeoD9A4EawAmtLSGAFfIYpGHATHSv1acTpyfV4ZJIPwgRxdiu1wWd+PlmyUy61P+9JkNCN9u0tNzhsryceSdGt7md9u2AnoNAxyZx9KLjpI1JSoZHS0fHyfGxs6MjIT2WmNj+cfmP3g1cakBDoAGDtHKieoYTll40Bnl9F4j1ui37jokYGJGrLj98q2/9a4KUNZgIvXGlX78tM83+n5aOA1c383jzo0b/Gmw/anLMLfU7rdxLRUXqTMcnZ44Fy2cKDkmopG+nJt1eSA3JzVzzRQ3oNcQHaXn7ajkqK/akW7H+7aOZCK2YwcbPbKb9Ujv5qF89Ga0fJuQy0NXVP/+Y1fz6qpdeFVUyc/17LGtbqgaI7xkUmCblTFY1i9mZ14vCdQ49M/+Zjz7pfRZ1cN/D73uH4NueJazh2WTL0zN2YQeeY8MCbSHa2JuMn0S/8QkgVa6FMzScHsY7pn/JFJ+tvWL2UHJ3bG9UW+0p5fn5P+0ttsnFh9n0fqGmstXGeT/preJXhV4Cpx3L93CQC7rNg1XhAJfIIeZbd+iYF7tidwzNubX7YmrVbZjGc474dItfbys/8Z5k3667OobFVameTCj4FlUd21Ddvr3Hs5vDjroVFXfChweFQYh0117BgasN7XXTbwAW9MKNI6Js23Zv7hEr218E88XL65r24tLXB7a1peyV+UxvvMUpdlPrimdKUqaUdKdTz4/eywotNjvuczB7PpS+t1siW9fcn8BNq/q6tlMi7xofR3dXDS2MNnq6l89Yj3PnhhcIXvi91gnIInRxInPkg/cWLORD/EdXJzyFJ/DBSolA6Grc3s/r6jeV8HMBt9o6A/bilvr6/VYUU/dX4RGcK+ZnclDYQ1AkmHNu5a4acJvI5Tq/ChX1Y7QWN3ZBQygo4vAGRxjg88+LZy11fvcUvGAiakDLq6JoMC0gVJKF6jEjYBOC1YupleCc3WBMC0AuQleEYAE7wDhPAEm+EAgmD9Aaf4BI1QHStPcNWlBvnfOqARHMHwBr6kwzCs903iDNmWKQ60mPyBHn4Wt9c1k9RoL5D5OiI92W8SAYcrhCj0Ms4ygZBqjlnUnUh5vbJi8D1rXlFd6cgwpAo2AoRfA00jByOVFL/X1N5CVZBQumfAj/QCxyG8dbFm3WQNxbSpqTTiXnaNH1jYhTHSQwUgOXEEAZbREQJm/1xjSxDrXolA6toEXMnVN6+Nb8jW9gUqlh7xXp9VuOl3dPb2wL3mnqF36wmapaERR3BWnrRmfZZ3oKGlV2E5yV6cy00Rm4koFAAAA') format('woff2'),
url('iconfont.woff?t=1567339923088') format('woff'),
url('iconfont.ttf?t=1567339923088') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1567339923088#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-duihao:before {
content: "\e61e";
}
.icon-pinglun:before {
content: "\e600";
}
.icon-star:before {
content: "\e7df";
}
.icon-star-fill:before {
content: "\e86a";
}
.icon-shoucang:before {
content: "\e614";
}
.icon-starhalf:before {
content: "\e613";
}
.icon-error:before {
content: "\e72a";
}
!function(c){var t,l='<svg><symbol id="icon-duihao" viewBox="0 0 1024 1024"><path d="M416.832 798.08C400.64 798.08 384.512 791.872 372.16 779.52L119.424 525.76C94.784 500.992 94.784 460.8 119.424 436.032 144.128 411.264 184.128 411.264 208.768 436.032L416.832 644.928 814.4 245.76C839.04 220.928 879.04 220.928 903.744 245.76 928.384 270.528 928.384 310.656 903.744 335.424L461.504 779.52C449.152 791.872 432.96 798.08 416.832 798.08Z" ></path></symbol><symbol id="icon-pinglun" viewBox="0 0 1076 1024"><path d="M1007.916504 0.021082H66.926727a66.926727 66.926727 0 0 0-66.926727 66.926727v643.500477a66.926727 66.926727 0 0 0 66.926727 66.926726h208.14212l4.350237 3.011703 394.533054 234.243543a52.202847 52.202847 0 0 0 25.766789 7.696574c19.074117 0 33.463363-15.058514 33.463364-41.159937l60.234054-205.465051h216.173327a66.926727 66.926727 0 0 0 66.926727-66.926727V66.947809a66.926727 66.926727 0 0 0-68.599895-66.926727z m0 710.427204h-234.243544a33.463363 33.463363 0 0 0-31.455561 22.420453l-15.727781 44.506273L664.917029 936.995255l-256.99863-159.620243-52.53748-30.45166-63.915024-36.475066H66.926727V66.947809h940.989777z" fill="" ></path><path d="M264.025937 389.199998m-66.926727 0a66.926727 66.926727 0 1 0 133.853453 0 66.926727 66.926727 0 1 0-133.853453 0Z" fill="" ></path><path d="M535.413813 389.199998m-66.926726 0a66.926727 66.926727 0 1 0 133.853453 0 66.926727 66.926727 0 1 0-133.853453 0Z" fill="" ></path><path d="M806.467056 389.199998m-66.926726 0a66.926727 66.926727 0 1 0 133.853453 0 66.926727 66.926727 0 1 0-133.853453 0Z" fill="" ></path></symbol><symbol id="icon-star" viewBox="0 0 1024 1024"><path d="M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3-12.3 12.7-12.1 32.9 0.6 45.3l183.7 179.1-43.4 252.9c-1.2 6.9-0.1 14.1 3.2 20.3 8.2 15.6 27.6 21.7 43.2 13.4L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3zM664.8 561.6l36.1 210.3L512 672.7 323.1 772l36.1-210.3-152.8-149L417.6 382 512 190.7 606.4 382l211.2 30.7-152.8 148.9z" ></path></symbol><symbol id="icon-star-fill" viewBox="0 0 1024 1024"><path d="M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3-12.3 12.7-12.1 32.9 0.6 45.3l183.7 179.1-43.4 252.9c-1.2 6.9-0.1 14.1 3.2 20.3 8.2 15.6 27.6 21.7 43.2 13.4L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z" ></path></symbol><symbol id="icon-shoucang" viewBox="0 0 1024 1024"><path d="M707.584 93.184c-77.312 0-148.992 38.912-196.608 102.912-47.104-64-119.296-102.912-196.608-102.912-139.264 0-252.416 123.904-252.416 275.968 0 90.624 40.448 154.624 73.216 205.824C229.888 723.968 468.48 908.8 478.72 916.48c9.728 7.68 20.992 11.264 32.256 11.264s22.528-3.584 32.256-11.264c10.24-7.68 248.32-193.024 343.552-341.504 32.768-51.2 73.216-115.2 73.216-205.824 0-152.064-113.152-275.968-252.416-275.968zM821.76 573.44c-87.552 122.88-272.896 263.168-282.112 269.824-8.704 6.656-18.944 10.24-28.672 10.24-10.24 0-19.968-3.072-28.672-10.24-9.216-6.656-190.976-148.48-282.112-274.944-29.184-46.08-75.776-103.424-75.776-184.32 0-136.192 75.776-231.936 200.192-231.936 69.12 0 144.384 66.048 186.368 123.392 42.496-57.344 117.248-123.392 186.368-123.392 124.928 0 205.824 95.744 205.824 231.936 0 80.896-51.712 143.872-81.408 189.44z" fill="" ></path></symbol><symbol id="icon-starhalf" viewBox="0 0 1024 1024"><path d="M936.423 435.752c12.964-12.638 5.811-34.655-12.105-37.258l-260.006-37.781a21.844 21.844 0 0 1-16.447-11.949L531.588 113.159c-4.006-8.117-11.797-12.177-19.588-12.177s-15.582 4.06-19.588 12.177L376.134 348.764a21.844 21.844 0 0 1-16.447 11.949L99.682 398.494c-17.916 2.603-25.07 24.62-12.105 37.258l188.142 183.393a21.845 21.845 0 0 1 6.282 19.334l-44.414 258.955c-2.421 14.119 8.797 25.584 21.525 25.584 3.358 0 6.823-0.799 10.168-2.558l232.556-122.262c3.182-1.673 6.673-2.509 10.165-2.509s6.983 0.836 10.165 2.509L754.721 920.46c3.346 1.76 6.81 2.558 10.168 2.558 12.727 0 23.946-11.467 21.525-25.584L742 638.479a21.845 21.845 0 0 1 6.282-19.334l188.141-183.393z m-253.56 212.869l31.345 182.754-164.12-86.282A82.15 82.15 0 0 0 512 735.69V209.044l82.061 166.272a81.825 81.825 0 0 0 61.624 44.772l183.495 26.664L706.4 576.18a81.83 81.83 0 0 0-23.537 72.441z" fill="" ></path></symbol><symbol id="icon-error" viewBox="0 0 1024 1024"><path d="M601.65 511.987l403.766-403.701A63.487 63.487 0 0 0 915.69 18.56L511.987 422.325 108.286 18.56a63.487 63.487 0 0 0-89.726 89.726l403.765 403.701L18.56 915.69a63.487 63.487 0 0 0 89.726 89.726l403.701-403.767 403.703 403.767a63.359 63.359 0 0 0 89.726-89.726L601.649 511.987z" ></path></symbol></svg>',e=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss");if(e&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(t){console&&console.log(t)}}!function(t){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(t,0);else{var e=function(){document.removeEventListener("DOMContentLoaded",e,!1),t()};document.addEventListener("DOMContentLoaded",e,!1)}else document.attachEvent&&(o=t,n=c.document,i=!1,(a=function(){try{n.documentElement.doScroll("left")}catch(t){return void setTimeout(a,50)}l()})(),n.onreadystatechange=function(){"complete"==n.readyState&&(n.onreadystatechange=null,l())});function l(){i||(i=!0,o())}var o,n,i,a}(function(){var t,e;(t=document.createElement("div")).innerHTML=l,l=null,(e=t.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",function(t,e){e.firstChild?function(t,e){e.parentNode.insertBefore(t,e)}(t,e.firstChild):e.appendChild(t)}(e,document.body))})}(window);
\ No newline at end of file
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2013-9-30: Created.
-->
<svg>
<metadata>
Created by iconfont
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="duihao" unicode="&#58910;" d="M416.832 97.92C400.64 97.92 384.512 104.128 372.16 116.48L119.424 370.24C94.784 395.008 94.784 435.2 119.424 459.968 144.128 484.736 184.128 484.736 208.768 459.968L416.832 251.072 814.4 650.24C839.04 675.072 879.04 675.072 903.744 650.24 928.384 625.472 928.384 585.344 903.744 560.576L461.504 116.48C449.152 104.128 432.96 97.92 416.832 97.92Z" horiz-adv-x="1024" />
<glyph glyph-name="pinglun" unicode="&#58880;" d="M1007.916504 895.978918H66.926727a66.926727 66.926727 0 0 1-66.926727-66.926727v-643.500477a66.926727 66.926727 0 0 1 66.926727-66.926726h208.14212l4.350237-3.011703 394.533054-234.243543a52.202847 52.202847 0 0 1 25.766789-7.696574c19.074117 0 33.463363 15.058514 33.463364 41.159937l60.234054 205.465051h216.173327a66.926727 66.926727 0 0 1 66.926727 66.926727V829.052191a66.926727 66.926727 0 0 1-68.599895 66.926727z m0-710.427204h-234.243544a33.463363 33.463363 0 0 1-31.455561-22.420453l-15.727781-44.506273L664.917029-40.995255l-256.99863 159.620243-52.53748 30.45166-63.915024 36.475066H66.926727V829.052191h940.989777zM264.025937 506.800002m-66.926727 0a66.926727 66.926727 0 1 1 133.853453 0 66.926727 66.926727 0 1 1-133.853453 0ZM535.413813 506.800002m-66.926726 0a66.926727 66.926727 0 1 1 133.853453 0 66.926727 66.926727 0 1 1-133.853453 0ZM806.467056 506.800002m-66.926726 0a66.926727 66.926727 0 1 1 133.853453 0 66.926727 66.926727 0 1 1-133.853453 0Z" horiz-adv-x="1076" />
<glyph glyph-name="star" unicode="&#59359;" d="M908.1 542.9l-253.9 36.9L540.7 809.9c-3.1 6.3-8.2 11.4-14.5 14.5-15.8 7.8-35 1.3-42.9-14.5L369.8 579.8l-253.9-36.9c-7-1-13.4-4.3-18.3-9.3-12.3-12.7-12.1-32.9 0.6-45.3l183.7-179.1-43.4-252.9c-1.2-6.9-0.1-14.1 3.2-20.3 8.2-15.6 27.6-21.7 43.2-13.4L512 142l227.1-119.4c6.2-3.3 13.4-4.4 20.3-3.2 17.4 3 29.1 19.5 26.1 36.9l-43.4 252.9 183.7 179.1c5 4.9 8.3 11.3 9.3 18.3 2.7 17.5-9.5 33.7-27 36.3zM664.8 334.4l36.1-210.3L512 223.3 323.1 124l36.1 210.3-152.8 149L417.6 514 512 705.3 606.4 514l211.2-30.7-152.8-148.9z" horiz-adv-x="1024" />
<glyph glyph-name="star-fill" unicode="&#59498;" d="M908.1 542.9l-253.9 36.9L540.7 809.9c-3.1 6.3-8.2 11.4-14.5 14.5-15.8 7.8-35 1.3-42.9-14.5L369.8 579.8l-253.9-36.9c-7-1-13.4-4.3-18.3-9.3-12.3-12.7-12.1-32.9 0.6-45.3l183.7-179.1-43.4-252.9c-1.2-6.9-0.1-14.1 3.2-20.3 8.2-15.6 27.6-21.7 43.2-13.4L512 142l227.1-119.4c6.2-3.3 13.4-4.4 20.3-3.2 17.4 3 29.1 19.5 26.1 36.9l-43.4 252.9 183.7 179.1c5 4.9 8.3 11.3 9.3 18.3 2.7 17.5-9.5 33.7-27 36.3z" horiz-adv-x="1024" />
<glyph glyph-name="shoucang" unicode="&#58900;" d="M707.584 802.816c-77.312 0-148.992-38.912-196.608-102.912-47.104 64-119.296 102.912-196.608 102.912-139.264 0-252.416-123.904-252.416-275.968 0-90.624 40.448-154.624 73.216-205.824C229.888 172.032 468.48-12.8 478.72-20.48c9.728-7.68 20.992-11.264 32.256-11.264s22.528 3.584 32.256 11.264c10.24 7.68 248.32 193.024 343.552 341.504 32.768 51.2 73.216 115.2 73.216 205.824 0 152.064-113.152 275.968-252.416 275.968zM821.76 322.56c-87.552-122.88-272.896-263.168-282.112-269.824-8.704-6.656-18.944-10.24-28.672-10.24-10.24 0-19.968 3.072-28.672 10.24-9.216 6.656-190.976 148.48-282.112 274.944-29.184 46.08-75.776 103.424-75.776 184.32 0 136.192 75.776 231.936 200.192 231.936 69.12 0 144.384-66.048 186.368-123.392 42.496 57.344 117.248 123.392 186.368 123.392 124.928 0 205.824-95.744 205.824-231.936 0-80.896-51.712-143.872-81.408-189.44z" horiz-adv-x="1024" />
<glyph glyph-name="starhalf" unicode="&#58899;" d="M936.423 460.248c12.964 12.638 5.811 34.655-12.105 37.258l-260.006 37.781a21.844 21.844 0 0 0-16.447 11.949L531.588 782.841c-4.006 8.117-11.797 12.177-19.588 12.177s-15.582-4.06-19.588-12.177L376.134 547.236a21.844 21.844 0 0 0-16.447-11.949L99.682 497.506c-17.916-2.603-25.07-24.62-12.105-37.258l188.142-183.393a21.845 21.845 0 0 0 6.282-19.334l-44.414-258.955c-2.421-14.119 8.797-25.584 21.525-25.584 3.358 0 6.823 0.799 10.168 2.558l232.556 122.262c3.182 1.673 6.673 2.509 10.165 2.509s6.983-0.836 10.165-2.509L754.721-24.46c3.346-1.76 6.81-2.558 10.168-2.558 12.727 0 23.946 11.467 21.525 25.584L742 257.521a21.845 21.845 0 0 0 6.282 19.334l188.141 183.393z m-253.56-212.869l31.345-182.754-164.12 86.282A82.15 82.15 0 0 1 512 160.31V686.956l82.061-166.272a81.825 81.825 0 0 1 61.624-44.772l183.495-26.664L706.4 319.82a81.83 81.83 0 0 1-23.537-72.441z" horiz-adv-x="1024" />
<glyph glyph-name="error" unicode="&#59178;" d="M601.65 384.013l403.766 403.701A63.487 63.487 0 0 1 915.69 877.44L511.987 473.675 108.286 877.44a63.487 63.487 0 0 1-89.726-89.726l403.765-403.701L18.56-19.69a63.487 63.487 0 0 1 89.726-89.726l403.701 403.767 403.703-403.767a63.359 63.359 0 0 1 89.726 89.726L601.649 384.013z" horiz-adv-x="1024" />
</font>
</defs></svg>
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
{ "httpUrl": ""}
\ No newline at end of file
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
<canvas #canvas (click)="drawPic()" tappable id="canvas" width="150px" height="50px"></canvas>
check-code {
canvas{
height: 30px;
}
}
import {Component, ElementRef, EventEmitter, Output, ViewChild} from '@angular/core';
/**
* 生成验证码
*/
@Component({
selector: 'check-code',
templateUrl: 'check-code.html'
})
export class CheckCodeComponent {
@ViewChild('canvas') canvas: ElementRef;
@Output() done = new EventEmitter();
text: string;
constructor() {
this.text = 'Hello World';
}
//生成随机数
randomNum(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
//生成随机颜色RGB分量
randomColor(min, max) {
const _r = this.randomNum(min, max);
const _g = this.randomNum(min, max);
const _b = this.randomNum(min, max);
return "rgb(" + _r + "," + _g + "," + _b + ")";
}
drawPic() {
//获取到元素canvas
let $canvas = this.canvas.nativeElement;
let _str = "0123456789";//设置随机数库
let _picTxt = "";//随机数
let _num = 4;//4个随机数字
let _width = $canvas.width;
let _height = $canvas.height;
let ctx = $canvas.getContext("2d");//获取 context 对象
ctx.textBaseline = "bottom";//文字上下对齐方式--底部对齐
ctx.fillStyle = this.randomColor(180, 240);//填充画布颜色
ctx.fillRect(0, 0, _width, _height);//填充矩形--画画
for (let i = 0; i < _num; i++) {
let x = (_width-10)/_num*i+10;
let y = this.randomNum(_height/2,_height);
let deg = this.randomNum(-45,45);
let txt = _str[this.randomNum(0,_str.length)];
_picTxt += txt;//获取一个随机数
ctx.fillStyle = this.randomColor(10,100);//填充随机颜色
ctx.font = this.randomNum(16,40)+"px SimHei";//设置随机数大小,字体为SimHei
ctx.translate(x,y);//将当前xy坐标作为原始坐标
ctx.rotate(deg*Math.PI/180);//旋转随机角度
ctx.fillText(txt, 0,0);//绘制填色的文本
ctx.rotate(-deg*Math.PI/180);
ctx.translate(-x,-y);
}
for (let i = 0; i < _num; i++) {
//定义笔触颜色
ctx.strokeStyle = this.randomColor(90, 180);
ctx.beginPath();
//随机划线--4条路径
ctx.moveTo(this.randomNum(0, _width), this.randomNum(0, _height));
ctx.lineTo(this.randomNum(0, _width), this.randomNum(0, _height));
ctx.stroke();
}
for (let i = 0; i < _num * 10; i++) {
ctx.fillStyle = this.randomColor(0, 255);
ctx.beginPath();
//随机画原,填充颜色
ctx.arc(this.randomNum(0, _width), this.randomNum(0, _height), 1, 0, 2 * Math.PI);
ctx.fill();
}
console.log(_picTxt);
this.done.emit(_picTxt);
return _picTxt;//返回随机数字符串
}
}
<div class="main">
<div class="content" tappable (click)="close()">
<div class="comment" tappable (click)="stop($event)">
<div *ngIf="type == 'teacher'" class="select">
<div tappable class="selecTeacher">
<span *ngIf="!teacher">
选择讲师
<ion-icon name="arrow-forward"></ion-icon>
</span>
<span *ngIf="teacher">
<img [src]="teacher.HeadPhoto || defalutPhoto">
{{teacher.UserName}}
<ion-icon name="arrow-forward"></ion-icon>
</span>
</div>
</div>
<div class="padding-10">
<textarea #textAreaElement [(ngModel)]="replyContent" class="content-textarea"
placeholder="{{placeholder}}"></textarea>
</div>
<ion-row style="margin-top: 5px">
<ion-col col-4 style="line-height: 30px">
<span class="send" tappable (click)="submit()">发送</span>
</ion-col>
<ion-col col-8 text-center class="img-star" *ngIf="type != 'talk'">
<ng-container *ngFor="let star of starList;let i = index;">
<span tappable (click)="checkStar(i)" [ngClass]="star" class="icon iconfont"></span>
</ng-container>
</ion-col>
</ion-row>
</div>
</div>
</div>
comment {
.main {
background-color: rgba(0, 0, 0, .4);
height: 100%;
}
.content {
position: relative;
height: 100%;
width: 100%;
}
.comment {
position: absolute;
width: 100%;
bottom: 0;
height: 80%;
background: #fff;
border-top-right-radius: 8px;
border-top-left-radius: 8px;
padding: 15px;
ion-icon {
font-size: 3rem;
font-weight: bold;
}
}
.content-textarea {
padding: 10px;
min-height: 100px;
width: 100%;
border: 1px solid #f2f2f2;
background-color: #f2f2f2;
border-radius: 5px;
}
.send {
background-image: linear-gradient(to right, #feca46, #fee6a3);
padding: 6px 30px;
border-radius: 100px;
font-weight: 500;
color: rgba(0, 0, 0, .8);
line-height: 17px;
}
.img-star {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
span {
color: #facd70;
font-size: 3rem;
}
span.score {
color: #e44f17;
margin-left: 15px;
}
}
.select {
.select-ios {
border: 1px solid #ccc;
border-radius: 100px;
color: #333333;
padding: 6px 8px;
font-size: 1.4rem;
max-width: 30%;
margin-bottom: 15px;
}
}
.item-cover {
width: auto;
height: auto;
}
.selecTeacher {
display: inline-block;
background: rgba(255, 255, 255, 1);
border-radius: 30px;
border: 1px solid rgba(0, 0, 0, 0.1);
padding: 10px 20px;
margin-bottom: 10px;
span{
display: flex;
align-items: center;
justify-content: center;
img{
width: 25px;
height: 25px;
margin-right: 10px;
}
ion-icon{
font-size: 1.5rem;
color: #999999;
margin-left: 10px;
}
}
}
}
import {Component, ElementRef, ViewChild} from '@angular/core';
import {ModalController, NavController, NavParams, ViewController} from "ionic-angular";
import {Keyboard} from "@ionic-native/keyboard";
import {CommonService} from "../../core/common.service";
@Component({
selector: 'comment',
templateUrl: 'comment.html'
})
export class CommentComponent {
@ViewChild('textAreaElement') textAreaElement: ElementRef;
teacher;
teacherList;
replyContent: string;
placeholder: string;
type: string;
starList = ["icon-star", "icon-star", "icon-star", "icon-star", "icon-star"];
score;
constructor(public navCtrl: NavController, public navParams: NavParams,
private keyboard: Keyboard, private commonSer: CommonService,
public viewCtrl: ViewController,
private modalCtrl: ModalController) {
this.placeholder = this.navParams.get('placeholder');
this.type = this.navParams.get('type');
if (this.navParams.get('teacherList')) this.teacherList = this.navParams.get('teacherList');
setTimeout(() => {
this.textAreaElement.nativeElement.focus();
this.keyboard.show();
}, 500)
}
/**
*
* @param score 分数 从0开始
*/
checkStar(score) {
this.score = score + 1;
let arr = new Array(5);
for (let i = 0; i < arr.length; i++) {
if (i < score + 1) {
arr[i] = "icon-star-fill";
} else {
arr[i] = "icon-star";
}
}
this.starList = arr;
}
close() {
this.viewCtrl.dismiss();
}
stop(e) {
e.stopPropagation();
}
submit() {
if (!this.replyContent || this.replyContent.trim() == "") {
this.commonSer.toast('请输入评价!');
return
}
if (this.type != 'talk' && !this.score) {
this.commonSer.toast('请先打分!');
return
}
if (this.type == "teacher" && !this.teacher) {
this.commonSer.toast('请选择讲师!');
return
}
if(this.type == "teacher" && this.score == 1 && this.replyContent.length < 50){ //讲师评价出现一星的情况
this.commonSer.toast("请至少输入50字以上的内容方可提交");
return;
}
const data = <any>{
'replyContent': this.replyContent,
'score': this.score
};
if (this.type == "teacher") data.TopicID = this.teacher.UserID;
console.log(data);
this.viewCtrl.dismiss(data);
}
}
import {NgModule, NO_ERRORS_SCHEMA} from '@angular/core';
import {NavbarComponent} from './navbar/navbar';
import {IonicPageModule} from "ionic-angular";
import {ScrollTabsComponent} from './scroll-tabs/scroll-tabs';
import {CommentComponent} from './comment/comment';
import {TreeListComponent} from './tree-list/tree-list';
import {QIndexComponent} from './q-index/q-index';
import {CheckCodeComponent} from './check-code/check-code';
import {UpdateAppComponent} from './update-app/update-app';
import {VideojsComponent} from "./videojs/videojs";
@NgModule({
declarations: [
CommentComponent,
CommentComponent,
NavbarComponent,
ScrollTabsComponent,
TreeListComponent,
QIndexComponent,
CheckCodeComponent,
UpdateAppComponent,
VideojsComponent,
],
imports: [
IonicPageModule
],
exports: [
CommentComponent,
CommentComponent,
NavbarComponent,
ScrollTabsComponent,
TreeListComponent,
QIndexComponent,
CheckCodeComponent,
UpdateAppComponent,
VideojsComponent,
],
providers: [
CommentComponent,
],
entryComponents: [
CommentComponent,
NavbarComponent,
ScrollTabsComponent,
TreeListComponent,
QIndexComponent,
CheckCodeComponent,
UpdateAppComponent,
VideojsComponent,
],
schemas: [NO_ERRORS_SCHEMA]
})
export class ComponentsModule {
}
<div class="navbar">
<ng-container *ngFor="let item of list;let i = index;">
<div class="navbar-item" tappable (click)="changeType(item)">
<span class="{{select == item.type?'duty-title':''}}">{{item.name}}</span>
</div>
</ng-container>
</div>
navbar {
.navbar {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
height: 36px;
background-color: #fff;
}
.duty-state {
border: 1px solid #f8ac56;
font-size: 1.3rem;
border-radius: 4px;
padding: 1px 4px;
color: #f8ac56;
}
.navbar > div {
width: 50%;
text-align: center;
position: relative;
height: 36px;
line-height: 36px;
}
.duty-title {
position: relative;
//color: #e42417;
}
.duty-title::after {
content: '';
position: absolute;
width: 100%;
height: 4px;
background-image: linear-gradient(to right, #feca46, #fee6a3);
bottom: -10px;
left: 0;
border-radius: 4px;
}
.span-btn {
background-color: #e42417;
font-size: 1.4rem;
padding: 4px 6px;
color: #fff;
border-radius: 3px;
}
.dutyItem > div {
margin-bottom: 10px;
}
}
import {Component, EventEmitter, Input, Output} from '@angular/core';
@Component({
selector: 'navbar',
templateUrl: 'navbar.html'
})
/**
* list = [ { type:"1",name:"类型" } ]
*/
export class NavbarComponent {
@Input() list;
@Input() select;
@Output() done = new EventEmitter();
constructor() {
}
changeType(item) {
this.select = item.type;
this.done.emit(item);
}
}
<ion-content style="background-color: #ffffff">
<div class="qIndex">
<p class="title">
共{{list.length}}题
</p>
<ion-row>
<ion-col col-3 *ngFor="let item of list;let i = index" tappable (click)="chooseItem(item,i)">
<div class="item-style" [ngClass]="item.StuAnswer != ''?'select':''">
{{i +1}}
</div>
</ion-col>
</ion-row>
</div>
</ion-content>
q-index {
.qIndex{
padding: 40px 20px;
text-align: center;
font-size: 1.6rem;
.title{
font-weight: bold;
margin-bottom: 20px;
}
.item-style{
margin: 0 auto;
width: 2.5rem;
height: 2.5rem;
border: 1px solid #333;
border-radius: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.select{
background-color: #fed25b;
}
}
}
import { Component } from '@angular/core';
import {NavParams, ViewController} from "ionic-angular";
import {StatusBar} from "@ionic-native/status-bar";
@Component({
selector: 'q-index',
templateUrl: 'q-index.html'
})
export class QIndexComponent {
list = [];
choice = [];
constructor(private params: NavParams,private statusBar:StatusBar,
private viewCtrl: ViewController) {
this.list = this.params.get('list');
console.log(this.list);
}
chooseItem(item,i){
this.viewCtrl.dismiss(i);
}
}
<div #scrollTab class="scroll-tab">
<div #newContentParent class="news-content parent">
<div #tabsParent class="tabs-parent parent">
<div #tabsChildren *ngFor="let item of tabsList;let i = index;" tappable (click)="changeParent(item,i)"
class="tabs-children">
<span #tabSpan [style.color]="select.index == i ? '#f71a22':'#999'">
{{item.name}}
<ion-icon *ngIf="select.index == i" name="arrow-down"></ion-icon>
<ion-icon *ngIf="select.index != i" name="arrow-up"></ion-icon>
</span>
</div>
<!-- <span #tips id="tips"></span>-->
</div>
</div>
</div>
<div *ngIf="isShow" class="three-content" tappable (click)="isShow = false">
<div class="three-type" [style.height]="isShow?'auto':'0'">
<p tappable (click)="setAll()">全部</p>
<p *ngFor="let item of threeType.list;let i = index;" tappable (click)="setSubjectID(item)">{{item.TypeName}}</p>
</div>
</div>
scroll-tabs {
.scroll-tab {
position: relative;
}
.three-content {
position: absolute;
top: 4rem;
left: 0;
width: 100%;
height: calc(100% - 4rem);
background-color: rgba(0,0,0,.3);
}
.three-type {
position: absolute;
width: 100%;
text-align: center;
background-color: #fff;
border-bottom: 1px solid #aaa;
transition: height 500ms;
overflow: hidden;
box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.3);
p {
padding: 10px;
}
p + p {
border-top: 1px solid #eeeeee;
}
}
}
import {Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild} from '@angular/core';
import {timer} from "rxjs/observable/timer";
import {HomeService} from "../../pages/home/home.service";
/**
* 横向滑动栏
*/
@Component({
selector: 'scroll-tabs',
templateUrl: 'scroll-tabs.html'
})
export class ScrollTabsComponent implements OnChanges {
@ViewChild('tips') tips: ElementRef;
@ViewChild('tabSpan') tabSpan: ElementRef;
@ViewChild('tabsChildren') tabsChildren: ElementRef;
@Input() tabsList;
@Input() isShow;
@Output() done = new EventEmitter();
select = {
index:0,
item:null
}
itemWidth;
spanWidth;
threeType = {
list: [],
type: null,
};
constructor(private homeSer:HomeService) {
timer(1000).subscribe((res) => {
const htmlFontSize = getComputedStyle(window.document.documentElement)['font-size'];
// this.itemWidth = htmlFontSize.split("px")[0] * 8;
this.itemWidth = document.documentElement.clientWidth;
this.spanWidth = document.documentElement.clientWidth / 8; //文字宽度
})
}
ngOnChanges(change: SimpleChanges) {
if (change['isShow'] && change['isShow'].currentValue.length > 0) {
console.log(change['inputValue'].currentValue);
}
}
changeParent(item, index) {
this.select.index = index;
this.select.item = item;
console.log(index);
// this.tips.nativeElement.style.width = this.tabSpan.nativeElement.offsetWidth + 'px';
// 自身div的一半 - 滑块的一半
// this.tips.nativeElement.style.left = this.itemWidth * (index) + (this.itemWidth - this.spanWidth) / 2 + 'px';
// console.log(this.tips.nativeElement.style.left);
if(index == 'all') {
this.done.emit('all');
}
}
//选择单个三级分类
setSubjectID(e){
this.isShow = false;
this.done.emit(e)
}
//选择全部
setAll(){
this.isShow = false;
this.done.emit(this.select.item);
}
}
<div class="list" *ngFor="let item of treeList">
<p [ngStyle]="{'padding-left':(item.NodeLevel*5)+'px'}" tappable (click)="getMore(item)">
{{item.title}}
<ion-icon *ngIf="item.children.length > 0 && !item.show" class="more-icon" name="arrow-forward"></ion-icon>
<ion-icon *ngIf="item.children.length > 0 && item.show" class="more-icon" name="arrow-down"></ion-icon>
</p>
<tree-list *ngIf="item.children.length > 0 && item.show"
[IsBuy]="IsBuy"
[TeachTypeName]="TeachTypeName"
[treeList]="item.children"
></tree-list>
<div *ngFor="let item of item.files">
<p [ngStyle]="{'padding-left':(item.NodeLevel*5)+'px'}" tappable (click)="handle(item,$event)">
<img *ngIf="item.icon != 'mp4'" src="./assets/imgs/learn/file.png">
<img *ngIf="item.icon == 'mp4'" src="./assets/imgs/learn/mp4.png">
{{item.DisplayName}}<span class="file-icon">{{item.icon}}</span>
<img *ngIf="nowTime > item.PlanStartTime_time && IsBuy" tappable
(click)="downLoad(item,$event)" class="download-file" src="./assets/imgs/learn/download-file.png">
</p>
</div>
<ng-container *ngIf="IsBuy">
<div *ngFor="let item of item.tags">
<p [ngStyle]="{'padding-left':(item.NodeLevel*5)+'px'}" tappable (click)="handleExam(item,$event)">
<span class="exam">
{{item.label}}
</span>
</div>
</ng-container>
</div>
<div *ngIf="isSign" class="collection">
<img src="./assets/imgs/learn/sign_error.png">
<p>请先报名</p>
</div>
tree-list {
.list {
//padding: 10px 0;
img {
width: 1.1rem;
height: 1.1rem;
}
}
.more-icon {
float: right;
margin-top: 2px;
color: rgba(0, 0, 0, .3);
margin-right: 10px;
}
.file-icon {
padding: 0px 5px;
border: 1px solid #66a0eb;
border-radius: 4px;
background-color: #66a0eb;
color: #ffffff;
margin-left: 10px;
}
.exam {
padding: 3px 8px;
background: rgba(255, 201, 45, .3);
border-radius: 0.17rem;
position: relative;
}
.exam::before {
content: '';
position: absolute;
top: 0;
left: -3px;
width: 0.25rem;
height: 100%;
background: linear-gradient(241deg, rgba(255, 247, 203, 1) 0%, rgba(255, 201, 45, 1) 100%);
}
.collection {
top: 25% !important;
height: 90px !important;
img {
height: 90px !important;
}
}
.collection p {
border: none !important;
top: 65% !important;
}
img.download-file {
height: 18px;
width: 18px;
float: right;
}
}
import {Component, EventEmitter, Input, Output} from '@angular/core';
import {AppService} from "../../app/app.service";
import {EmitService} from "../../core/emit.service";
import {ViewFilePage} from "../../pages/learning/view-file/view-file";
import {ModalController, NavController} from "ionic-angular";
import {FileService} from "../../core/file.service";
import {CommonService} from "../../core/common.service";
import {timer} from "rxjs/observable/timer";
import {LearnService} from "../../pages/learning/learn.service";
import {DownloadFileProvider} from "../../providers/download-file/download-file";
/**
* 树结构
* 组件嵌套
*/
@Component({
selector: 'tree-list',
templateUrl: 'tree-list.html'
})
export class TreeListComponent {
@Input() treeList = [];
@Input() IsBuy = [];
@Input() TeachTypeName;
@Output() fileData = new EventEmitter<any>();
isSign = false;
nowTime;
constructor(private appSer: AppService, private eventSer: EmitService, private modalCtrl: ModalController,
private fileSer: FileService, private commonSer: CommonService, private learSer: LearnService,
private navCtrl: NavController,
private downloadPro: DownloadFileProvider) {
timer(10).subscribe(
(res) => {
this.treeList.forEach(e => e.show = true);
}
)
this.nowTime = new Date().getTime();
}
openPDF(file) {
console.log(file);
let modal = this.modalCtrl.create(ViewFilePage, {
displayData: {
pdfSource: {
url: file.fileUrl
},
title: file.DisplayName,
Size: file.Size * 1024
},
});
modal.present();
event.stopPropagation();
}
//文件处理
handle(file, event) {
event.stopPropagation();
if (file.icon.includes('mp4')) {
this.appSer.setFile(file);
}
if (file.icon.includes('pdf')) this.openPDF(file);
if (!file.icon.includes('pdf') && !file.icon.includes('mp4')) {
this.fileSer.viewFile(file.fileUrl, file.filename);
}
}
getTime(time) {
return new Date(time).getTime();
}
//下载文件
downLoad(file, e) {
e.stopPropagation();
let fileUrl;
if (file.icon.includes('mp4')) { //视频
fileUrl = file.DownloadUrl;
// this.downloadSer.downloadVideo(file.DisplayName + "." + file.icon, fileUrl);
this.downloadPro.downloadVideo(file.DisplayName + "." + file.icon, fileUrl);
} else { //文档
fileUrl = file.fileUrl;
this.fileSer.downloadFile(file.fileUrl, file.DisplayName + "." + fileUrl.icon);
}
}
getMore(e) {
e.show = !e.show;
}
}
<div class="cover">
<div class="bg-content">
<div class="update-content">
<div class="update-text">
{{UpdateText}}
</div>
<div tappable (click)="updateApp()" class="update-button">
马上更新
</div>
</div>
<span tappable (click)="close()" class="icon-close">
<ion-icon name="close"></ion-icon>
</span>
</div>
</div>
update-app {
.cover{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .2);
z-index: 999;
}
.bg-content{
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
background-image: url("../assets/imgs/update_tip_bg.png");
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
width: 65%;
height: 52%;
border-radius: 10px;
}
.update-content{
position: absolute;
top: 40%;
width: 100%;
height: 60%;
left: 0;
}
.update-title{
margin: 70px auto;
font-size: 2rem;
font-weight: bold;
text-align: center;
}
.update-text{
margin-top: 40px;
padding: 0 15%;
font-size: 1.5rem;
font-weight: 400;
text-align: center;
}
.update-button{
position: absolute;
left: 20%;
bottom: 6%;
width: 60%;
height: 4rem;
margin: 0 auto;
text-align: center;
background: linear-gradient(242deg, #fff7cb 0%, #ffc92d 100%);
border-radius: 24px;
font-size: 1.6rem;
font-weight: bold;
line-height: 4rem;
box-shadow: 0px 8px 8px 0px rgba(78,78,78,0.11);
}
.icon-close {
position: absolute;
bottom: -30px;
left: 50%;
transform: translate(-50%, 4rem);
color: #fff;
border: 1px solid #ffffff;
font-size: 3.5rem;
height: 3.5rem;
width: 3.5rem;
text-align: center;
border-radius: 100%;
display: flex;
align-items: center;
justify-content: center;
ion-icon{
font-weight: 500;
}
}
}
import {Component, EventEmitter, Input, Output} from '@angular/core';
import {AppUpdateService} from "../../core/appUpdate.service";
import {InAppBrowser} from "@ionic-native/in-app-browser";
import {Platform} from "ionic-angular";
@Component({
selector: 'update-app',
templateUrl: 'update-app.html'
})
export class UpdateAppComponent {
@Output() done = new EventEmitter();
@Input() UpdateText;
@Input() AppUrl;
constructor(private appUpdate: AppUpdateService,
private inAppBrowser: InAppBrowser,
private platform: Platform) {
}
close() {
this.done.emit();
}
updateApp() {
this.done.emit();
if (this.platform.is('ios')) {
this.isIOS();
} else {
this.appUpdate.downloadApp(this.AppUrl);
}
}
//
isIOS() {
const IOSUrl = 'https://apps.apple.com/us/app/骏菱学社/id1478072690?l=zh&ls=1';
this.inAppBrowser.create(IOSUrl, '_system');
}
}
<video #example_video [id]="videoEle" class="video-js"
width="100%" height="180" controls preload="auto"
[poster]="videoPoster">
</video>
videojs {
.vjs-title-bar {
position: absolute;
top: 5px;
left: 5px;
}
.vjs-danmu {
position: absolute;
top: 20px;
left: 0;
width: 100%;
height: calc(100% - 60px);
}
.vjs-right {
position: absolute;
visibility: hidden;
white-space: nowrap;
transform: translate(100%);
}
.vjs-left {
position: absolute;
white-space: nowrap;
user-select: none;
transition: transform 10s linear;
}
}
import {Component, ElementRef, Input, OnDestroy, ViewChild} from '@angular/core';
import {timer} from "rxjs/observable/timer";
import {MobileAccessibility} from "@ionic-native/mobile-accessibility";
import {ScreenOrientation} from "@ionic-native/screen-orientation";
import {StatusBar} from "@ionic-native/status-bar";
import {GlobalData} from "../../core/GlobleData";
import {VideoJsProvider} from "../../providers/video-js/video-js";
declare let videojs: any;
@Component({
selector: 'videojs',
templateUrl: 'videojs.html'
})
export class VideojsComponent implements OnDestroy {
@ViewChild('example_video') example_video: ElementRef;
videoPoster: string;
videoInfo ;
video;
videoEle;
constructor(private mobileAccess: MobileAccessibility,
private statusBar: StatusBar,
private globleData: GlobalData,
private vjsProvider: VideoJsProvider,
private screenOrientation: ScreenOrientation) {
const videoNum = this.globleData.videoNum;
this.videoEle = `video${videoNum}`;
timer(100).subscribe(() => {
this.video = videojs(this.videoEle, {
muted: false,
controls: true,
autoplay: true
}, (event) => {
this.screenOrientation.onChange().subscribe(
(res) => {
console.log(res);
}
);
this.video.on('fullscreenchange', () => {
if (this.video.isFullscreen()) { //全屏
this.screenOrientation.lock('landscape'); //横屏
this.statusBar.hide();
}
if (!this.video.isFullscreen()) {
this.screenOrientation.lock('portrait'); //锁定竖屏
this.statusBar.show();
}
});
console.log('videojs播放器初始化成功');
this.globleData.videoNum++;
});
});
}
//页面离开暂停
pageLeave() {
if (this.video['player_']) {
this.video.pause();
}
}
destroy() {
if (this.video) {
this.video.dispose();
}
}
removeDanmu(){
this.video.removeChild('danmu');
}
ngOnDestroy(): void {
}
get poster() {
return this.videoPoster;
}
@Input() set poster(poster) {
this.videoPoster = poster;
}
get GetVideo(){
return this.videoInfo;
}
@Input() set GetVideo(videoInfo){
if (this.video && videoInfo) {
this.video.src({type: 'application/x-mpegURL', src: videoInfo.fileUrl});
this.videoInfo = videoInfo;
this.video.removeChild('TitleBar');
this.video.addChild(`danmu`,{text: `${videoInfo.DisplayName}`});
this.video.addChild('TitleBar', {text: `${videoInfo.DisplayName}`});
}
}
}
import { Injectable } from '@angular/core'; /** * 全局变量 */ @Injectable()export class GlobalData { private _videoNum: number = 1; // 播放器状态 get videoNum(): number { return this._videoNum; } set videoNum(value: number) { this._videoNum = value; } }
\ No newline at end of file
import {AppVersion} from '@ionic-native/app-version';
import {FileOpener} from '@ionic-native/file-opener';
import {File} from '@ionic-native/file';
import {Injectable} from '@angular/core';
import {AlertController, Platform} from 'ionic-angular';
import {CommonService} from "./common.service";
import {LoginService} from "../pages/login/login.service";
import {Observable} from "rxjs";
/**
* app下载更新
*/
@Injectable()
export class AppUpdateService {
constructor(private appVersion: AppVersion,
private fileOpener: FileOpener,
private file: File,
private platform: Platform,
private loginSer: LoginService,
private commonSer: CommonService,
private alertCtrl: AlertController,
) {
}
//下载更新APP
downloadApp(apkUrl) {
let alert = this.alertCtrl.create({
title: '下载进度:0%',
enableBackdropDismiss: false,
buttons: ['后台下载']
});
const xhr = new XMLHttpRequest();
xhr.open("GET", apkUrl);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.responseType = "blob";
xhr.addEventListener("loadstart", (ev) => {
// 开始下载事件:下载进度条的显示
alert.present();
});
xhr.addEventListener("progress", (ev) => {
// 下载中事件:计算下载进度
let progress = Math.round(100.0 * ev.loaded / ev.total);
let title = document.getElementsByClassName('alert-title')[0];
title && (title.innerHTML = '下载进度:' + progress + '%');
});
xhr.addEventListener("load", (ev) => {
alert.dismiss();
// 下载完成事件:处理下载文件
const blob = xhr.response;
const fileName = "temp.apk";
if (blob) {
let path = this.file.externalDataDirectory;
this.file.writeFile(path, fileName, blob, {
replace: true
}).then(
() => {
this.fileOpener.open(
path + fileName,
'application/vnd.android.package-archive'
).catch((err) => {
this.commonSer.alert('打开apk失败!' + err);
})
}).catch((err) => {
this.commonSer.alert('失败!');
})
}
});
xhr.addEventListener("loadend", (ev) => {
// 结束下载事件
});
xhr.addEventListener("error", (ev) => {
this.commonSer.alert('下载apk失败!');
});
xhr.addEventListener("abort", (ev) => {
});
xhr.send();
}
}
import {AlertController, App, Events} from 'ionic-angular';import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http';import {Injectable} from '@angular/core';import {Storage} from '@ionic/storage'; import {Observable} from 'rxjs';import {_throw} from 'rxjs/observable/throw';import {CommonService} from "./common.service"; /** * http拦截器 增加token信息 */ @Injectable()export class InterceptorProvider implements HttpInterceptor { constructor(private storage: Storage, private alertCtrl: AlertController, private events: Events, private commonSer: CommonService, private app: App) { } // Intercepts all HTTP requests! intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { let promise = this.storage.get('Authorization'); return Observable.fromPromise(promise) .mergeMap(token => { let clonedReq = this.addToken(request, token); return next.handle(clonedReq).do(res => { if (res instanceof HttpResponse) { } }, (error) => { let msg = error.message; this.message(error); // Pass the error to the caller of the function return _throw(error); }, () => { }) }); } // Adds the token to your headers if it exists private addToken(request: HttpRequest<any>, Authorization: any) { if (Authorization) { let clone: HttpRequest<any>; clone = request.clone({ setHeaders: { // "Accept": `application/json`, 'Content-Type': `application/json`, "Authorization": `Bearer ${Authorization}` } }); return clone; } return request; } message(data) { if (data.status) { let code = data.status; if (code == 401) { this.commonSer.toast("登录已过期"); this.storage.clear(); this.events.publish('toLogin'); } else { // const error = JSON.parse(data.error); // let alert = this.alertCtrl.create({ // title: "错误", // message: `${data.error.errorMsg}。`, // buttons: ['确定'] // //title: error.name, // //message: msg, // //buttons: ['确定'] // }); // alert.present(); } } } }
\ No newline at end of file
import {Storage} from "@ionic/storage"; export class AuthService { constructor(private storage: Storage) { } public async getToken() { return await this.storage.get('Authorization'); }}
\ No newline at end of file
import { Injectable} from '@angular/core';
import {Platform, ToastController, App, NavController, Tabs} from 'ionic-angular';
import {EmitService} from "./emit.service";
import {LogoutService} from "../secret/logout.service";
/**
* android返回按钮监听事件
**/
@Injectable()
export class BackButtonService {
//控制硬件返回按钮是否触发,默认false
backButtonPressed: boolean = false;
// 1.false 正常返回上一层,2.true,禁止返回上一层,3.result,返回列表页面
isDo = 'false';
constructor(public platform: Platform,private logoutSer:LogoutService,
public appCtrl: App, public eventEmitSer: EmitService,
public toastCtrl: ToastController) {
this.eventEmitSer.eventEmit.subscribe((value: any) => {
if(isNaN(value)){ //value为数字 代表消息
this.isDo = value;
}
});
}
//注册方法
registerBackButtonAction(tabRef: Tabs): void {
this.platform.registerBackButtonAction(() => {
// let activePortal = this.ionicApp._modalPortal.getActive() ||this.ionicApp._overlayPortal.getActive();
// let loadingPortal = this.ionicApp._loadingPortal.getActive();
// if (activePortal) {
// //其他的关闭
// activePortal.dismiss().catch(() => {
// });
// activePortal.onDidDismiss(() => {
// });
// return;
// }
// if (loadingPortal) {
// //loading的话,返回键无效
// activePortal.dismiss(()=>{})
// return;
// }
let activeNav: NavController = this.appCtrl.getActiveNavs()[0];
//如果可以返回上一页,则执行pop
if (activeNav.canGoBack()) {
if (this.isDo === 'false') { //正常返回
activeNav.pop();
}
if (this.isDo === 'result') {
let index = activeNav.length() - 2;
activeNav.remove(2, index)
}
} else {
if (tabRef == null || tabRef._selectHistory[tabRef._selectHistory.length - 1] === tabRef.getByIndex(0).id) {
//执行退出
this.showExit();
} else {
//选择首页第一个的标签
tabRef.select(0);
}
}
});
}
//退出应用方法
private showExit(): void {
//如果为true,退出
if (this.backButtonPressed) {
// this.logoutSer.logout();
this.platform.exitApp();
} else {
//第一次按,弹出Toast
this.toastCtrl.create({
message: '再按一次退出应用',
duration: 2000,
position: 'middle'
}).present();
//标记为true
this.backButtonPressed = true;
//两秒后标记为false,如果退出的话,就不会执行了
setTimeout(() => this.backButtonPressed = false, 2000);
}
}
}
import {AlertController, ToastController} from "ionic-angular";import {Injectable} from "@angular/core";import {InAppBrowser} from "@ionic-native/in-app-browser"; /** * 自定义组件方法 */ @Injectable()export class CommonService { constructor(public toastCtrl: ToastController, public alertCtrl: AlertController, private inAppBrowser: InAppBrowser) { } /** * 提示信息 位置:居中,延时2s * @param message 提示文字 * @param callback 提示信息之后执行的方法 */ toast(message, callback?) { let toast = this.toastCtrl.create({ message: message, duration: 2000, position: 'middle', dismissOnPageChange: true, }); toast.present(); if (callback) { callback(); } } /** * alert弹窗 * @param message 弹窗内的文字 * @param callback 如果有回调方法 就有确定、取消两个按钮,没有回调方法 则只有确认一个按钮 */ alert(message, callback?) { if (callback) { let alert = this.alertCtrl.create({ title: '提示', message: message, buttons: ['取消', { text: "确定", handler: data => { callback(); } }] }); alert.present(); } else { let alert = this.alertCtrl.create({ title: '', message: message, buttons: ["确定"] }); alert.present(); } } /** * 通过浏览器打开url */ openUrlByBrowser(url: string): void { this.inAppBrowser.create(url, '_system'); }}
\ No newline at end of file
import {Injectable} from "@angular/core"; /** * 数据格式化 */ @Injectable() export class DataFormatService { constructor() { } /** * JSON格式对象转为form表单的格式,用来接口传递数据 * @param json 需要转化的json * @returns {FormData} formData数据 */ toFormData(json) { let formData = new FormData(); for (let k in json) { formData.append(k, json[k]) } return formData; } /** * JSON格式数据转化为字符串 接口调用 * @param data json格式的数据 * @returns {string} */ toQuery(data) { let str = '?'; for (let key in data) { if (data.hasOwnProperty(key)) { const value = data[key]; str += key + '=' + value + '&'; } } str = str.substring(0, str.length - 1); return str; } /** * JSON格式数据转化为字符串 接口调用 * @param data json格式的数据 * @returns {string} */ xxxFormData(data) { let str = ''; for (let key in data) { if (data.hasOwnProperty(key)) { const value = data[key]; str += key + '=' + value + '&'; } } str = str.substring(0, str.length - 1); return str; }}
\ No newline at end of file
import {Injectable, EventEmitter, OnInit} from "@angular/core";
/**
* 全局监听事件
*/
@Injectable()
export class EmitService implements OnInit {
public eventEmit: any;
//全局的监听事件
constructor() {
// 定义发射事件
this.eventEmit = new EventEmitter();
}
ngOnInit() {
}
}
import {File} from "@ionic-native/file";import {FileOpener} from "@ionic-native/file-opener";import {Injectable} from "@angular/core";import {LoadingController} from "ionic-angular";import {CommonService} from "./common.service";import {Storage} from "@ionic/storage"; /** * 预览文件 */ @Injectable()export class FileService { constructor(private file: File, public fileOpener: FileOpener, private loadingCtrl: LoadingController, private commonSer: CommonService, private storage: Storage ) { } /** * 预览文件并打开文件 * @param url 文件URL */ viewFile(fileUrl, fileName) { const uploadLoading = this.loadingCtrl.create({ content: '加载中...', dismissOnPageChange: true, enableBackdropDismiss: true, }); uploadLoading.present(); const xhr = new XMLHttpRequest(); const fileType = this.getFileMimeType(fileName); const url = encodeURI(fileUrl); xhr.open('GET', url); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.responseType = "blob"; xhr.addEventListener("loadstart", (ev) => { }) xhr.addEventListener("progress", (ev) => { let progress = Math.round(100.0 * ev.loaded / ev.total); uploadLoading.setContent('加载中...' + progress + '%'); }) xhr.addEventListener("load", (ev) => { uploadLoading.dismiss(); const blob = xhr.response; if (blob) { let path = this.file.dataDirectory; this.file.writeFile(path, fileName, blob, { //写入文件 replace: true }).then( () => { this.fileOpener.open(path + fileName, fileType).catch((err) => { this.commonSer.alert('打开课件失败!' + err); }) }).catch((err) => { this.commonSer.alert("打开课件失败!") }) } }); xhr.addEventListener("loadend", (ev) => { // 结束下载事件 uploadLoading.dismiss(); }); xhr.addEventListener("error", (ev) => { this.commonSer.alert("打开课件失败!") uploadLoading.dismiss(); }); xhr.addEventListener("abort", (ev) => { }); xhr.send(); } /** * 下载并打开文件 * @param url 文件URL */ downloadFile(fileUrl, fileName) { const uploadLoading = this.loadingCtrl.create({ content: '下载中...', dismissOnPageChange: true, enableBackdropDismiss: true, }); uploadLoading.present(); const xhr = new XMLHttpRequest(); const fileType = this.getFileMimeType(fileName); const url = encodeURI(fileUrl); xhr.open('GET', url); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.responseType = "blob"; xhr.addEventListener("loadstart", (ev) => { }) xhr.addEventListener("progress", (ev) => { let progress = Math.round(100.0 * ev.loaded / ev.total); uploadLoading.setContent('下载中...' + progress + '%'); }) xhr.addEventListener("load", (ev) => { uploadLoading.dismiss(); const blob = xhr.response; if (blob) { let path = this.file.dataDirectory; this.file.writeFile(path, fileName, blob, { //写入文件 replace: true }).then( () => { this.commonSer.toast('下载课件成功'); this.fileOpener.open(path + fileName, fileType).catch((err) => { this.commonSer.alert('打开文件失败!' + err); }) }).catch((err) => { this.commonSer.toast("下载课件成功!") }) } }); xhr.addEventListener("loadend", (ev) => { // 结束下载事件 uploadLoading.dismiss(); }); xhr.addEventListener("error", (ev) => { alert('下载课件失败!'); uploadLoading.dismiss(); }); xhr.addEventListener("abort", (ev) => { }); xhr.send(); } //获取文件类型 getFileMimeType(fileName: string): string { let fileType = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase(); let mimeType: string = ''; switch (fileType) { case 'txt': mimeType = 'text/plain'; break; case 'docx': mimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break; case 'doc': mimeType = 'application/msword'; break; case 'pptx': mimeType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break; case 'ppt': mimeType = 'application/vnd.ms-powerpoint'; break; case 'xlsx': mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break; case 'xls': mimeType = 'application/vnd.ms-excel'; break; case 'zip': mimeType = 'application/x-zip-compressed'; break; case 'rar': mimeType = 'application/octet-stream'; break; case 'pdf': mimeType = 'application/pdf'; break; case 'jpg': mimeType = 'image/jpeg'; break; case 'png': mimeType = 'image/png'; break; default: mimeType = 'application/' + fileType; break; } return mimeType; } }
\ No newline at end of file
import {HttpClient} from '@angular/common/http';import {Injectable} from '@angular/core';import {Observable} from 'rxjs/Observable';import {Platform} from 'ionic-angular'; /** * 用户登录跳转 退出跳转 */ @Injectable()export class TabService { private tabChangeObserver: any; public tabChange: any; constructor(private platform: Platform) { this.tabChangeObserver = null; this.tabChange = Observable.create(observer => { this.tabChangeObserver = observer; }) } public changeTabInContainerPage(data: object) { this.tabChangeObserver.next(data); }}
\ No newline at end of file
export class UntilService { constructor(){}}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { TreeDirective } from './tree/tree';
@NgModule({
declarations: [TreeDirective],
imports: [],
exports: [TreeDirective]
})
export class DirectivesModule {}
import { Directive } from '@angular/core';
@Directive({
selector: '[tree]' // Attribute selector
})
export class TreeDirective {
constructor() {
console.log('Hello TreeDirective Directive');
}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Stict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Ionic App</title>
<meta name="viewport"
content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<link rel="icon" type="image/x-icon" href="assets/icon/favicon.ico">
<link rel="manifest" href="manifest.json">
<meta name="theme-color" content="#4e8ef7">
<!-- add to homescreen for ios -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!-- cordova.js required for cordova apps (remove if not needed) -->
<script src="cordova.js"></script>
<!-- un-comment this code to enable service worker
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js')
.then(() => console.log('service worker installed'))
.catch(err => console.error('Error', err));
}
</script>-->
<link href="build/main.css" rel="stylesheet">
<link href="assets/css/animate.css" rel="stylesheet">
<link href="assets/css/forum.css" rel="stylesheet">
<link href="assets/videojs/video-js.min.css" rel="stylesheet">
</head>
<body>
<!-- Ionic's root component and where the app will load -->
<ion-app></ion-app>
<!-- The polyfills js is generated during the build process -->
<script src="build/polyfills.js"></script>
<!-- The vendor js is generated during the build process
It contains all of the dependencies in node_modules -->
<script src="build/vendor.js"></script>
<!-- The main bundle js is generated during the build process -->
<script src="build/main.js"></script>
<script src="assets/js/wow.min.js"></script>
<script src="assets/js/md5.js"></script>
<script src="assets/js/jsencrypt.js"></script>
<script src="assets/videojs/video.min.js"></script>
<script>
new WOW().init();
</script>
</body>
</html>
{
"name": "Ionic",
"short_name": "Ionic",
"start_url": "index.html",
"display": "standalone",
"icons": [{
"src": "assets/imgs/logo.png",
"sizes": "512x512",
"type": "image/png"
}],
"background_color": "#4e8ef7",
"theme_color": "#4e8ef7"
}
\ No newline at end of file
<ion-header>
<ion-navbar>
<ion-title>我的学习</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<ion-refresher (ionRefresh)="doRefresh($event)">
<ion-refresher-content pullingText="下拉刷新"
refreshingSpinner="bubbles">
</ion-refresher-content>
</ion-refresher>
<navbar [list]="navbarList" [select]="2" (done)="changeType($event)"></navbar>
<ion-list text-center style="margin-top: 10rem" *ngIf="courseList.length == 0 && page.load">
<img style="width: 60%;" src="./assets/imgs/no-data.png" alt="">
<p text-center style="color: #666666;font-size: 16px">
暂无数据
</p>
</ion-list>
<ion-infinite-scroll *ngIf="this.page.TotalItems > this.courseList.length">
<ion-infinite-scroll-content
loadingSpinner="bubbles"
loadingText="加载中"></ion-infinite-scroll-content>
</ion-infinite-scroll>
<p class="list-footer-page"
*ngIf="page.load && this.page.TotalItems == this.courseList.length && this.page.TotalItems > 5">
没有更多了~~~</p>
</ion-content>
import {CUSTOM_ELEMENTS_SCHEMA, NgModule, NO_ERRORS_SCHEMA} from '@angular/core';
import {IonicPageModule} from 'ionic-angular';
import {CoursePage} from './course';
import {NavbarComponent} from "../../components/navbar/navbar";
import {ComponentsModule} from "../../components/components.module";
@NgModule({
declarations: [
CoursePage,
],
imports: [
IonicPageModule.forChild(CoursePage),
ComponentsModule,
],
entryComponents: [
],
schemas: [NO_ERRORS_SCHEMA,CUSTOM_ELEMENTS_SCHEMA]
})
export class CoursePageModule {
}
page-course {
.learn-list {
padding: 10px;
.course-item {
display: flex;
padding: 15px 10px;
background-color: #fff;
border-radius: 10px;
.item-img {
width: 30%;
display: flex;
height: 75px;
align-items: center;
img {
border-radius: 5px;
height: 75px;
width: 100%;
}
}
.item-desc {
width: 55%;
padding-left: 10px;
display: flex;
flex-direction: column;
flex-flow: row wrap;
height: 75px;
> p {
align-self: flex-start;
font-size: 16px;
font-weight: 500;
color: rgba(0, 0, 0, .8);
line-height: 1.83rem;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.desc {
width: 100%;
color: #999999;
margin-top: 10px;
display: flex;
img {
margin-right: 2px;
width: 18px;
}
> span {
margin-right: 8px;
display: flex;
align-items: center;
font-size: 14px;
}
}
}
.item-process {
width: 15%;
display: flex;
align-items: flex-end;
height: 78px;
justify-content: center;
span:first-child {
font-weight: bold;
font-size: 14px;
}
span:last-child {
font-size: 12px;
transform: scale(0.8);
display: inline-block;
}
}
}
.course-item + .course-item {
margin-top: 10px;
}
}
.outer {
height: 6px;
background-color: #bee1ec;
position: relative;
width: 100%;
overflow: hidden;
border-radius: 10px;
align-self: flex-end;
display: flex;
.inner {
background-image: linear-gradient(to right, #fecc4b, #feeaa5);
height: 6px;
transition: all 500ms;
border-radius: 10px;
}
}
}
import {Component} from '@angular/core';
import {IonicPage, LoadingController, NavController, NavParams} from 'ionic-angular';
import {MineService} from "../mine/mine.service";
import {timer} from "rxjs/observable/timer";
@IonicPage()
@Component({
selector: 'page-course',
templateUrl: 'course.html',
})
export class CoursePage {
navbarList = [
{type: '2', name: '学习中'},
{type: '1', name: '已完成'},
];
page = {
page: 1,
pageSize: 10,
studystate: 2,
TotalItems: 0,
load:false
};
courseList = [];
constructor(public navCtrl: NavController, public navParams: NavParams, private mineSer: MineService,
private loadCtrl: LoadingController) {
}
ionViewDidLoad() {
}
doRefresh(e) {
this.page.page = 1;
timer(1000).subscribe((res) => {
e.complete()
});
}
changeType(e) {
this.page.page = 1;
this.page.studystate = e.type;
this.page.load = false;
}
}
<ion-header>
<ion-navbar>
<ion-title>
首页
</ion-title>
</ion-navbar>
</ion-header>
<ion-content style="background:rgba(248,248,248,1);">
<button [ngClass]="" (click)="sendReq()">请求</button>
</ion-content>
import {NgModule} from '@angular/core';
import {IonicPageModule} from 'ionic-angular';
import {HomePage} from "./home";
import {ComponentsModule} from "../../components/components.module";
@NgModule({
declarations: [
HomePage,
],
imports: [
IonicPageModule.forChild(HomePage),
ComponentsModule,
],
entryComponents: [
]
})
export class HomeModule {
}
page-home {
.button-inner {
justify-content: left;
margin-left: 10px;
}
.swiper-pagination-bullet-active{
background: #fed25b;
width: 16px;
border-radius: 10px;
transition: all 500ms;
}
.search-button .button-inner{
height: 3rem;
}
.img-head{
width: 3rem;
height: 3rem;
border-radius: 50%;
margin-right: 10px;
}
.img-head + span{
font-size:1.4rem;
font-weight:600;
color:rgba(255,255,255,1);
line-height:2.08rem;
}
.toolbar-tips{
width: 3rem;
position: relative;
margin-right: 20px;
.tips-num{
position: absolute;
top: 0;
right: -5px;
width: 1.2rem;
height: 1.2rem;
background: #ff4f29;
color: #fff;
border-radius: 50%;
font-size: 1rem;
line-height: 1.2rem;
}
}
.toolbar-icon .button-inner {
padding: 5px 10px;
color: #fff;
background-color: #575758;
border-radius: 1.25rem;
font-size: 14px;
width: 12rem;
.search-icon {
font-size: 24px;
}
}
.search{
width: 7rem;
}
.bar-button-ios {
height: 28px;
}
.navbar-search {
margin: 0;
}
.toolbar-img {
width: 50%;
}
.banner {
height: 140px;
background-color: #343435;
position: relative;
.img {
position: absolute;
border-radius: 10px;
left: 5%;
width: 90%;
top: 2%;
//transform: translate(-50%, -50%);
}
.banner-tips {
position: absolute;
right: 0px;
bottom: 20px;
width: 160px;
padding: 5px 10px;
font-weight: bold;
background-image: linear-gradient(to right, #ffffff, #fce6ad);
}
ion-slides, ion-slide {
height: 180px;
align-items: flex-end;
}
img {
height: 150px;
border-radius: 10px;
}
}
.item {
display: flex;
justify-content: center;
align-items: center;
.learn-list{
padding: 0;
}
}
.item > div {
text-align: center;
width: 50%;
}
.m11_img {
color: #ffffff;
position: relative;
img {
width: 100%;
}
}
.right-font1, .right-font2 {
position: absolute;
left: 20px;
bottom: 20px;
text-align: left;
p:first-child {
font-weight: bold;
}
p:last-child {
font-size: 12px;
}
}
.left-font {
position: absolute;
bottom: 20px;
left: 10px;
width: 100%;
text-align: left;
border-radius: 5px;
p:first-child {
font-weight: bold;
}
p:last-child {
font-size: 12px;
}
}
.img-font {
position: absolute;
bottom: 20px;
left: 10px;
text-align: left;
width: 100%;
p:first-child {
font-weight: bold;
}
p:last-child {
font-size: 12px;
}
}
.sale {
padding: 1rem 2rem;
margin-top: 20px;
margin-bottom: 10px;
overflow: hidden;
.sale-box {
display: flex;
}
.scroll-tab {
overflow-y: hidden;
overflow-x: scroll;
width: 100%;
height: 90px;
}
.sale-content {
white-space: nowrap;
}
.sale-item {
width: 40%;
display: inline-block;
position: relative;
margin-right: 20px;
.sale-desc {
position: absolute;
bottom: 10px;
left: 14px;
color: #fff;
p {
padding: 5px;
}
p:first-child {
color: #ffffff;
font-weight: bold;
font-size: 16px;
}
p:last-child {
background-image: linear-gradient(to right, #fce6ad, #fff4d9);
border-radius: 6px;
font-size: 12px;
}
}
}
}
.product {
padding:0 2rem;
margin-top: 30px;
}
.sale > p:first-child,
.person > p:first-child,
.product > p:first-child {
font-weight: bold;
font-size: 18px;
position: relative;
padding-left: 5px;
margin-bottom: 10px;
display: flex;
align-items: center;
}
.new-module {
display: flex;
align-items: center;
margin-top: 60px;
> div {
width: 25%;
text-align: center;
img {
width: 30px;
}
p {
font-size: 1.3rem;
font-weight: 400;
color: rgba(102, 102, 102, 1);
line-height: 17px;
margin-top: 5px;
}
}
}
.person {
padding: 1rem 2rem;
}
.teacher {
padding: 1rem;
background-color: #fff;
border-radius: 10px;
box-shadow: 0rem 0.08rem 0.67rem 0rem rgba(0, 0, 0, 0.1);
display: flex;
}
.teacher-info {
flex: 1;
.headPhoto {
img {
width: 50px;
height: 50px;
border-radius: 50%;
}
text-align: center;
}
> div {
flex: 1;
}
> div:nth-child(2) {
flex: 2;
text-align: center;
}
}
.teacher + .teacher {
border-top: 1px solid #dddddd;
}
.float-more {
font-size: 1rem;
font-weight: 400;
color: rgba(0, 0, 0, .7);
line-height: 1.42rem;
margin-left: auto;
}
}
import {HttpClient} from "@angular/common/http";import {Injectable} from "@angular/core";import {Observable} from "rxjs/Observable";import {SERVER_API_URL} from "../../app/app.constants";import {HTTP} from "@ionic-native/http";import {DataFormatService} from "../../core/dataFormat.service"; @Injectable()export class HomeService { constructor(private http: HttpClient, private nativeHttp: HTTP, private dataFormat: DataFormatService) { } loginpost(data):Observable<any>{ return this.http.post('/wisdomgroup/app/loginpost',data); } }
\ No newline at end of file
import {Component, ElementRef, Renderer2, ViewChild} from '@angular/core';
import {LoadingController, NavController, Slides} from 'ionic-angular';
import {HomeService} from "./home.service";
import {LearnService} from "../learning/learn.service";
import {CommonService} from "../../core/common.service";
import {Storage} from "@ionic/storage";
import {MineService} from "../mine/mine.service";
import {TabService} from "../../core/tab.service";
import {InAppBrowser} from "@ionic-native/in-app-browser";
import {AppService} from "../../app/app.service";
import {StatusBar} from "@ionic-native/status-bar";
import * as Mock from 'mockjs';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
type = 'teacher';
info = {
new: 0,
};
wow; //是否执行动画
constructor(public navCtrl: NavController, public homeSer: HomeService, private loadCtrl: LoadingController,
private learnSer: LearnService, private commonSer: CommonService, private storage: Storage,
private appSer: AppService, public statusBar: StatusBar,
private mineSer: MineService, private tabSer: TabService, private inAppBrowser: InAppBrowser,
private renderer: Renderer2) {
}
ionViewDidLoad() {
Mock.mock("/wisdomgroup/app/loginpost", {
"userInfo|4": [
{
"id|+1": 1,
"name": "@cname",
"age|18-28": 18,
"sex|1": ["男", "女"],
"job|1": ["web", "java", "php", "android", "ios"]
}
]
})
}
sendReq() {
const data = {
"userid": "",
"mobile": "13225825208",
"password": "000000",
"rememberMe": true,
"newestVersion": "4.6.0"
};
this.homeSer.loginpost(data).subscribe(
(res) => {
console.log(res);
}
)
}
}
import {HttpClient} from "@angular/common/http";import {Injectable} from "@angular/core";import {Observable} from "rxjs/Observable";import {SERVER_API_URL} from "../../app/app.constants";import {CommonService} from "../../core/common.service";import {DataFormatService} from "../../core/dataFormat.service";import {HTTP} from "@ionic-native/http"; @Injectable()export class LearnService { constructor(private http: HttpClient, private commonSer: CommonService, private dataFormatSer: DataFormatService, private nativeHttp: HTTP) { } }
\ No newline at end of file
<ion-header>
<div #scrollTab class="scroll-tab">
<div #newContentParent class="news-content parent">
<div #tabsParent class="tabs-parent parent">
<div #tabsChildren *ngFor="let item of headList;let i = index;" tappable
class="tabs-children">
<span #tabSpan [ngClass]="headType == i?'select':''">
{{item.name}}
</span>
</div>
<!-- <span #tips id="tips"></span>-->
</div>
</div>
</div>
</ion-header>
<ion-content style="position: relative;">
<ion-refresher (ionRefresh)="doRefresh($event)">
<ion-refresher-content pullingText="下拉刷新"
refreshingSpinner="bubbles">
</ion-refresher-content>
</ion-refresher>
<scroll-tabs #scrollTabs [tabsList]="tabsList"></scroll-tabs>
<course-list [list]="productList"></course-list>
<ion-list text-center style="margin-top: 10rem" *ngIf="productList.length == 0 && page.isLoading">
<img style="width: 60%;" src="./assets/imgs/no-data.png" alt="">
<p text-center style="color: #666666;font-size: 16px">
暂无课程
</p>
</ion-list>
<ion-infinite-scroll *ngIf="this.page.TotalCount > this.productList.length" (ionInfinite)="$event.complete()">
<ion-infinite-scroll-content
loadingSpinner="bubbles"
loadingText="加载中"></ion-infinite-scroll-content>
</ion-infinite-scroll>
<p class="list-footer-page"
*ngIf="page.isLoading && this.page.TotalCount == this.productList.length && this.page.TotalCount > 5">
没有更多了~~~</p>
</ion-content>
import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core';
import {IonicPageModule} from 'ionic-angular';
import {LearningPage} from './learning';
import {ComponentsModule} from "../../components/components.module";
import {ViewFilePage} from "./view-file/view-file";
import {PdfViewerModule} from "ng2-pdf-viewer";
import {PipesModule} from "../../pipes/pipes.module";
@NgModule({
declarations: [
LearningPage,
ViewFilePage,
],
imports: [
PdfViewerModule,
PipesModule,
IonicPageModule.forChild(LearningPage),
ComponentsModule,
],
entryComponents: [
ViewFilePage,
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class LearningPageModule {
}
page-learning {
ion-content {
background-color: #ffffff !important;
}
.scroll-tab{
box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.3);
}
.news-content .tabs-children{
padding: .4rem 1.5rem;
height: initial;
color: #ffffff;
font-weight: 500;
}
.header {
background-color: #343435;
display: flex;
> div {
//width: 25%;
display: flex;
align-items: center;
justify-content: space-between;
color: #ffffff;
padding: 3px 5px;
min-height: 44px;
}
}
.select {
background-image: linear-gradient(to right, #fce6ad, #ffffff);
color: #333333;
padding: .4rem 1.5rem;
border-radius: 50px;
}
.three-type {
position: absolute;
width: 100%;
text-align: center;
background-color: #fff;
border-bottom: 1px solid #aaa;
transition: height 500ms;
overflow: hidden;
box-shadow: 0px 1px 4px rgba(0,0,0,0.3);
p {
padding: 10px;
}
p + p {
border-top: 1px solid #eeeeee;
}
}
}
import {Component, ViewChild} from '@angular/core';
import {IonicPage, LoadingController, NavController, NavParams} from 'ionic-angular';
import {LearnService} from "./learn.service";
import {HomeService} from "../home/home.service";
import {Storage} from "@ionic/storage";
import {ScrollTabsComponent} from "../../components/scroll-tabs/scroll-tabs";
import {timer} from "rxjs/observable/timer";
@IonicPage()
@Component({
selector: 'page-learning',
templateUrl: 'learning.html',
})
export class LearningPage {
@ViewChild('scrollTabs') scrollTabs: ScrollTabsComponent;
code = "Subject";
tabsList = [];
productList = [];
headList = [];
headType;
page = {
SubjectID: '',
page: 1,
pageSize: "10",
TotalCount: 0,
isLoading:false,
};
loading;
constructor(public navCtrl: NavController, public navParams: NavParams, private loadCtrl: LoadingController,
private learnSer: LearnService, private homeSer: HomeService, private storage: Storage) {
}
ionViewDidLoad() {
this.storage.get('course').then((value => {
if (value) { //其他路径转入
this.page.SubjectID = value.item.ID;
this.headType = value.headType;
} else { //tab栏进入
this.headType = 'all';
}
}))
}
doRefresh(e) {
this.page.page = 1;
timer(1000).subscribe((res) => {
e.complete();
});
}
ionViewWillLeave() {
// this.productList = [];
this.storage.set('course', null);
}
}
<ion-header>
<ion-navbar>
<ion-title>{{displayData.title}}</ion-title>
<ion-buttons start>
<button ion-button tappable (click)="cancel()">
<span class="color-fff" ion-text>取消</span>
</button>
</ion-buttons>
</ion-navbar>
</ion-header>
<ion-content padding class="viewFile">
<ion-icon ion-fixed name="add" tappable (click)="changeZoom('add')"></ion-icon>
<ion-icon ion-fixed name="remove" tappable (click)="changeZoom('remove')"></ion-icon>
<pdf-viewer [src]="displayData.pdfSource"
[show-all]="true"
[original-size]="false"
[zoom]="currentZoom"
[render-text]="false"
[autoresize]="true"
(error)="onError($event)"
(on-progress)="progress($event)"
(after-load-complete)="afterLoad($event)"
style="display: block">
</pdf-viewer>
</ion-content>
page-view-file {
.viewFile{
position: relative;
ion-icon{
top: 15px;
font-size: 40px;
z-index: 999;
font-weight: bold;
color: #666666;
}
ion-icon[name="add"]{
right: 15px;
}
ion-icon[name="remove"]{
left: 15px;
}
}
}
import {Component} from '@angular/core';
import {IonicPage, LoadingController, NavController, NavParams, ViewController} from 'ionic-angular';
import {PDFDocumentProxy} from "pdfjs-dist";
import {CommonService} from "../../../core/common.service";
@Component({
selector: 'page-view-file',
templateUrl: 'view-file.html',
})
export class ViewFilePage {
displayData: any = {};
totalPage;
currentZoom = 1;
uploadLoading;
constructor(public navCtrl: NavController, public navParams: NavParams, private commerSer: CommonService,
private viewCtrl: ViewController, private loadingCtrl: LoadingController) {
}
ionViewDidLoad() {
this.displayData = this.navParams.get('displayData');
console.log(this.displayData);
this.uploadLoading = this.loadingCtrl.create({
content: '加载中...',
dismissOnPageChange: true,
enableBackdropDismiss: true,
});
this.uploadLoading.present();
}
cancel() {
this.viewCtrl.dismiss();
}
//加载进度条
progress(ev) {
let progress = Math.round(100.0 * ev.loaded / this.displayData.Size);
this.uploadLoading.setContent('加载中...' + progress + '%');
}
//加载完成
afterLoad(pdf: PDFDocumentProxy) {
this.uploadLoading.dismiss();
this.totalPage = pdf.numPages;
}
//加载出错
onError(ev) {
this.commerSer.alert(JSON.stringify(ev));
}
//放大or缩小
changeZoom(type){
if(type == "add") this.currentZoom += 0.2;
if(type == "remove") this.currentZoom -= 0.2;
}
}
<ion-header>
<ion-navbar>
</ion-navbar>
</ion-header>
<ion-content>
<div class="login">
<div class="back-img">
<img src="./assets/imgs/login/login_bg.png" alt="">
</div>
</div>
</ion-content>
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import { LoginPage } from './login';
import {ComponentsModule} from "../../components/components.module";
@NgModule({
declarations: [
LoginPage,
],
imports: [
IonicPageModule.forChild(LoginPage),
ComponentsModule,
],
})
export class LoginPageModule {}
page-login {
.header-ios .toolbar-ios:last-child .toolbar-background-ios {
background-color: #1a1a1a;
border: 0.55px solid #1a1a1a;
}
.login {
height: 100%;
position: relative;
.back-img {
height: 100%;
img {
width: 100%;
}
}
.login-form {
position: absolute;
top: 0;
left: 0;
width: 100%;
z-index: 1;
}
}
.login-select {
position: absolute;
top: 0;
left: 0;
width: 60%;
.select-ios {
border: 1px solid #ccc;
border-radius: 100px;
color: #ffffff;
margin-left: 10%;
padding: 3px 8px;
font-size: 1.2rem;
max-width: 35%;
}
}
.loginPlatform {
display: flex;
color: #ffffff;
align-items: center;
justify-content: space-around;
margin: 2rem 0;
.plat {
position: relative;
}
.plat::after {
content: "";
position: absolute;
left: 50%;
bottom: -1rem;
transform: translate(-50%, -50%);
width: 2.4rem;
height: 4px;
background: linear-gradient(241deg, rgba(255, 247, 203, 1) 0%, rgba(255, 201, 45, 1) 100%);
border-radius: 2px;
}
}
.logo {
text-align: center;
margin-bottom: 20px;
img {
height: 100px;
}
}
.login-input {
width: 85%;
margin: 0 auto;
position: relative;
.input-input {
margin-bottom: 20px;
width: calc(100% - 10px);
background-color: #fff;
border: 1px solid #ffffff;
border-radius: 50px;
padding-left: 20px;
-webkit-user-select:text !important;
input{
-webkit-user-select:text !important;
}
}
input {
margin: 11px 8px 11px 0;
padding: 0;
width: calc(100% - 8px);
border: 0;
font-size: 1.5rem;
background: transparent;
}
.check {
position: relative;
.flash {
position: absolute;
top: 50%;
right: 12px;
transform: translate(-12px, -50%);
width: 20px;
}
.checkCode {
position: absolute;
top: 50%;
right: 25px;
transform: translate(-25px, -50%);
}
}
}
.login-button {
text-align: center;
width: 85%;
margin: 40px auto;
height: 40px;
line-height: 40px;
background-image: linear-gradient(to right, #fecc4b, #feeaa5);
border-radius: 100px;
img {
height: 60px;
}
}
.scroll-content {
margin-bottom: 0 !important;
}
}
.action-sheet-group {
button.action-sheet-button {
color: #000000;
font-size: 1.6rem;
min-height: 4rem;
padding: 0;
}
button.action-sheet-selected {
color: #FA6400;
}
}
import {HttpClient} from "@angular/common/http";import {Injectable} from "@angular/core";import {Observable} from "rxjs/Observable";import { SERVER_API_URL,} from "../../app/app.constants";import {HTTP} from "@ionic-native/http";import {DataFormatService} from "../../core/dataFormat.service"; @Injectable()export class LoginService { constructor(private http: HttpClient, private nativeHttp: HTTP, private dataForm: DataFormatService) { } }
\ No newline at end of file
import {Component, ViewChild} from '@angular/core';
import {IonicPage, LoadingController, NavController, NavParams, Slides} from 'ionic-angular';
import {TabsPage} from "../tabs/tabs";
import {LoginService} from "./login.service";
import {Storage} from "@ionic/storage";
import {AppService} from "../../app/app.service";
import {CommonService} from "../../core/common.service";
import {CheckCodeComponent} from "../../components/check-code/check-code";
import {Keyboard} from "@ionic-native/keyboard";
import {StatusBar} from "@ionic-native/status-bar";
import {timer} from "rxjs/observable/timer";
import {DatePipe} from "@angular/common";
import {RandomWordService} from "../../secret/randomWord.service";
declare let md5: any;
declare let JSEncrypt: any;
@IonicPage()
@Component({
selector: 'page-login',
templateUrl: 'login.html',
})
export class LoginPage {
@ViewChild('checkCodeJunke') checkCodeJunke: CheckCodeComponent;
@ViewChild('checkCodeXszs') checkCodeXszs: CheckCodeComponent;
@ViewChild('checkCodeGys') checkCodeGys: CheckCodeComponent;
@ViewChild('checkCodeYG') checkCodeYG: CheckCodeComponent;
@ViewChild(Slides) slides: Slides;
constructor(public navCtrl: NavController, public navParams: NavParams, private loadCtrl: LoadingController,
private datePipe: DatePipe,
private randomWord: RandomWordService,
private loginSer: LoginService, private storage: Storage, private appSer: AppService,
private commonSer: CommonService, private keyboard: Keyboard, public statusBar: StatusBar) {
this.statusBar.backgroundColorByHexString('#1a1a1a');
}
ionViewDidLoad() {
}
}
<ion-header>
<ion-navbar>
<ion-title></ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<ion-refresher (ionRefresh)="$event.complete()">
<ion-refresher-content pullingText="下拉刷新" refreshingSpinner="bubbles">
</ion-refresher-content>
</ion-refresher>
</ion-content>
<ng-container *ngIf="appVersionInfo.UpdateTips">
<update-app (done)="appVersionInfo.UpdateTips = false" [AppUrl]="appVersionInfo.AppUrl"
[UpdateText]="appVersionInfo.UpdateText"></update-app>
</ng-container>
import {CUSTOM_ELEMENTS_SCHEMA, NgModule, NO_ERRORS_SCHEMA} from '@angular/core';
import {IonicPageModule} from 'ionic-angular';
import {MinePage} from "./mine";
import {NavbarComponent} from "../../components/navbar/navbar";
import {ComponentsModule} from "../../components/components.module";
@NgModule({
declarations: [
MinePage,
],
imports: [
IonicPageModule.forChild(MinePage),
ComponentsModule,
],
entryComponents: [
NavbarComponent,
],
schemas: [NO_ERRORS_SCHEMA]
})
export class MineModule {
}
page-mine {
.mine {
height: 180px;
background-color: #343435;
position: relative;
}
.logo {
text-align: center;
img {
width: 50%;
}
}
//个人信息区域
.mine-info {
position: absolute;
left: 20px;
right: 20px;
bottom: -50px;
width: calc(100% - 40px);
height: 90%;
background-color: #fff;
border-radius: 6px;
padding: 15px 20px;
}
.info-item {
display: flex;
align-items: center;
justify-content: center;
> div:nth-child(2n +1) {
width: 20%;
}
> div:nth-child(2n) {
width: 25%;
// padding-left: 10px;
}
.info-name {
flex: 1;
p:first-child {
font-weight: bold;
font-size: 20px;
display: flex;
align-items: center;
height: 30px;
line-height: 30px;
}
.forumTitle {
border-radius: 4px;
border: 1px solid rgba(235, 192, 68, 1);
font-size: 12px;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: rgba(235, 192, 68, 1);
line-height: 14px;
display: inline-block;
transform: scale(0.8);
margin-left: 10px;
padding: 2px 4px;
}
.credit {
font-size: 13px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(0, 0, 0, 1);
line-height: 18px;
margin-left: 10px;
}
}
.info-position {
font-size: 12px;
a {
color: #333333;
background-image: linear-gradient(to right, #feca46, #fee6a3);
padding: 4px 5px;
border-radius: 4px;
}
img {
max-width: 100%;
vertical-align: sub;
margin-right: 5px;
}
}
}
.item-type {
text-align: center;
> div > p:first-child {
font-size: 4rem;
font-weight: 400;
color: #333333;
}
> div > p:last-child {
font-size: 12px;
color: #999999;
}
}
.info-item + .info-item {
margin-top: 10px;
}
//列表区域
.mine-list {
margin: 65px 20px;
background-color: #fff;
border-radius: 6px;
}
.item {
display: flex;
align-items: center;
justify-content: center;
padding: 15px;
img {
width: 20px;
}
> div:nth-child(2n +1) {
display: flex;
align-items: center;
justify-content: center;
width: 10%;
}
> div:nth-child(2n) {
width: 80%;
padding-left: 10px;
span {
color: #C4C4C4;
letter-spacing: 1px;
}
}
.right {
font-size: 1.6rem;
color: #999999;
height: 20px;
}
}
.item + .item {
border-top: 0.1rem solid #e3e3e3;
}
.mask1 {
display: inline-block;
position: relative;
width: 4rem;
height: 4rem;
overflow: hidden;
border-radius: 50%;
}
.img3 {
width: auto;
height: 100%;
//margin-left:0;
}
}
import {HttpClient} from "@angular/common/http";import {Injectable} from "@angular/core";import {Observable} from "rxjs/Observable";import {SERVER_API_URL} from "../../app/app.constants";import {HTTP} from "@ionic-native/http";import {DataFormatService} from "../../core/dataFormat.service"; @Injectable()export class MineService { constructor(private http: HttpClient, private nativeHttp: HTTP, private dataForm: DataFormatService) { } }
\ No newline at end of file
import {Component} from '@angular/core';
import {App, Events, IonicPage, NavController, NavParams, Platform} from 'ionic-angular';
import {AppService} from "../../app/app.service";
import {Storage} from "@ionic/storage";
import {MineService} from "./mine.service";
import {timer} from "rxjs/observable/timer";
import {LoginService} from "../login/login.service";
import {InAppBrowser} from "@ionic-native/in-app-browser";
import {AppVersion} from "@ionic-native/app-version";
import {LogoutService} from "../../secret/logout.service";
import {CommonService} from "../../core/common.service";
@Component({
selector: 'page-mine',
templateUrl: 'mine.html',
})
export class MinePage {
mineInfo;
userInfo;
number;
version;
appVersionInfo = {
UpdateTips: false,
AppUrl: '',
UpdateText: '',
}
constructor(public navCtrl: NavController, public navParams: NavParams, private logoutSer: LogoutService,
private mineSer: MineService, private events: Events, private appVersion: AppVersion,
private loginSer: LoginService, private inAppBrowser: InAppBrowser,
private platform: Platform,
private commonSer: CommonService,
private appSer: AppService, private app: App, private storage: Storage) {
//获取个人信息
this.storage.get('user').then(value => {
this.mineInfo = value;
})
}
ionViewDidEnter() {
this.getVersion();
}
//检测当前版本
getVersion() {
//检测是否需要更新
this.appVersion.getVersionNumber().then((version: string) => {
this.version = version;
}).catch(err => {
console.log(err);
});
}
//检测版本
checkVersion() {
let versionCode;
let platform;
if (this.platform.is('ios')) platform = 'IOS';
if (this.platform.is('android')) platform = 'android';
this.appVersion.getVersionNumber().then((version: string) => {
versionCode = version.split('.').join('');
const data = {
code: platform
}
}).catch(err => {
console.log(err);
});
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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