Commit bcfac94c by Chao Sun

init

parents
# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
max_line_length = off
trim_trailing_whitespace = false
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/dist
/tmp
/out-tsc
# Only exists if Bazel was run
/bazel-out
# dependencies
/node_modules
# profiling files
chrome-profiler-events.json
speed-measure-plugin.json
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# misc
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
npm-debug.log
yarn-error.log
testem.log
/typings
# System Files
.DS_Store
Thumbs.db
# YdLife
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.3.5.
## Development server
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
## Code scaffolding
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
## Build
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
## Running unit tests
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"ydLife": {
"root": "",
"sourceRoot": "src", // 源码根目录
"projectType": "application",
"prefix": "ydlife", // 使用`ng generate`命令时,自动为selector元数据的值添加的前缀名
"schematics": {
"@schematics/angular:component": {
"style": "scss"
}
},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/",
"index": "src/index.html", //指定首页文件,默认值是`index.html`
"main": "src/main.ts", // 指定应用的入门文件
"polyfills": "src/polyfills.ts", // 指定polyfill文件
"tsConfig": "src/tsconfig.app.json", // 指定tsconfig文件
"assets": [ // 记录资源文件夹,构建时复制到`outDir`指定的目录
"src/favicon.ico",
"src/assets"
],
"styles": [ // 引入全局样式,构建时会打包进来,常用于第三方库引入的样式
"src/assets/font/iconfont.css",
"src/assets/weui/weui.css",
"src/styles.scss"
],
"scripts": [], // 引入全局脚步,构建时会打包进来,常用于第三方库引入的脚本
"es5BrowserSupport": true
},
"configurations": {
"dev": {
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"deployUrl": "",
"baseHref": "/ydLife/",
"namedChunks": false,
"aot": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": false,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
},
"stage": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.stage.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"deployUrl": "",
"baseHref": "/ydLife/",
"namedChunks": false,
"aot": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": false,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
},
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"deployUrl": "",
"baseHref": "/ydLife/",
"namedChunks": false,
"aot": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": false,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ydLife:build"
},
"configurations": {
"production": {
"browserTarget": "ydLife:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ydLife:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"karmaConfig": "src/karma.conf.js",
"styles": [
"src/styles.scss"
],
"scripts": [],
"assets": [
"src/favicon.ico",
"src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"ydLife-e2e": {
"root": "e2e/",
"projectType": "application",
"prefix": "",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "ydLife:serve"
},
"configurations": {
"production": {
"devServerTarget": "ydLife:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
}
},
"defaultProject": "ydLife"
}
\ No newline at end of file
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./src/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
onPrepare() {
require('ts-node').register({
project: require('path').join(__dirname, './tsconfig.e2e.json')
});
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
};
\ No newline at end of file
import { AppPage } from './app.po';
import { browser, logging } from 'protractor';
describe('workspace-project App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
it('should display welcome message', () => {
page.navigateTo();
expect(page.getTitleText()).toEqual('Welcome to ydLife!');
});
afterEach(async () => {
// Assert that there are no errors emitted from the browser
const logs = await browser.manage().logs().get(logging.Type.BROWSER);
expect(logs).not.toContain(jasmine.objectContaining({
level: logging.Level.SEVERE,
} as logging.Entry));
});
});
import { browser, by, element } from 'protractor';
export class AppPage {
navigateTo() {
return browser.get(browser.baseUrl) as Promise<any>;
}
getTitleText() {
return element(by.css('app-root h1')).getText() as Promise<string>;
}
}
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"module": "commonjs",
"target": "es5",
"types": [
"jasmine",
"jasminewd2",
"node"
]
}
}
\ No newline at end of file
File added
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "protest",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve --host 192.168.1.25",
"buildDev": "ng build -c=dev --prod",
"buildStage": "ng build -c=stage --prod",
"buildProd": "ng build -c=production --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "~7.2.0",
"@angular/common": "~7.2.0",
"@angular/compiler": "~7.2.0",
"@angular/core": "~7.2.0",
"@angular/forms": "~7.2.0",
"@angular/platform-browser": "~7.2.0",
"@angular/platform-browser-dynamic": "~7.2.0",
"@angular/router": "~7.2.0",
"buffer": "^5.4.3",
"core-js": "^2.5.4",
"html2canvas": "^1.0.0-rc.5",
"rxjs": "~6.3.3",
"tslib": "^1.9.0",
"uuid": "^3.3.3",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.13.0",
"@angular/cli": "~7.3.5",
"@angular/compiler-cli": "~7.2.0",
"@angular/language-service": "~7.2.0",
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "~4.5.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~4.0.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.4.0",
"ts-node": "~7.0.0",
"tslint": "~5.11.0",
"typescript": "~3.2.2"
}
}
\ No newline at end of file
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';
import { AuthGuard } from './auth/auth.guard';
const routes: Routes = [
{ path: '', redirectTo: '/my', pathMatch: 'full' },
{ path: 'my', loadChildren: () => import('./my/my.module').then(mod => mod.MyModule), canLoad: [AuthGuard] },
{ path: 'login', loadChildren: () => import('./auth/auth.module').then(mod => mod.AuthModule) },
{ path: '**', component: PageNotFoundComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {
}
<!--The content below is only a placeholder and can be replaced.-->
<router-outlet></router-outlet>
<ydlife-guide-page *ngIf="shareGuidePageEnable"></ydlife-guide-page>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
\ No newline at end of file
import { TestBed, async } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
}).compileComponents();
}));
it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
});
it(`should have as title 'ydLife'`, () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app.title).toEqual('ydLife');
});
it('should render title in a h1 tag', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('Welcome to ydLife!');
});
});
import { Component, OnDestroy, OnInit } from '@angular/core';
import { AuthService } from "./auth/auth.service";
import { LifeCommonService } from "./common/life-common.service";
import { Subscription } from "rxjs/index";
declare var wx: any;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit, OnDestroy {
shareGuidePageEnable: boolean;
subscription: Subscription;
currentVersion: any;
isNeedAlert: boolean;
dialogInfo: any;
constructor(private authService: AuthService, private lifeCommonService: LifeCommonService) {
this.subscription = lifeCommonService.shareStatus$.subscribe(status => {
this.shareGuidePageEnable = status == '1';
});
}
ngOnInit() {
this.authService.obtainToken().subscribe(res => {
if (res['success']) {
localStorage.setItem('lifeToken', res['data']['token']);
this.ydWxConfig();
}
});
this.getVersion();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
// 微信JS-SDK注册
ydWxConfig() {
const url = encodeURIComponent(location.href.split('#')[0]);
this.authService.ydWxConfig(url).subscribe(res => {
const data = res['data'];
wx.config({
debug: false,
appId: data.appId,
timestamp: data.timestamp,
nonceStr: data.nonceStr,
signature: data.signature,
jsApiList: data.jsApiList,
beta: true
});
});
}
// 关闭弹窗
getPopInfo() {
this.isNeedAlert = false;
let { search, href } = window.location;
href = href.replace(/&?t_reload=(\d+)/g, '');
window.location.href = href + (search ? '&' : '?') + 't_reload=' + new Date().getTime();
localStorage.setItem('Version', this.currentVersion)
}
getVersion() {
this.authService.currentVersionQuery().subscribe((res) => {
if (res['data']['currentVersion']) {
this.currentVersion = res['data']['currentVersion'];
}
//只在微信端判断缓存
if (this.lifeCommonService.checkDeviceType() === '3') {
//如果本地没有版本号刷新并设置缓存
if (!localStorage.getItem('Version')) {
this.isNeedAlert = true;
this.dialogInfo = {
title: null,
content: { value: '检测到新版本', align: 'center' },
footer: [{ value: '更新', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
} else {
const Version = localStorage.getItem('Version');
//如果缓存有版本号对比本地和接口版本
if (Version != this.currentVersion) {
this.isNeedAlert = true;
this.dialogInfo = {
title: null,
content: { value: '检测到新版本', align: 'center' },
footer: [{ value: '更新', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}
}
}
})
}
}
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';
import { MyModule } from './my/my.module';
import { Router } from '@angular/router';
import { AuthModule } from './auth/auth.module';
import { HttpClientModule } from '@angular/common/http';
import { LifeCommonModule } from './common/life-common.module';
import { httpInterceptorProviders } from './http-interceptors/index';
import { DatePipe } from "@angular/common";
import { SafeHtmlPipe } from './safe-html.pipe';
import { LocalStorage } from './domain/local.storage';
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
@NgModule({
declarations: [
AppComponent,
PageNotFoundComponent,
SafeHtmlPipe
],
imports: [
BrowserModule,
MyModule,
AuthModule,
LifeCommonModule,
HttpClientModule,
AppRoutingModule,
BrowserAnimationsModule
],
providers: [DatePipe, httpInterceptorProviders, LocalStorage],
bootstrap: [AppComponent]
})
export class AppModule {
}
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import {LoginComponent} from './login/login.component';
const routes: Routes = [
{ path: '', component: LoginComponent }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class AuthRoutingModule { }
import { TestBed, async, inject } from '@angular/core/testing';
import { AuthGuard } from './auth.guard';
describe('AuthGuard', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [AuthGuard]
});
});
it('should ...', inject([AuthGuard], (guard: AuthGuard) => {
expect(guard).toBeTruthy();
}));
});
import { Injectable } from '@angular/core';
import {
CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot,
CanActivateChild,
NavigationExtras,
CanLoad, Route
} from '@angular/router';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root',
})
export class AuthGuard implements CanActivate, CanActivateChild, CanLoad {
constructor(private authService: AuthService, private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.checkLogin(url);
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.canActivate(route, state);
}
canLoad(route: Route): boolean {
let url = `/${route.path}`;
return this.checkLogin(url);
}
checkLogin(url: string): boolean {
const lifeCustomerInfo = localStorage.getItem('lifeCustomerInfo') ? JSON.parse(localStorage.getItem('lifeCustomerInfo')) : null;
if (this.authService.isLoggedIn || (lifeCustomerInfo && lifeCustomerInfo['customerId'] && lifeCustomerInfo['practitionerId'])) {
return true;
}
// Store the attempted URL for redirecting
this.authService.redirectUrl = url;
// Navigate to the login page with extras
this.router.navigate(['/login']);
return false;
}
}
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {AuthRoutingModule} from './auth-routing.module';
import {LoginComponent} from './login/login.component';
import {LifeCommonModule} from "../common/life-common.module";
@NgModule({
declarations: [LoginComponent],
imports: [
CommonModule,
LifeCommonModule,
AuthRoutingModule
]
})
export class AuthModule {
}
import { TestBed } from '@angular/core/testing';
import { AuthService } from './auth.service';
describe('AuthService', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: AuthService = TestBed.get(AuthService);
expect(service).toBeTruthy();
});
});
import { Injectable } from '@angular/core';
import { Observable, of, throwError } from 'rxjs';
import { environment } from '../../environments/environment';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { catchError } from 'rxjs/internal/operators';
@Injectable({
providedIn: 'root',
})
export class AuthService {
constructor(private http: HttpClient) {
}
private API = environment.BACKEND_URL_CONFIG_VALUE;
private ydapi = environment.ORIGINNAME;
isLoggedIn = false;
// store the URL so we can redirect after logging in
redirectUrl: string;
// 经纪人登陆
login(loginInfo): Observable<any> {
const api = this.ydapi + '/practitioner/login';
return this.http.post(api, JSON.stringify(loginInfo));
}
// 发送验证码
verificationCode(verticalCode) {
const url = this.API + '/verificationCode';
return this.http
.post(url, JSON.stringify(verticalCode));
}
// 校验验证码
compare(compareCode) {
const url = this.API + '/checkVerificationCode';
return this.http
.post(url, JSON.stringify(compareCode))
.pipe(
catchError(this.handleError)
);
}
/**
* 获取TOKEN
*/
obtainToken() {
const url = this.API + '/authorize/obtainToken';
const ticketObj = {
ticket: 'life'
};
return this.http.post(url, JSON.stringify(ticketObj));
}
//获取微信配置ydLife公众号
ydWxConfig(Currenturl) {
const url = this.ydapi + '/wxConfig';
const postUrl = {
url: Currenturl
};
return this.http.post(url, JSON.stringify(postUrl));
}
// 获取错误详情
private handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
console.error('An error occurred:', error.error.message);
} else {
console.error(
`Backend returned code ${error.status}, ` +
`body was: ${JSON.stringify(error.error)}`);
}
return throwError(
'Something bad happened; please try again later.');
}
currentVersionQuery() {
const url = this.API + '/metadata/currentVersionQuery';
return this.http.get(url);
}
getOppId(urlParam) {
return this.http.get(urlParam)
}
}
<div class="page form_vcode js_show">
<div class="weui-form">
<div class="weui-form__text-area" style="position: relative;">
<img style="width: 100%;" src="assets/images/ydinsurance_logo.png">
<div style="font-family: '微软雅黑';position: absolute; top: 65%;left: 35%;font-size: 14px;">
海纳百<span style="letter-spacing: 3px;"></span>赢家后盾
</div>
</div>
<div class="weui-form__control-area">
<div class="weui-cells__group weui-cells__group_form">
<div class="weui-cells weui-cells_form">
<div class="weui-cell" style="padding:10px 0px">
<!-- <div class="weui-cell__hd"><label class="weui-label">手机号</label></div> -->
<div class="weui-cell__bd">
<input autofocus="" class="weui-input" type="tel" maxlength="11" pattern="[0-9]*" placeholder="请输入手机号"
name="mobileNo" [(ngModel)]="userInfo.mobileNo" (blur)="inputBlur()">
</div>
</div>
<div class="weui-cell weui-cell_vcode" style="padding:12px 0px">
<!-- <div class="weui-cell__hd"><label class="weui-label">验证码</label></div> -->
<div class="weui-cell__bd">
<input class="weui-input" type="tel" pattern="[0-9]*" id="js_input" placeholder="请输入验证码" maxlength="4"
name="verificationCode" [(ngModel)]="userInfo.verificationCode" (blur)="inputBlur()">
</div>
<div class="weui-cell__ft">
<button class="weui-btn weui-btn_default weui-vcode-btn" (click)="verificationCode()">{{sendCodeHtml}}
</button>
</div>
</div>
</div>
</div>
</div>
<div class="weui-form__opr-area">
<a class="weui-btn weui-btn_primary login" href="javascript:" id="showTooltips"
style="width:100%;padding: 10px 24px;" (click)="login()">登录</a>
</div>
</div>
</div>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
\ No newline at end of file
.weui-form__control-area{
margin: 20px 0 45px 0;
}
.weui-form{
padding: 56px 15px 0px 15px;
}
.weui-form__opr-area{
.login{
color: #fff;
background: #ff1c2b;
}
}
.weui-cells__group_form .weui-cells:before, .weui-cells__group_form .weui-cell:before{
left:0;
right: 0;
}
.weui-cells__group_form .weui-cells:before{
border-top: none;
}
.weui-cells__group_form .weui-cells:after {
left: 0;
right: 0;
}
.weui-cells__group_form .weui-vcode-btn{
background: none;
background: none;
border: 1px red solid;
color: red;
font-weight: normal;
}
.weui-input {
caret-color: red;
font-size: 20px;
padding-left: 10px;
}
.weui-input::-webkit-input-placeholder {
font-size: 20px;
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginComponent } from './login.component';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ LoginComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnDestroy, OnInit } from '@angular/core';
import { NavigationExtras, Router } from '@angular/router';
import { AuthService } from '../auth.service';
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit, OnDestroy {
MOBILE_REGEXP = /^(1)\d{10}$/;
sendCodeHtml: string = '获取验证码';
timer: any;
remainTimes: number = 60;
disabledSendBtn: boolean = false;
userInfo: any = {
mobileNo: null,
verificationCode: null
};
isNeedAlert: boolean;
dialogInfo: any;
redirect: any;
constructor(public authService: AuthService, public router: Router, public lifeCommonService: LifeCommonService) {
}
ngOnInit() {
}
ngOnDestroy() {
clearInterval(this.timer);
}
inputBlur() {
window.scrollTo(0, 0)
}
login() {
const compareInfo = {
mobileNo: this.userInfo.mobileNo,
verificationCode: this.userInfo.verificationCode,
expireTime: '3600'
};
if (this.MOBILE_REGEXP.test(this.userInfo.mobileNo) && this.userInfo.verificationCode && this.userInfo.verificationCode.length == 4) {
this.authService.compare(compareInfo).subscribe(res => {
if (res['success']) {
this.authService.login({ mobileNo: this.userInfo.mobileNo }).subscribe((response) => {
if (response['success']) {
this.authService.isLoggedIn = true;
const lifeCustomerInfo = { ...response.data, mobileNo: this.userInfo.mobileNo, commonResult: null };
if (lifeCustomerInfo['customerId'] && lifeCustomerInfo['practitionerId']) {
localStorage.setItem('lifeCustomerInfo', JSON.stringify(lifeCustomerInfo));
//如果有openId跳页由后端判断,没有的话根据登录次数前端判断跳页
if (response['data']['getOpenIdUrl']) {
const deviceType = this.lifeCommonService.checkDeviceType()
if (deviceType == 3) {
window.location.href = response['data']['getOpenIdUrl'];
} else {
if (response['data']['loginTimes'] > 0) {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my';
this.router.navigateByUrl(this.redirect);
} else {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/thanks';
this.router.navigateByUrl(this.redirect);
}
}
} else {
if (response['data']['loginTimes'] > 0) {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my';
this.router.navigateByUrl(this.redirect);
} else {
this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/thanks';
this.router.navigateByUrl(this.redirect);
}
}
// if (response['data']['loginTimes'] > 0) {
// this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my';
// this.router.navigateByUrl(this.redirect);
// // if (response['data']['getOpenIdUrl']) {
// // window.location.href = response['data']['getOpenIdUrl'];
// // } else {
// // this.redirect = this.authService.redirectUrl ? this.router.parseUrl(this.authService.redirectUrl) : '/my';
// // this.router.navigateByUrl(this.redirect);
// // }
// } else {
// this.router.navigateByUrl('/thanks')
// // if (response['data']['getOpenIdUrl']) {
// // window.location.href = response['data']['getOpenIdUrl'];
// // } else {
// // this.router.navigateByUrl('/thanks')
// // }
// }
} else {
this.openPopInfo('暂无查询资格');
}
} else {
this.openPopInfo(response['message']);
}
});
} else {
this.openPopInfo(res['message']);
}
});
} else {
this.openPopInfo('手机号或验证码不正确');
}
}
// 发送验证码
verificationCode() {
const verificationInfo = {
mobileNo: this.userInfo.mobileNo,
type: '1'
};
if (this.MOBILE_REGEXP.test(this.userInfo.mobileNo) && !this.disabledSendBtn) {
this.authService.verificationCode(verificationInfo).subscribe(res => {
if (res['success']) {
this.countDown();
} else {
this.openPopInfo(res['message']);
}
});
} else if (!this.MOBILE_REGEXP.test(this.userInfo.mobileNo)) {
this.openPopInfo('手机号不正确');
}
}
// 倒计时
countDown() {
this.disabledSendBtn = true;
this.timer = setInterval(() => {
this.remainTimes--;
this.sendCodeHtml = `${this.remainTimes}(S)`;
if (this.remainTimes <= 0) {
this.sendCodeHtml = '获取验证码';
this.remainTimes = 60;
this.disabledSendBtn = false;
clearInterval(this.timer);
}
}, 1000);
}
// 打开弹窗
openPopInfo(message) {
this.isNeedAlert = true;
this.dialogInfo = {
title: null,
content: { value: message, align: 'center' },
footer: [{ value: '我知道了', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}
// 关闭弹窗
getPopInfo() {
this.isNeedAlert = false;
}
}
<div id="dialogs">
<!--BEGIN dialog1-->
<div class="js_dialog" id="iosDialog1">
<div class="weui-mask"></div>
<div class="weui-dialog" style="width: 70%;">
<div class="weui-dialog__hd" *ngIf="dialogInfo.title"><strong
class="weui-dialog__title">{{dialogInfo.title}}</strong></div>
<div class="weui-dialog__bd" [ngStyle]="{'text-align':dialogInfo.content.align}">{{dialogInfo.content.value}}
</div>
<div class="weui-dialog__ft" style="line-height: normal;min-height: auto;margin: 0 auto 10px auto;">
<a href="javascript:;" class="weui-dialog__btn" [ngClass]="footer.className"
*ngFor="let footer of dialogInfo.footer" (click)="sendInfo()">{{footer.value}}</a>
</div>
</div>
</div>
<!--END dialog1-->
</div>
\ No newline at end of file
a:hover.weui-dialog__ft{
color: #fff;
text-decoration: none;
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AlertComponent } from './alert.component';
describe('AlertComponent', () => {
let component: AlertComponent;
let fixture: ComponentFixture<AlertComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AlertComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AlertComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
@Component({
selector: 'ydlife-alert',
templateUrl: './alert.component.html',
styleUrls: ['./alert.component.scss']
})
export class AlertComponent implements OnInit {
@Input() dialogInfo: any;
@Output() popInfo = new EventEmitter();
constructor() {
this.dialogInfo = {
title: null,
content: {value: '弹窗内容', align: 'center'},
footer: [{value: '我知道了', routerLink: '', className: 'weui-dialog__btn_primary'}],
};
}
ngOnInit() {
}
sendInfo() {
this.popInfo.emit();
}
}
<div class="guidePageContainer" (click)="closeGuidePage()">
<div class="guideTips">
<p>请点击右上角菜单</p>
<p>分享给朋友</p>
</div>
<i class="iconfont icon-yindaojiantou"></i>
</div>
.guidePageContainer {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
color: #fff;
display: flex;
justify-content: center;
.guideTips {
margin-top: 35%;
letter-spacing: 3px;
text-align: center;
font-size: 22px;
}
.iconfont {
position: absolute;
right: 8%;
font-size: 40px;
top: 2px;
font-weight: 700;
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { GuidePageComponent } from './guide-page.component';
describe('GuidePageComponent', () => {
let component: GuidePageComponent;
let fixture: ComponentFixture<GuidePageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ GuidePageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(GuidePageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { LifeCommonService } from "../life-common.service";
@Component({
selector: 'ydlife-guide-page',
templateUrl: './guide-page.component.html',
styleUrls: ['./guide-page.component.scss']
})
export class GuidePageComponent implements OnInit {
constructor(private lifeCommonService: LifeCommonService) {
}
ngOnInit() {
setTimeout(() => {
this.closeGuidePage();
}, 6000);
}
closeGuidePage() {
this.lifeCommonService.shareStatusPublish(0);
}
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AlertComponent } from './alert/alert.component';
import { FormsModule } from "@angular/forms";
import { GuidePageComponent } from './guide-page/guide-page.component';
import { SafeHtmlPipe } from './safe-html.pipe';
@NgModule({
declarations: [AlertComponent, GuidePageComponent, SafeHtmlPipe],
imports: [
CommonModule,
FormsModule
],
exports: [
FormsModule,
AlertComponent,
GuidePageComponent,
SafeHtmlPipe
]
})
export class LifeCommonModule {
}
import { TestBed } from '@angular/core/testing';
import { LifeCommonService } from './life-common.service';
describe('LifeCommonService', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: LifeCommonService = TestBed.get(LifeCommonService);
expect(service).toBeTruthy();
});
});
import { Injectable } from '@angular/core';
import { DatePipe } from '@angular/common';
import { Meta, Title } from '@angular/platform-browser';
import { Subject } from "rxjs/index";
declare var wx: any;
@Injectable({
providedIn: 'root'
})
export class LifeCommonService {
private shareStatusSource = new Subject<string>();
shareStatus$ = this.shareStatusSource.asObservable();
constructor(private datePipe: DatePipe,
private titleService: Title,
private metaService: Meta) {
}
// 向订阅者发布分享结果
// 0.关闭分享引导页
// 1.用户点击分享
// 2.已经分享过了
shareStatusPublish(type) {
this.shareStatusSource.next(type);
}
/**
* 检测操作系统
*/
checkOs() {
let os;
const isWin = (navigator.platform === 'Win32') || (navigator.platform === 'Windows');
const isMac = (navigator.platform === 'Mac68K') ||
(navigator.platform === 'MacPPC') ||
(navigator.platform === 'Macintosh') ||
(navigator.platform === 'MacIntel');
if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
os = 1;
return os; // 这是iOS平台下浏览器
} else if (/android/i.test(navigator.userAgent)) {
os = 2;
return os; // 这是Android平台下浏览器
} else if (isWin) {
os = 3;
return os; // 这是Android平台下浏览器
} else if (isMac) {
os = 4;
return os; // 这是mac系统
} else if (/Linux/i.test(navigator.userAgent)) {
os = 5;
return os; // 这是Linux平台下浏览器
} else {
os = 6;
return os;
}
}
/**
* 检测设备信息
* deviceType:PC为1,移动端为2,微信为3
*/
checkDeviceType() {
let deviceType = null;
if (/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {
if (navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1) {
deviceType = '3';
} else {
deviceType = '2';
}
} else {
deviceType = '1';
}
return deviceType;
}
/**
* shareCode生成器
*/
generateShareCode(jsonParams?: any) {
const shareCode = {
shareType: '1',
os: this.checkOs(),
channel: '0',
isOrder: 0,
jsonParams: JSON.stringify(jsonParams)
};
return shareCode;
}
// 设置title
setTitle(title) {
this.titleService.setTitle(title);
}
// 更新meta标签
updateMeta(keywords, description) {
this.metaService.updateTag({ content: keywords }, 'name=keywords');
this.metaService.updateTag({ content: description }, 'name=description');
}
wxShare(title: string, desc: string, link: string, imgUrl: string) {
const shareData = {
title: title, // 分享标题
desc: desc, // 分享描述
link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: imgUrl, // 分享图标
success: () => {
this.shareStatusPublish(0);
}
};
wx.ready(() => { // 需在用户可能点击分享按钮前就先调用
wx.updateAppMessageShareData(shareData);
wx.updateTimelineShareData(shareData);
});
}
// 根据开始时间设置结束时间,天数应减1,当日~当日是一天
setInitDate(dayCount) {
let dt;
let dtEnd;
(dt = new Date()).setDate(dt.getDate() + 1);
(dtEnd = new Date(dt)).setDate(dt.getDate() + dayCount * 1 - 1);
const initDate = {
startDate: Date.parse(dt.toDateString()),
endDate: Date.parse(dtEnd.toDateString())
};
sessionStorage.removeItem('timeRange');
sessionStorage.setItem('initDate', JSON.stringify(initDate));
const date = {
startDate: dt,
endDate: dtEnd
};
return date;
}
// 判断一年是365还是366
yearDayCount(days, disableCalc?: boolean) {
if (days === 365 || days === 366) {
const y = new Date().getFullYear();
const isLeap = (0 === y % 4) && (0 !== y % 100) || (0 === y % 400);
days = isLeap ? 366 : 365;
if (disableCalc) {
days = 365;
}
}
return days;
}
dateFormat(date: any, format?: string) {
return this.datePipe.transform(date, format);
}
delHtmlTag(str) {
return str.replace(/<[^>]+>/g, "");//去掉所有的html标记
}
/**
* 姓名正则
*/
nameValid(name) {
const NAME_REGEXP = /(^[\u4e00-\u9fa5]{1}[\u4e00-\u9fa5\.·()()。]{0,48}[\u4e00-\u9fa5]{1}$)|(^[a-zA-Z]{1}[a-zA-Z\s]{0,48}[a-zA-Z]{1}$)/;
return NAME_REGEXP.test(name);
}
/**
* 手机号码正则
* @param no
* @returns {boolean}
*/
mobileNoValid(no) {
const MOBILE_REGEXP = /^(1)\d{10}$/;
return MOBILE_REGEXP.test(no);
}
getFileName(str) {
let strArr = str.split('?');
let k = strArr[0], appU = k.split('/');
let L = appU[appU.length - 1];
return L;
}
toPercent(point) {
if (point == 0) {
return 0 + '%';
}
let result = String(point * 100);
let idx = result.indexOf(".");
if (idx == -1 || result.substr(idx + 1).length <= 2) {
return result + "%";
}
return result.substr(0, idx + 2) + "%";
}
transform(value: any, args?: any): any {
if ((value + "").trim() == "") {
return "";
}
if (typeof value == 'string') {
value = value.replace(/,/gi, '');
}
if ((value + "").trim() == "") {
return "";
}
if (isNaN(value)) {
return "";
}
value = value + "";
if (/^.*\..*$/.test(value)) {
let pointIndex = value.lastIndexOf(".");
let intPart = value.substring(0, pointIndex);
let pointPart = value.substring(pointIndex + 1, value.length);
intPart = intPart + "";
const re = /(-?\d+)(\d{3})/
while (re.test(intPart)) {
intPart = intPart.replace(re, "$1,$2")
}
value = intPart + "." + pointPart;
} else {
value = value + "";
var re = /(-?\d+)(\d{3})/
while (re.test(value)) {
value = value.replace(re, "$1,$2")
}
}
return value;
}
getDate(str) {
str = String(str)
const newStr = str.substr(0, 4) + '年' + str.substr(4, 2) + '月';
return newStr;
}
}
<div class="">
<div class="weui-mask weui-animate-fade-in"></div>
<div class="weui-picker weui-animate-slide-up">
<div class="weui-picker__hd">
<span>{{title}}</span>
<a href="javascript:;" data-action="cancel" class="weui-picker__action" (click)="cancel()">取消</a>
</div>
<div class="weui-picker__bd">
<div class="weui-picker__content" *ngIf="!provinceId">
<div class="cursor weui-picker__item borderBottom" *ngFor="let provinceList of provinceLists"
(click)="selectProvince(provinceList.provinceId,provinceList.provinceName)">{{provinceList.provinceName}}
</div>
</div>
<div class="weui-picker__content" *ngIf="provinceId && !cityId">
<div class="cursor weui-picker__item borderBottom" *ngFor="let cityList of cityLists"
(click)="selectCity(cityList.cityId,cityList.cityName)">{{cityList.cityName}}
</div>
</div>
<div class="weui-picker__content" *ngIf="provinceId && cityId && !districtId">
<div class="cursor weui-picker__item borderBottom" *ngFor="let districtList of districtLists"
(click)="selectDistrict(districtList.districtId,districtList.districtName)">{{districtList.districtName}}
</div>
</div>
</div>
</div>
</div>
\ No newline at end of file
.weui-mask {
position: fixed;
z-index: 1000;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.6);
}
.weui-animate-fade-in {
-webkit-animation: fadeIn ease .3s forwards;
animation: fadeIn ease .3s forwards;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.weui-picker {
position: fixed;
width: 100%;
max-width: 640px;
left: 0;
right: 0;
bottom: 0;
z-index: 5000;
margin: 0 auto;
background-color: #fff;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transform: translate(0, 100%);
transform: translate(0, 100%);
-webkit-transition: -webkit-transform .3s;
transition: -webkit-transform .3s;
transition: transform .3s;
}
@keyframes slideUp {
from {
transform: translate3d(0, 100%, 0);
}
to {
transform: translate3d(0, 0, 0);
}
}
.weui-animate-slide-up {
animation: slideUp ease .3s forwards;
}
.weui-picker__hd {
display: -webkit-box;
display: -webkit-flex;
display: flex;
padding: 16px;
position: relative;
text-align: center;
font-size: 17px;
line-height: 1.4;
.weui-picker__action {
display: block;
-webkit-box-flex: 1;
-webkit-flex: 1;
flex: 1;
color: #576B95;
}
.weui-picker__action:last-child {
text-align: right;
}
}
.weui-picker__hd:after {
content: " ";
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
color: rgba(0, 0, 0, 0.1);
-webkit-transform-origin: 0 100%;
transform-origin: 0 100%;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
}
.weui-picker__bd {
display: -webkit-box;
display: -webkit-flex;
display: flex;
position: relative;
background-color: #fff;
height: 240px;
overflow: hidden;
.weui-picker__content {
width: 100%;
padding-bottom: 90px;
height: auto;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
.weui-picker__item {
height: 50px;
line-height: 50px;
padding: 0 15px;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { PickerComponent } from './picker.component';
describe('PickerComponent', () => {
let component: PickerComponent;
let fixture: ComponentFixture<PickerComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ PickerComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(PickerComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';
@Component({
selector: 'ydlife-picker',
templateUrl: './picker.component.html',
styleUrls: ['./picker.component.scss']
})
export class PickerComponent implements OnInit {
@Input() provinceLists: Array<any>;
// 地址选择到区还是市 ,省为1,市为2,区为3
@Input() limitStep: number;
@Output() selectedArea = new EventEmitter();
cityLists: Array<any>;
districtLists: Array<any>;
provinceId: any;
districtId: any;
cityId: any;
title: any;
area: any;
isNeedDistrict: boolean = true;
areaLimitStep: number;
isNeedCity: boolean = true;
isNeedProvince: boolean = true;
constructor() {
this.title = '选择省份';
this.area = {
province: { id: null, value: null },
city: { id: null, value: null },
district: { id: null, value: null }
}
}
ngOnInit() {
if (this.isNeedDistrict) {
this.areaLimitStep = 3;
} else if (this.isNeedCity) {
this.areaLimitStep = 2;
} else if (this.isNeedProvince) {
this.areaLimitStep = 1;
} else {
this.areaLimitStep = 3;
}
}
// 选择省份
selectProvince(provinceId, provinceName) {
this.area.province.value = provinceName;
this.area.province.id = this.provinceId = provinceId;
this.cityLists = this.provinceLists.filter(item => item.provinceId === provinceId).pop().citys;
this.title = '选择城市';
if (this.limitStep === 1) {
this.selectedArea.emit(this.area);
return;
}
}
// 选择城市
selectCity(cityId, cityName) {
this.area.city.value = cityName;
this.area.city.id = this.cityId = cityId;
this.title = '选择地区';
if (this.limitStep === 2) {
this.selectedArea.emit(this.area);
return;
}
this.districtLists = this.cityLists.filter(item => item.cityId === cityId).pop().districtItem;
if (!this.districtLists) {
this.selectedArea.emit(this.area);
}
}
// 选择地区
selectDistrict(districtId, districtName) {
this.area.district.value = districtName;
this.area.district.id = this.districtId = districtId;
this.selectedArea.emit(this.area);
}
// 取消
cancel() {
this.selectedArea.emit();
}
}
import { SwitchNumberPipe } from './switch-number.pipe';
describe('SwitchNumberPipe', () => {
it('create an instance', () => {
const pipe = new SwitchNumberPipe();
expect(pipe).toBeTruthy();
});
});
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'switchNumber'
})
export class SwitchNumberPipe implements PipeTransform {
transform(value: any, args?: any): any {
if ((value + "").trim() == "") {
return "";
}
if (typeof value == 'string') {
value = value.replace(/,/gi, '');
}
if ((value + "").trim() == "") {
return "";
}
if (isNaN(value)) {
return "";
}
value = value + "";
if (/^.*\..*$/.test(value)) {
let pointIndex = value.lastIndexOf(".");
let intPart = value.substring(0, pointIndex);
let pointPart = value.substring(pointIndex + 1, value.length);
intPart = intPart + "";
const re = /(-?\d+)(\d{3})/
while (re.test(intPart)) {
intPart = intPart.replace(re, "$1,$2")
}
value = intPart + "." + pointPart;
} else {
value = value + "";
var re = /(-?\d+)(\d{3})/
while (re.test(value)) {
value = value.replace(re, "$1,$2")
}
}
return value;
}
}
import { SafeHtmlPipe } from './safe-html.pipe';
describe('SafeHtmlPipe', () => {
it('create an instance', () => {
const pipe = new SafeHtmlPipe();
expect(pipe).toBeTruthy();
});
});
import { Pipe, PipeTransform } from '@angular/core';
import {DomSanitizer} from "@angular/platform-browser";
@Pipe({
name: 'safeHtml'
})
export class SafeHtmlPipe implements PipeTransform {
constructor(private sanitized: DomSanitizer) {
}
transform(value: any, args?: any): any {
return this.sanitized.bypassSecurityTrustHtml(value);
}
}
import {
trigger, // 动画封装触发,外部的触发器
state, // 转场状态控制
style, // 用来书写基本的样式
transition, // 用来实现css3的 transition
animate, // 用来实现css3的animations
keyframes // 用来实现css3 keyframes的
} from '@angular/animations';
export const fadeIn = trigger('fadeIn', [
state('in', style({ display: 'none' })), // 默认元素不展开
state('out', style({ display: 'block' })),
// transition('in => out', animate('.5s .2s ease-out')),
// transition('out => in', animate('.5s .2s ease-in')),
// transition('in <=> out', animate('.5s .2s ease-in'))
transition('in => out', [ // 进场动画
animate(300, keyframes([
style({ height: '0', opacity: 0, offset: 0 }), // 元素高度0,元素隐藏(透明度为0),动画帧在0%
style({ height: '*', opacity: 1, offset: 1 }) // 200ms后高度自适应展开,元素展开(透明度为1),动画帧在100%
]))
]),
transition('out=> in', [
animate(300, keyframes([
style({ height: '*', opacity: 1, offset: 0 }), // 与之对应,让元素从显示到隐藏一个过渡
style({ height: '0', opacity: 0, offset: 1 })
]))
])
]);
<div id="toast" *ngIf="toastHidden">
<div class="weui-mask_transparent"></div>
<div class="weui-toast">
<!--<i class="weui-icon_toast icon icon-checkmark-rounded" [ngClass]="{'icon-additional':toastInfo.status===0}"></i>-->
<p class="weui-toast__content" [ngStyle]="{'text-align':toastInfo.align}">{{toastInfo.msg}}</p>
</div>
</div>
\ No newline at end of file
.weui-mask_transparent {
position: fixed;
z-index: 1000;
top: 0;
right: 0;
left: 0;
bottom: 0;
}
.weui-toast {
position: fixed;
z-index: 5000;
width: 16.8em;
height: 60px;
padding: 0 0.7em;
left: 50%;
background: rgba(17, 17, 17, 0.7);
text-align: justify;
border-radius: 5px;
color: #FFFFFF;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.weui-toast__content {
width: 100%;
word-break: break-all;
text-align: justify;
}
.weui-icon_toast {
margin: 22px 0 0;
display: block;
}
.icon-checkmark-rounded:before {
color: #fff;
font-size: 34px;
display: block;
margin-bottom: 10px;
}
.icon-additional:before {
transform: rotate(38deg);
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ToastComponent } from './toast.component';
describe('ToastComponent', () => {
let component: ToastComponent;
let fixture: ComponentFixture<ToastComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ToastComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ToastComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, Input, OnChanges } from '@angular/core';
import { Router } from "@angular/router";
@Component({
selector: 'ydlife-toast',
templateUrl: './toast.component.html',
styleUrls: ['./toast.component.scss']
})
export class ToastComponent implements OnInit {
@Input() toastInfo: any;
@Input() routerLink: any;
toastHidden: boolean;
constructor(private router: Router) {
// autoHidden 是否自动消失
this.toastInfo = {
status: 1,
msg: '已完成',
timeout: 3000,
autoHidden: 1,
align: 'justify'
};
this.toastHidden = true;
}
ngOnInit() {
if (this.toastInfo.autoHidden == 0) {
if (this.routerLink) {
this.toastHidden = false;
this.router.navigate(['/' + this.routerLink]);
}
} else {
setTimeout(() => {
this.toastHidden = false;
if (this.routerLink) {
this.router.navigate(['/' + this.routerLink]);
}
}, this.toastInfo.timeout)
}
}
ngOnChanges() {
this.toastHidden = true;
setTimeout(() => {
this.toastHidden = false;
if (this.routerLink) {
this.router.navigate(['/' + this.routerLink]);
}
}, this.toastInfo.timeout)
}
}
export class BusinessQuery {
constructor(public opportunityId?: any,
public age?: string,
public name?: string,
public gender?: any,
public mobileNo?: string,
public weChat?: string,
public otherContacts?: string,
public sourceChannel?: string,
public address?: string,
public opportunityDate?: string,
public opportunityCustomerTags?: any,
public zodiacTypeId?: any,
public zodiacType?: any,
public bloodTypeId?: any,
public bloodType?: any,
public fyp?: any,
public fyc?: any,
public pieces?: any,
public remark?: any,
public assignedPractitionerId?: any,
public sourceFrom?: any,
public timeToClose?: any,
public leadsAssignedId?: any,
public expertType?: any,
public expertPractitionerId?: any,
public expertPractitionerName?: any
) {
}
}
export class LocalStorage {
public localStorage: any;
constructor() {
if (!localStorage) {
throw new Error('Current browser does not support Local Storage');
}
this.localStorage = localStorage;
}
public set(key: string, value: string): void {
this.localStorage[key] = value;
}
public get(key: string): string {
return this.localStorage[key] || false;
}
public setObject(key: string, value: any): void {
this.localStorage[key] = JSON.stringify(value);
}
public getObject(key: string): any {
return JSON.parse(this.localStorage[key] || '{}');
}
public remove(key: Array<string>): any {
let m = 0;
let status = false;
key.map(i => {
this.localStorage.removeItem(i);
m++;
status = m === key.length;
});
return status;
}
}
// export const LOCAL_STORAGE_PROVIDERS:any[] = [
// Provider(LocalStorage, {useClass: LocalStorage})
// ];
export class NameAge {
id?: number;
name?: string;
age?: number;
birthDay?: string;
gender?: string;
}
export class Plans {
planName?: string;
productName?: string;
companyName?: string;
companyDesc?: string;
labels?: Array<any>;
price?: number;
planId?: number;
companyLogoPath?: string;
iconPath?: string;
customerServicePhone?: string;
type?: number;
minDay?: number;
maxDay?: number;
minAge?: number;
maxAge?: number;
defaultBirth?: string;
isSocialInsured?: string;
adultCount?: number;
childCount?: number;
eldCount?: number;
dayCount?: number;
insurerId?: string;
planCategoryId?: number;
planPara?: any;
holderPara?: any;
insuredPara?: any;
quotePara?: any;
subjectPara?: any;
vehiclePara?: any;
feedbackCount?: any;
productCategoryId?: any;
productId?: any;
noPlanProduct?: boolean;
needIdCard?: string;
isActiveForProduct?: number;
isActiveForPlan?: number;
}
export class RecruitingQuery {
constructor(
public name?: string,
public gender?: any,
public age?: string,
public mobileNo?: string,
public wechatId?: string,
public qqId?: string,
public othersContacts?: string,
public educationLevel?: string,
public resourceDropMasterId?: string,
public remark?: string,
public ossPathResume?: string,
public operateUserId?: string,
public potentialId?: any,
public practitionerId?: any,
public createdAt?: any,
public timeToOnboarding?: any
) {
}
}
\ No newline at end of file
export class SettingInfo {
constructor(
public bioIntro?: any,
public headImgUrl?: any,
public lifeImgUrls?: any,
public practitionerId?: any,
public wxQRImgUrl?: any,
public isMobileShow?: any,
public isNameShow?: any
) {
}
}
export class User {
constructor(public dayCount?: any,
public adultCount?: any,
public childCount?: any,
public eldCount?: any,
public level?: any,
public destinationType?: any,
public destinationId?: any,
public destinationName?: any,
public levelCodeForBuilding?: any,
public productId?: any,
public planId?: any) {
}
}
export class WxConfig {
appId: string;
timestamp: string;
nonceStr: string;
signature: string;
jsApiList: any;
}
import { Injectable } from '@angular/core';
import {
HttpEvent, HttpInterceptor, HttpHandler, HttpRequest
} from '@angular/common/http';
import { Observable } from "rxjs/index";
import { tap } from "rxjs/internal/operators";
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authReq = req.clone({
headers: req.headers.set('X-Authorization', localStorage.getItem('lifeToken') ? localStorage.getItem('lifeToken') : ''),
setHeaders: { 'Content-Type': 'application/json' }
});
return next.handle(authReq)
.pipe(
tap(
event => { },
error => {
if (error.status === 401) {
let { search, href } = window.location;
href = href.replace(/&?t_reload=(\d+)/g, '');
window.location.href = href + (search ? '&' : '?') + 't_reload=' + new Date().getTime();
}
}
)
);
}
}
/* "Barrel" of Http Interceptors */
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { AuthInterceptor } from './auth-interceptor';
import { TrimNameInterceptor } from './trim-name-interceptor';
/** Http interceptor providers in outside-in order */
export const httpInterceptorProviders = [
{ provide: HTTP_INTERCEPTORS, useClass: TrimNameInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }
];
/**
* Created by Sweet on 2019/12/5.
*/
import { Injectable } from '@angular/core';
import {
HttpEvent, HttpInterceptor, HttpHandler, HttpRequest
} from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class TrimNameInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const body = req.body;
if (!body || !body.name ) {
return next.handle(req);
}
// copy the body and trim whitespace from the name property
const newBody = { ...body, name: body.name.trim() };
// clone request and set its body
const newReq = req.clone({ body: newBody });
// send the cloned request to the next handler.
return next.handle(newReq);
}
}
<div class="wrapper">
<div class="headWrapper">
<div class="title">
{{titleDeatil}}
</div>
<div class="announcement_at_top">
上海银盾保险经纪有限公司&nbsp;&nbsp;
{{announcementLists?.announcementAt}}
</div>
</div>
<div class="announcementItem">
<div class="announcement_title"><span
class="announcement_type">【{{announcementLists?.announcementTypeName}}】</span><span
[innerHtml]="announcementLists?.title |safeHtml"></span></div>
<div [innerHtml]="announcementLists?.content | safeHtml" class="announcement_content"></div>
<!-- <div class="announcement_at">上海银盾保险经纪有限公司 &nbsp;&nbsp;{{announcementLists?.announcementAt}}</div> -->
</div>
</div>
\ No newline at end of file
.wrapper{
padding: 10px 8px;
.headWrapper{
.title{
text-align: center;
font-size: 24px;
}
.announcement_at_top{
color: #8d9599;
}
}
.announcementItem {
padding: 10px 0;
.announcement_type {
color: #ff3500;
}
.announcement_at {
display: flex;
justify-content: flex-end;
margin-top: 20px;
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AnnouncementDetailComponent } from './announcement-detail.component';
describe('AnnouncementDetailComponent', () => {
let component: AnnouncementDetailComponent;
let fixture: ComponentFixture<AnnouncementDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AnnouncementDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AnnouncementDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from "../my.service";
import { ActivatedRoute } from '@angular/router';
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-announcement-detail',
templateUrl: './announcement-detail.component.html',
styleUrls: ['./announcement-detail.component.scss']
})
export class AnnouncementDetailComponent implements OnInit {
announcementId: string;
announcementLists: Array<any>;
titleDeatil: string;
constructor(private activateRoute: ActivatedRoute,
private myService: MyService,
public lifeCommonService: LifeCommonService) { }
ngOnInit() {
this.announcementId = this.activateRoute.snapshot.paramMap.get('id');
this.announcementQuery(this.announcementId, null)
}
announcementQuery(id, announcementType) {
this.myService.announcementQuery(id, announcementType).subscribe(res => {
if (res['success']) {
this.announcementLists = res['data']['announcementInfoList'][0];
this.titleDeatil = this.lifeCommonService.delHtmlTag(this.announcementLists['title'])
}
});
}
}
<div class="businessCardContainer">
<div class="brokerCardPositive">
<div class="qrcodeBox">
<div>
<div style="margin-bottom: 20%;"><img src="assets/images/ydShield.png" alt="银盾保险经纪" class="img-responsive">
</div>
<div><img src="assets/images/ydCompanyName.png" alt="银盾保险经纪" class="img-responsive"></div>
</div>
<div><img src="assets/images/online_chat.jpg" alt="" class="img-responsive"></div>
</div>
<div class="dividingContainer">
<div class="dividingBox"></div>
<div class="dividingLine"></div>
</div>
<div class="brokerInfo">
<div class="brokerBasicInfo">
<div class="brokerName">
<div>{{lifeCustomerInfo.practitionerBasicInfo.name}}</div>
<div>Neo Zheng</div>
</div>
<div class="brokerTitle">
<div>{{lifeCustomerInfo.practitionerBasicInfo.levelName}}</div>
<div>Sales Director</div>
</div>
</div>
<div class="brokerCompanyInfo">
<div style="font-size: 14px">上海银盾保险经纪有限公司</div>
<div style="font-size:10px;font-weight: lighter;">上海市浦东新区张杨路560号中融恒瑞国际西楼1502室</div>
<div style="font-size: 11px">客服专线:400-921-9290</div>
</div>
<div class="brokerContactInfo">
<div>
<i class="iconfont icon-dianhua"></i>
<span>M: {{lifeCustomerInfo.mobileNo}}</span>
</div>
<div>
<i class="iconfont icon-youxiang"></i>
<span>50262253@qq.com</span>
</div>
</div>
</div>
</div>
<div class="brokerCardOpposite">
<img src="assets/images/card_opposite.jpg" alt="" class="img-responsive">
</div>
</div>
.businessCardContainer {
display: flex;
flex-direction: column;
.brokerCardPositive {
display: flex;
padding-top: 7%;
padding-left: 5%;
margin-bottom: 10%;
.qrcodeBox {
width: 15%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.dividingContainer {
padding-top: 45px;
margin-right: 11px;
margin-left: 5%;
.dividingBox {
width: 10px;
height: 10px;
background-color: #ee262e;
}
.dividingLine {
width: 1px;
background-color: #b9b9ba;
height: 100%;
}
}
.brokerInfo {
flex: 1;
.brokerBasicInfo {
display: flex;
align-items: flex-end;
justify-content: space-between;
padding-right: 5%;
margin-bottom: 10%;
color: #231f20;
.brokerName {
div:first-child {
font-size: 24px;
letter-spacing: 5px;
font-weight: bold;
line-height: 1.1;
}
div:last-child {
font-size: 12px;
}
}
.brokerTitle {
div:first-child {
font-size: 13px;
}
div:last-child {
font-size: 12px;
}
}
}
.brokerCompanyInfo {
margin-bottom: 3%;
}
.brokerContactInfo {
line-height: 1.1;
.iconfont {
margin-right: 5px;
color: #ee262e;
}
}
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { BusinessCardComponent } from './business-card.component';
describe('BusinessCardComponent', () => {
let component: BusinessCardComponent;
let fixture: ComponentFixture<BusinessCardComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ BusinessCardComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(BusinessCardComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnInit} from '@angular/core';
@Component({
selector: 'ydlife-business-card',
templateUrl: './business-card.component.html',
styleUrls: ['./business-card.component.scss']
})
export class BusinessCardComponent implements OnInit {
lifeCustomerInfo: any;
constructor() {
}
ngOnInit() {
this.lifeCustomerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo'));
}
}
<div class="fileUploadLists">
<div class="nav">
<ul class="left">
<li *ngFor="let categoryItem of categoryList" (click)="switchCategory(categoryItem.id)"
[ngClass]="{'actived':selectedCategoryId===categoryItem.id}">
{{categoryItem.dropOptionName}}
</li>
</ul>
</div>
<div class="contentList">
<ul>
<li *ngFor="let fileUploadItem of fileUploadItemList">
<a href="{{fileUploadItem.filePath}}" download="{{fileUploadItem.itemName}}" target="_blank">
<div><i class="iconfont icon-pdf"></i></div>
<div title="{{fileUploadItem.itemName}}">{{fileUploadItem.itemName}}</div>
<div style="position: absolute;right: 5px;top: 6px;"><i class="iconfont icon-xiazai"></i></div>
</a>
</li>
</ul>
</div>
</div>
\ No newline at end of file
.fileUploadLists {
height: 100%;
ul {
list-style: none;
}
.nav{
overflow: hidden;
width: 100%;
overflow-x: auto;
.left{
padding: 10px 2px;
// background: #f0f0f0;
margin-bottom: 10px;
float: left;
width: 120%;
overflow: hidden;
overflow-x: auto;
list-style: none;
li{
border: 1px #a9aabb solid;
text-align: center;
font-size: 14px;
height: 30px;
line-height: 30px;
border-radius: 20px;
margin: 0px 2px;
float: left;
width: 15.6%;
}
li.actived{
// background-color: #ff5a32;
// color: #fff;
// border: 1px #f0f0f0 solid;
border: 1px #e10d0d solid;
}
}
}
.nav::-webkit-scrollbar{
opacity: 0;
}
.contentList{
background-color: #fff;
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
height: auto;
overflow-x: hidden;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
ul li{
border-bottom: 1px solid #dcdcdc;
padding: 4px 20px;
position: relative;
.icon-xiazai {
font-size: 22px;
color: #ec2d37;
font-weight: bold;
}
a {
display: flex;
align-items: center;
color: #000;
.iconfont {
color: #ec2d37;
font-size: 22px;
margin-right: 8px;
}
}
}
ul li:last-child {
border: none;
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FileUploadComponent } from './file-upload.component';
describe('FileUploadComponent', () => {
let component: FileUploadComponent;
let fixture: ComponentFixture<FileUploadComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ FileUploadComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(FileUploadComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { LifeCommonService } from "../../common/life-common.service";
import { MyService } from "../my.service";
import { ActivatedRoute } from "@angular/router";
@Component({
selector: 'ydlife-file-upload',
templateUrl: './file-upload.component.html',
styleUrls: ['./file-upload.component.scss']
})
export class FileUploadComponent implements OnInit {
fileUploadItemList: Array<any>;
// 判断是文件下载还是教育培训
type: string;
categoryList: Array<any>;
selectedCategoryId: number;
constructor(private myService: MyService, private activatedRoute: ActivatedRoute) {
}
ngOnInit() {
this.type = this.activatedRoute.snapshot.data[0]['type'];
this.dropOptionsQuery();
if (this.type === 'fileUpload') {
this.fileUpload(3, 0, 19, 'yd_download_file_type', this.selectedCategoryId);
} else if (this.type === 'training') {
this.fileUpload(3, 0, 23, 'yd_trainning_file_type', this.selectedCategoryId);
}
}
// 文件下载
fileUpload(itemType, itemId, fileCategory, code, mdDropOptionId) {
this.myService.filePath(itemType, itemId, fileCategory, code, mdDropOptionId).subscribe(res => {
if (res['success']) {
this.fileUploadItemList = res['data']['fileUploadItemList'];
}
});
}
//培训资料分类
dropOptionsQuery() {
const code = this.type === 'fileUpload' ? 'yd_download_file_type' : 'yd_trainning_file_type'
this.myService.dropOptionsQuery({ code: code }).subscribe(res => {
if (res['success']) {
this.categoryList = res['data']['dropMasterInfoList'][0]['dropOptionsInfoList'];
if (this.categoryList.length > 0) {
this.selectedCategoryId = this.categoryList[0].id;
this.switchCategory(this.selectedCategoryId)
}
} else {
this.categoryList = [];
}
})
}
switchCategory(e) {
this.selectedCategoryId = e;
if (this.type === 'fileUpload') {
this.fileUpload(3, 0, 19, 'yd_download_file_type', this.selectedCategoryId);
} else if (this.type === 'training') {
this.fileUpload(3, 0, 23, 'yd_trainning_file_type', this.selectedCategoryId);
}
}
}
<div class="nav">
<ul class="left">
<li *ngFor="let categoryItem of importantAnnouncementLists" (click)="switchCategory(categoryItem.id)"
[ngClass]="{'actived':selectedCategoryId===categoryItem.id}">
{{categoryItem.dropOptionName}}
</li>
</ul>
</div>
<div #hide class="materialContainer">
<div class="materialItem" *ngFor="let announcementInfo of announcementLists;index as i"
[routerLink]="['/importantAnnouncement',announcementInfo.id]">
<!-- <div class="title" [innerHtml]="announcementInfo.title"></div> -->
<div class="title">{{this.lifeCommonService.delHtmlTag(announcementInfo.title)}}</div>
<div class="date">
<span> 上海银盾保险经纪有限公司</span>
<span>{{announcementInfo.createdAt}}</span>
</div>
</div>
</div>
\ No newline at end of file
.nav{
overflow: hidden;
width: 100%;
overflow-x: auto;
.left{
padding: 10px 2px;
// background: #f0f0f0;
margin-bottom: 10px;
float: left;
width: 120%;
overflow: hidden;
overflow-x: auto;
list-style: none;
li{
border: 1px #a9aabb solid;
text-align: center;
font-size: 14px;
height: 30px;
line-height: 30px;
border-radius: 20px;
margin: 0px 2px;
float: left;
width: 15.7%;
}
li.actived{
// background-color: #ff5a32;
// color: #fff;
// border: 1px #f0f0f0 solid;
border: 1px #e10d0d solid;
}
}
}
.nav::-webkit-scrollbar{
opacity: 0;
}
.materialContainer{
.materialItem{
padding: 5px 10px;
border-bottom: 1px #ddd solid;
margin-bottom: 8px;
.title{
margin-bottom: 8px;
}
.date{
color: #737272;
font-size: 14px;
display: flex;
justify-content: space-between;
}
}
.materialItem:last-child{
border-bottom: none;
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ImportantAnnouncementComponent } from './important-announcement.component';
describe('ImportantAnnouncementComponent', () => {
let component: ImportantAnnouncementComponent;
let fixture: ComponentFixture<ImportantAnnouncementComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ImportantAnnouncementComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ImportantAnnouncementComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import { MyService } from "../my.service";
import { Router } from "@angular/router";
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-important-announcement',
templateUrl: './important-announcement.component.html',
styleUrls: ['./important-announcement.component.scss']
})
export class ImportantAnnouncementComponent implements OnInit, AfterViewInit {
@ViewChild('hide') hide: ElementRef
announcementLists: Array<any>;
importantAnnouncementLists: Array<any>;
selectedCategoryId: any;
titleList: Array<any> = [];
constructor(
private myService: MyService,
private router: Router,
public lifeCommonService: LifeCommonService) {
}
ngOnInit() {
this.dropOptionsQuery();
}
ngAfterViewInit() {
setTimeout(() => {
this.switchCategory(this.selectedCategoryId)
}, 500);
}
// 获取所有的公告类型
dropOptionsQuery() {
this.myService.dropOptionsQuery({ code: 'yd_mkt_announcement_type' }).subscribe(res => {
if (res['success']) {
this.importantAnnouncementLists = res['data']['dropMasterInfoList'][0]['dropOptionsInfoList'];
if (this.importantAnnouncementLists.length > 0) {
this.selectedCategoryId = res['data']['dropMasterInfoList'][0]['dropOptionsInfoList'][0]['id'];
this.announcementQuery(null, this.selectedCategoryId);
}
}
})
}
announcementQuery(id, announcementType) {
this.myService.announcementQuery(id, announcementType).subscribe(res => {
if (res['success']) {
this.announcementLists = res['data']['announcementInfoList'];
}
});
}
switchCategory(e) {
this.selectedCategoryId = e;
this.announcementQuery(null, this.selectedCategoryId);
}
}
<!-- 这个元素用来承载生成的二维码 不显示 style="display: none" -->
<div id="qrcode" style="display: none"></div>
<!-- 点击这个按钮之后下载图片 -->
<!--<button id="download"> 下载图片</button>-->
<!-- canvas 标签 主要用来进行图形的绘制-->
<canvas id="canvas" #canvas></canvas>
<!--生成图片-->
<img src="" alt="" id="bannerImg" class="img-responsive">
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MkMaterialDetailComponent } from './mk-material-detail.component';
describe('MkMaterialDetailComponent', () => {
let component: MkMaterialDetailComponent;
let fixture: ComponentFixture<MkMaterialDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MkMaterialDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MkMaterialDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { environment } from '../../../environments/environment';
import { LifeCommonService } from '../../common/life-common.service';
import { MyService } from '../my.service';
declare var QRCode: any;
import * as uuid from 'uuid';
@Component({
selector: 'ydlife-mk-material-detail',
templateUrl: './mk-material-detail.component.html',
styleUrls: ['./mk-material-detail.component.scss']
})
export class MkMaterialDetailComponent implements OnInit {
@ViewChild('canvas') canvas: ElementRef<any>;
materialItemId: string;
// 1是指itemId 是productID 2是指planid
materialItemType: string;
// 海报图
productPosterPath: string;
lifeCustomerInfo: any;
shareInfo: any;
// 自定义内容部分高度
contentHeight: number = 90;
// 二维码宽度
qrcodeWidth: number = 70;
qrcodeBgWidth: number = 80;
qrcodePadding = 5;
rightWidth = 5;
bottomHeight = 5;
posterType: number;
isMobileShow: number;
isNameShow: number;
constructor(private activateRoute: ActivatedRoute,
private lifeCommonService: LifeCommonService,
private myService: MyService) {
}
ngOnInit() {
this.materialItemId = this.activateRoute.snapshot.paramMap.get('itemId');
this.materialItemType = this.activateRoute.snapshot.queryParams['itemType'];
this.lifeCustomerInfo = localStorage.getItem('lifeCustomerInfo') ? JSON.parse(localStorage.getItem('lifeCustomerInfo')) : null;
this.posterType = this.activateRoute.snapshot.queryParams['posterType'];
this.posterQuery(this.posterType, this.materialItemType);
}
async canvasPic() {
const qrcodeUrl = await this.qrcode() + '';
const canvas = this.canvas.nativeElement as HTMLCanvasElement;
const ctx = canvas.getContext('2d');
const ratio = this.getPixelRatio(ctx);
const W = document.body.clientWidth;
// const H = document.body.clientHeight;
const H = W * (734 / 413);
canvas.width = W * ratio;
canvas.height = H * ratio;
canvas.style.width = W + 'px';
canvas.style.height = H + 'px';
const img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
// 画圆形头像
const avatarurlWidth = 50 * ratio; // 绘制的头像宽度
const avatarurlHeigth = 50 * ratio; // 绘制的头像高度
const avatarurlX = 20 * ratio; // 绘制的头像在画布上的位置
const avatarurlY = this.canvas.nativeElement.height - (this.contentHeight + 50) / 2 * ratio; // 绘制的头像在画布上的位置
const avatarImg = new Image();
avatarImg.setAttribute('crossOrigin', 'anonymous');
if (this.lifeCustomerInfo.practitionerBasicInfo.headImagePath) {
avatarImg.src = this.lifeCustomerInfo.practitionerBasicInfo.headImagePath + '?v=' + new Date().getTime();
} else {
avatarImg.src = `${environment.DOMAINNAME}/assets/img/meng.png?v=${new Date().getTime()}`;
}
// 这里的第一张图片就是可以是你们的海报 这里注意绘制的顺序 我们要手动控制
img.src = this.productPosterPath;
img.onload = () => {
// 加载海报图
// ctx.drawImage(img, 0, 0, this.canvas.nativeElement.width, this.canvas.nativeElement.width * (734 / 413));
ctx.drawImage(img, 0, 0, this.canvas.nativeElement.width, this.canvas.nativeElement.height);
ctx.save();
ctx.fillStyle = 'rgba(0,0,0,0.15)';
ctx.fillRect(0, this.canvas.nativeElement.height - this.contentHeight * ratio, this.canvas.nativeElement.width * ratio, this.contentHeight * ratio);
ctx.beginPath(); // 开始绘制
// 先画个圆 前两个参数确定了圆心 (x,y) 坐标 第三个参数是圆的半径 四参数是绘图方向 默认是false,即顺时针
ctx.arc(avatarurlWidth / 2 + avatarurlX, avatarurlHeigth / 2 + avatarurlY, avatarurlWidth / 2, 0, Math.PI * 2, false);
ctx.clip(); // 画好了圆 剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内 这也是我们要save上下文的原因
ctx.drawImage(avatarImg, avatarurlX, avatarurlY, avatarurlWidth, avatarurlHeigth); // 推进去图片,必须是https图片
ctx.restore(); // 恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 还可以继续绘制
ctx.save();
// 这里的image只能在onload里面绘制 在外面就会被覆盖了 因为优先加载完毕就会优先绘制 然后就被之后绘制的海报背景遮挡了
const shareQr = new Image();
// 设置base64编码格式值
if (this.materialItemType == '5') {
shareQr.src = `assets/images/online.jpg`;
} else {
shareQr.src = qrcodeUrl;
}
shareQr.onload = () => {
//二维码位置
const qrcodeBgX = document.body.clientWidth - (this.rightWidth + this.qrcodeBgWidth + 20);
const qrcodeBgY = H - (this.bottomHeight + this.qrcodeBgWidth);
//二维码底边padding
const qrcodeX = qrcodeBgX + this.qrcodePadding;
const qrcodeY = qrcodeBgY + this.qrcodePadding;
ctx.fillStyle = '#fff';
ctx.fillRect(qrcodeBgX, qrcodeBgY, this.qrcodeBgWidth, this.qrcodeBgWidth);
ctx.save();
// // 绘制图像 就是绘制二维码到我们自己写的canvas中去
ctx.drawImage(shareQr, qrcodeX, qrcodeY, this.qrcodeWidth, this.qrcodeWidth);
document.querySelector('#bannerImg').setAttribute('src', canvas.toDataURL('image/png', 1));
this.canvas.nativeElement.style.display = 'none';
};
// 绘制字体
ctx.fillStyle = '#fff';
ctx.font = `${12 * ratio}px 微软雅黑`;
if (this.isNameShow == 1) {
ctx.fillText(`${this.lifeCustomerInfo.practitionerBasicInfo.name}`, 75 * ratio, avatarurlY + 15 * ratio); // Y指的是文字底部的位置
}
ctx.fillText(`银盾保险经纪`, 75 * ratio, avatarurlY + 30 * ratio); // Y指的是文字底部的位置
if (this.isMobileShow == 1) {
ctx.fillText(`${this.lifeCustomerInfo.mobileNo}`, 75 * ratio, avatarurlY + 45 * ratio);
}
ctx.scale(ratio, ratio);
};
}
// 获取像素比
getPixelRatio(context) {
const backingStore = context.backingStorePixelRatio ||
context.webkitBackingStorePixelRatio ||
context.mozBackingStorePixelRatio ||
context.msBackingStorePixelRatio ||
context.oBackingStorePixelRatio ||
context.backingStorePixelRatio || 1;
return (window.devicePixelRatio || 1) / backingStore;
}
shareCallBack() {
this.myService.shareCallBack(this.shareInfo).subscribe(res => {
if (res['success']) {
setTimeout(() => {
this.canvasPic();
}, 500);
} else {
}
});
}
download() {
const a = document.createElement('a');
// 设置地址
const canvas = document.querySelector('#qrcode canvas') as HTMLCanvasElement;
a.href = canvas.toDataURL('image/png', 1);
// 设置下载名称
a.download = '银盾保险经纪';
// 触发点击事件
a.click();
}
qrcode() {
return new Promise((resolve, reject) => {
const qr = document.querySelector('#qrcode');
// 对二维码进行初始化
const qrCode = new QRCode(qr, {
// 二维码内容
text: `${this.shareInfo.url}`,
// 二维码宽度
width: 100,
// 二维码高度
height: 100,
// 二维码前景色
colorDark: '#000',
// 二维码背景色
colorLight: '#fff',
/*!
容错级别,可设置为:
QRCode.CorrectLevel.L
QRCode.CorrectLevel.M
QRCode.CorrectLevel.Q
QRCode.CorrectLevel.H
*/
correctLevel: QRCode.CorrectLevel.H,
// 二维码中心图片
iconSrc: `./assets/images/icons/yd.jpg`,
// 二维码中心图片边框弧度
iconRadius: 6,
// 二维码中心图片边框宽度
iconBorderWidth: 5,
// 二维码中心图片边框颜色
iconBorderColor: '#fff',
});
// 我们的qrcode生成二维码之后也会有一个canvas对象我们获取到这个元素
// 这里的image只能在onload里面绘制 在外面就会被覆盖了 因为优先加载完毕就会优先绘制 然后就被之后绘制的海报背景遮挡了
setTimeout(() => {
const newCanvas = document.querySelector('#qrcode canvas') as HTMLCanvasElement;
const qrcodeUrl = newCanvas.toDataURL('image/png', 1);
resolve(qrcodeUrl);
}, 100)
});
}
// 获取大图
posterQuery(itemId, itemType) {
this.myService.posterQuery({
id: this.posterType,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
paginationInfo: {
noLimitFlag: 'CONFIRM'
}
}).subscribe(res => {
if (res['success']) {
this.isMobileShow = res['data']['isMobileShow'];
this.isNameShow = res['data']['isNameShow'];
const posterInfos = res['data']['posterInfos'];
const posterInfo = posterInfos.filter(item => item.id == itemId && item.itemType == itemType).pop();
this.productPosterPath = posterInfo.productPosterPath + '?v=' + new Date().getTime();
// 分享信息
const shareCodeUuid = uuid.v4();
this.shareInfo = {
...this.lifeCommonService.generateShareCode(),
shareCode: shareCodeUuid,
customerId: this.lifeCustomerInfo.customerId,
productId: this.materialItemId,
url: `${environment.DOMAINNAME}/life/${this.materialItemId}?shareCode=${shareCodeUuid}`
};
if (itemType == '2') {
this.shareInfo.productId = null;
this.shareInfo.planId = this.materialItemId;
}
// 0是有plan,1是无plan
if (posterInfo.isPlan == '0') {
if (posterInfo.productCategoryId == '2') {
this.shareInfo.url = `${environment.DOMAINNAME}/hProductDetail/${this.materialItemId}?shareCode=${shareCodeUuid}&type=7`;
} else if (posterInfo.productCategoryId == '5') {
this.shareInfo.url = `${environment.DOMAINNAME}/hProductDetail/${this.materialItemId}?shareCode=${shareCodeUuid}&type=9`;
}
}
// 发送请求保存分享码
this.shareCallBack();
}
});
}
}
<div class='nav'>
<ul class="left">
<ng-container>
<li *ngFor="let categoryItem of categoryList" (click)="switchCategory(categoryItem.id)"
[ngClass]="{'actived':selectedCategoryId===categoryItem.id}">
{{categoryItem.dropOptionName}}
</li>
</ng-container>
</ul>
</div>
<div class="materialContainer">
<div class="materialItem" *ngFor="let posterInfo of posterInfos;index as i"
[routerLink]="['/material',posterInfo.itemId]"
[queryParams]="{itemType:posterInfo.itemType,posterType:posterInfo.id}">
<div>
<img src="{{posterInfo.productPosterPath}}" alt="" class="img-responsive">
</div>
<div class="title">{{posterInfo.title}}</div>
</div>
</div>
\ No newline at end of file
.nav{
overflow: hidden;
width: 100%;
overflow-x: auto;
.left{
padding: 10px 2px;
// background: #f0f0f0;
margin-bottom: 10px;
float: left;
width: 120%;
overflow: hidden;
overflow-x: auto;
list-style: none;
li{
border: 1px #a9aabb solid;
text-align: center;
font-size: 14px;
height: 30px;
line-height: 30px;
border-radius: 20px;
margin: 0px 2px;
float: left;
width: 15.6%;
}
li.actived{
// background-color: #ff5a32;
// color: #fff;
// border: 1px #f0f0f0 solid;
border: 1px #e10d0d solid;
}
}
}
.nav::-webkit-scrollbar{
opacity: 0;
}
.materialContainer {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
grid-row-gap: 10px;
grid-column-gap: 10px;
.materialItem {
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
align-items: center;
background-color: #f7f7f7;
padding: 14px;
box-sizing: border-box;
.title {
font-size: 12px;
line-height: 1.1;
margin-top: 5px;
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MkMaterialComponent } from './mk-material.component';
describe('MkMaterialComponent', () => {
let component: MkMaterialComponent;
let fixture: ComponentFixture<MkMaterialComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MkMaterialComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MkMaterialComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { Router } from "@angular/router";
import { MyService } from "../my.service";
import { ActivatedRoute } from "@angular/router";
@Component({
selector: 'ydlife-mk-material',
templateUrl: './mk-material.component.html',
styleUrls: ['./mk-material.component.scss']
})
export class MkMaterialComponent implements OnInit {
posterInfos: Array<any>;
categoryList: Array<any>;
selectedCategoryId: number;
recruit: any;
constructor(private activatedRoute: ActivatedRoute, private router: Router, private myService: MyService) {
}
ngOnInit() {
this.recruit = this.activatedRoute.snapshot.queryParams.recruit ? this.activatedRoute.snapshot.queryParams.recruit : null;
this.dropOptionsQuery();
}
posterQuery() {
const param = {
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
mdDropOptionId: this.selectedCategoryId,
paginationInfo: { noLimitFlag: 'CONFIRM' }
}
this.myService.posterQuery(param).subscribe(res => {
if (res['success']) {
this.posterInfos = res['data']['posterInfos'];
}
});
}
//海报分类
dropOptionsQuery() {
this.myService.dropOptionsQuery({ code: 'yd_productbill_file_type' }).subscribe(res => {
if (res['success']) {
this.categoryList = res['data']['dropMasterInfoList'][0]['dropOptionsInfoList'];
if (this.categoryList.length > 0) {
if (this.recruit == 'recruit') {
this.selectedCategoryId = 78;
this.categoryList = this.categoryList.filter((item) => {
return item.id == 78;
})
} else {
this.selectedCategoryId = this.categoryList[0].id;
}
this.posterQuery();
}
} else {
this.categoryList = [];
}
})
}
switchCategory(e) {
this.selectedCategoryId = e;
this.posterQuery();
}
}
<div class="wrapper">
<ul class="tab">
<li *ngFor="let titleItem of titleList" (click)="selectTab(titleItem.id)"
[ngClass]="{selected:selectedId===titleItem.id}">
<div style="position: relative;">
<h3>{{titleItem.name}}
</h3>
</div>
</li>
</ul>
<div class="content" *ngIf="selectedId===1">
<i class="iconfont icon-bianji" *ngIf="readonlyFlag" (click)="editInfo()"></i>
<i class="iconfont icon-save" *ngIf="!readonlyFlag" (click)="saveInfo()"></i>
<div class="contentDetail">
<div class="wrapper_item">
<div class="contentItem">
<span>姓名</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无姓名':'请输入姓名'}}"
[(ngModel)]="editBusiness.name" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>年龄</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无年龄信息':'请输入年龄'}}"
[(ngModel)]="editBusiness.age" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>性别</span>
<div class="sexWrapper">
<button class="form-control sex" [ngClass]="{'sexBtn':editBusiness?.gender=='1' && maleFlag && femaleFlag}"
(click)="selectedGender('1')" [disabled]="readonlyFlag" *ngIf="sexFlag && maleFlag">
</button>
<button class="form-control sex" [ngClass]="{'sexBtn':editBusiness?.gender=='2' && maleFlag && femaleFlag}"
(click)="selectedGender('2')" [disabled]="readonlyFlag" *ngIf="sexFlag && femaleFlag">
</button>
</div>
<input class="form-control" type="text" placeholder="暂无性别信息" *ngIf="!sexFlag" disabled />
</div>
<div class="contentItem">
<span>城市</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无城市信息':'请输入城市'}}"
[(ngModel)]="editBusiness.address" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>血型</span>
<select name="bloodTypeId" id="bloodTypeId" class="form-control" [disabled]="readonlyFlag"
[(ngModel)]="editBusiness.bloodTypeId" (blur)="inputBlur()">
<option value="">{{readonlyFlag ?'暂无血型信息':'请选择血型'}}</option>
<option *ngFor="let businessBloodItem of businessBloodList" [value]="businessBloodItem.id">
{{businessBloodItem.dropOptionName}}</option>
</select>
<!--<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无血型信息':'请选择血型'}}"-->
<!--[disabled]="readonlyFlag" [(ngModel)]="editBusiness.bloodTypeId" (blur)="inputBlur()" />-->
</div>
<div class="contentItem">
<span>星座</span>
<select name="businessZodiacId" id="businessZodiacId" class="form-control" [disabled]="readonlyFlag"
[(ngModel)]="editBusiness.zodiacTypeId" (blur)="inputBlur()">
<option value="">{{readonlyFlag ?'暂无星座信息':'请选择星座'}}</option>
<option *ngFor="let businessZodiacItem of businessZodiacList" [value]="businessZodiacItem.id">
{{businessZodiacItem.dropOptionName}}</option>
</select>
<!--<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无星座信息':'请选择星座'}}"-->
<!--[disabled]="readonlyFlag" [(ngModel)]="editBusiness.zodiacTypeId" (blur)="inputBlur()" />-->
</div>
</div>
<div class="wrapper_item">
<div class="contentItem">
<span>手机</span>
<a *ngIf="opportunityId!=0" style="text-decoration:none;color: #333;margin-right: 16px;"
href="tel:{{editBusiness.mobileNo}}">
<i class="iconfont icon-dianhua" style="color: #e10d0d;"></i>
{{editBusiness.mobileNo}}</a>
<input class="form-control" type="text" [(ngModel)]="editBusiness.mobileNo" *ngIf="opportunityId==0"
placeholder="请输入手机号" maxlength="11" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>微信</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无微信':'请输入微信'}}"
[(ngModel)]="editBusiness.weChat" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>其他联系</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无其他联系方式':'请输入其他联系方式'}}"
[(ngModel)]="editBusiness.otherContacts" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
</div>
<div class="wrapper_item">
<div class="contentItem">
<span>预计FYP</span>
<input class="form-control" type="number" placeholder="{{readonlyFlag ?'暂无预计FYP':'请输入预计FYP'}}"
[disabled]="readonlyFlag" [(ngModel)]="editBusiness.fyp" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>预计FYC</span>
<input class="form-control" type="number" placeholder="{{readonlyFlag ?'暂无预计FYC':'请输入预计FYC'}}"
[disabled]="readonlyFlag" [(ngModel)]="editBusiness.fyc" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>预计成交件数</span>
<input class="form-control" type="number" placeholder="{{readonlyFlag ?'暂无预计件数':'请输入预计件数'}}"
[disabled]="readonlyFlag" [(ngModel)]="editBusiness.pieces" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>预计成交时间</span>
<input class="form-control" type="date" placeholder="{{readonlyFlag ?'暂无预计成交时间':'请输入预计成交时间'}}"
[disabled]="readonlyFlag" [(ngModel)]="editBusiness.timeToClose" (blur)="inputBlur()" />
</div>
</div>
<div class="wrapper_item">
<div class="contentItem">
<span>商机来源</span>
<select *ngIf="opportunityId==0" name="businessSourceId" id="businessSourceId" class="form-control"
[(ngModel)]="editBusiness.sourceFrom" [disabled]="readonlyFlag" (blur)="inputBlur()">
<option value="">{{readonlyFlag ?'暂无商机来源':'请选择商机来源'}}</option>
<option *ngFor="let businessSourceItem of businessSourceList" [value]="businessSourceItem.id">
{{businessSourceItem.dropOptionName}}</option>
</select>
<input *ngIf="opportunityId!=0" class="form-control" type="text" [(ngModel)]="editBusiness.sourceChannel"
disabled placeholder="{{editBusiness.sourceChannel ?editBusiness.sourceChannel:'暂无商机来源'}}" />
</div>
<div class="contentItem">
<span>商机时间</span>
<input class="form-control" type="text" placeholder="商机时间" [(ngModel)]="editBusiness.opportunityDate"
disabled />
</div>
<div class="contentItem">
<span>商机状态</span>
<div style="padding: 6px 20px;color: #e10d0d;font-weight: bold;">
{{editBusiness.mdDropOptionName?editBusiness.mdDropOptionName:'待跟进'}}</div>
</div>
</div>
<div class="wrapper_item" style="border: none;margin-bottom: 0;">
<div class="contentItem">
<span>派遣专家</span>
<span *ngIf="editBusiness?.expertType == 0" style="padding: 6px 10px;border: 1px #e10d0d solid;border-radius: 20px;margin-right: 10px;" (click)="openPopInfo('申请已收到,会在1个工作日派遣专家')">申请专家支持</span>
<span *ngIf="editBusiness?.expertType == 1" style="padding:6px 20px;">派遣中...</span>
<span *ngIf="editBusiness?.expertType == 2" style="padding:6px 20px;">{{editBusiness?.expertPractitionerName}}</span>
</div>
</div>
<!-- <div class="contentItem">
<span>标签</span>
<input class="form-control" type="text" placeholder="标签" [(ngModel)]="editBusiness.name"
[disabled]="readonlyFlag" />
</div> -->
<div class="wrapper_item" style="border: none;margin-bottom: 0;">
<div class="contentItem">
<span>备注</span>
<div style="padding: 6px 15px;padding: 6px 15px;">
<input class="form-control" type="text" [disabled]="readonlyFlag" [(ngModel)]="editBusiness.remark"
placeholder="备注信息" (blur)="inputBlur()" />
</div>
</div>
</div>
<!-- 如果是新增商机,不需要打标签-->
<div class="tagWrapper" *ngIf="opportunityId != 0">
<div style="width: 100%;height: 34px;line-height: 34px;">标签</div>
<!-- <div class="tagContent" *ngFor="let tagItem of tagList" (click)="selectTag(tagItem)"
[ngClass]="{selected:tagItem.selected}">
{{tagItem.tagName}}
</div> -->
<div class="tagContent selected" *ngFor="let tagItem of opportunityCustomerTags">
{{tagItem.tagName}}
</div>
</div>
</div>
</div>
<div class="content" *ngIf="selectedId===2">
<div style="text-align: center;font-size: 16px;margin-top: 10px;"
*ngIf="opportunitySurveyAnswersList?.length==0 || !opportunitySurveyAnswersList">
暂无问卷信息</div>
<div class="answerContent" *ngFor="let surveyItem of opportunitySurveyAnswersList">
<div class="questionTitle">{{surveyItem.questionName}}</div>
<div class="questionContent">{{surveyItem.optionName}}</div>
</div>
</div>
<div class="content" *ngIf="selectedId===4">
<div style="text-align: center;font-size: 16px;margin-top: 10px;" *ngIf="isCompletedQuestionnaire!=3">暂无方案</div>
</div>
<div class="content" *ngIf="selectedId===3">
<ul class="recordLists">
<li *ngFor="let opportunityRecordItem of opportunityRecordInfos;index as idx">
<div style="display: flex;justify-content: space-between;height: 25px;">
<div class="updatedAt">{{opportunityRecordItem.noticeDate}}</div>
<div class="opportunityRecordItem">
{{opportunityRecordItem.mdDropOptionName?opportunityRecordItem.mdDropOptionName:'待跟进'}}</div>
</div>
<div class="salesNotice">
<span>
<input type="text" class="form-control" [(ngModel)]="opportunityRecordItem.salesNotice"
[disabled]="remarkId!=opportunityRecordItem.id" (blur)="inputBlur()" />
</span>
<i *ngIf="remarkId!=opportunityRecordItem.id" class="iconfont icon-bianji"
(click)="editRemark(opportunityRecordItem.id)"></i>
<i *ngIf="remarkId==opportunityRecordItem.id" class="iconfont icon-save"
(click)="ownOpportunityRecordSave(opportunityRecordItem)"></i>
</div>
</li>
<!-- <li>
<div class="salesNotice">{{(editBusiness.opportunityDate).substr(0,10)}}</div>
<div style="display: flex;justify-content: space-between;">
<div>商机状态</div>
<div>待跟进</div>
</div>
</li> -->
</ul>
<div class="add" *ngIf="status==0" (click)="showToast()">
<!-- <i class="iconfont icon-jia" (click)="ownOpportunityRecordSave()"></i> -->
<i class="iconfont icon-jiahao"></i>
</div>
</div>
<div class="toastWrapper toast" *ngIf="isShow" (click)="closeToast()">
</div>
<!--编辑框-->
<div class="editContainer" *ngIf="isShow">
<div>
<div>跟进状态</div>
<div style="position:relative">
<select name="businessStatus" (onChange)="inputBlur()" id="businessStatus" class="form-control"
[(ngModel)]="opportunityRecordId">
<option value="null">请选择</option>
<option *ngFor="let businessStatusItem of businessStatusList" value="{{businessStatusItem.id}}">
{{businessStatusItem.dropOptionName}}
</option>
</select>
<i class="iconfont icon-xiangxia" style="position: absolute;right: 50px;top: 5px;"></i>
</div>
</div>
<div>
<div>备注</div>
<div><input type="text" id="remark" class="form-control" placeholder="输入备注信息" [(ngModel)]="salesNotice"
(blur)="inputBlur()"></div>
</div>
<div>
<div>跟进时间</div>
<div><input style="-webkit-appearance: none;" id="time" class="form-control" type="date"
[(ngModel)]="opportunityRecordNoticeDate" (blur)="inputBlur()"></div>
</div>
<ul class="footer">
<li (click)="ownOpportunityRecordSave()">确定</li>
<li (click)="closeToast()">取消</li>
</ul>
</div>
</div>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
\ No newline at end of file
.wrapper {
padding-bottom: 40px;
font-size: 16px;
select {
-webkit-appearance: none;
border: none;
box-shadow: none;
}
.tab {
display: flex;
list-style: none;
margin: 10px 0px;
padding-left: 1%;
li {
margin-right: 10px;
line-height: 30px;
height: 30px;
width: 25%;
text-align: center;
border: 1px #a9aabb solid;
border-radius: 20px;
h3 {
font-weight: normal;
font-size: 16px;
}
}
li.selected {
// background-color: #ff5a32;
// color: #fff;
border: 1px #e10d0d solid;
}
}
.content {
padding: 10px 5px;
position: relative;
> .iconfont {
width: 55px;
height: 55px;
line-height: 55px;
border-radius: 50%;
position: fixed;
left: 42%;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
bottom: 5px;
}
.contentDetail {
margin-top: 15px;
.wrapper_item {
border-bottom: 1px #ddd solid;
margin-bottom: 10px;
.contentItem {
display: flex;
justify-content: space-between;
align-items: center;
// border-bottom: 1px #ddd solid;
margin: 0 8px 5px 8px;
> span:first-child {
white-space: nowrap;
}
input.form-control {
// width: 60%;
margin: 0 5px;
background: none;
outline: none;
border: none;
text-align: right;
box-shadow: none;
display: flex;
flex-wrap: wrap;
font-size: 16px;
}
.sexWrapper {
display: flex;
width: 60%;
justify-content: flex-end;
padding-right: 3px;
.form-control.sex {
width: 20%;
margin-left: 5px;
border: none;
box-shadow: none;
}
.form-control.sex.sexBtn {
border: 1px #0767bf solid;
}
.form-control[disabled] {
background-color: transparent;
opacity: 1;
}
}
select.form-control {
direction: rtl;
}
select.form-control[disabled] {
background-color: transparent;
color: #999;
}
}
.contentItem:last-child {
border-bottom: none;
}
}
}
.tagWrapper {
display: flex;
flex-wrap: wrap;
padding-left: 8px;
div.tagContent {
margin: 10px 3px 0 3px;
height: 28px;
line-height: 28px;
text-align: center;
// background-color: #e8e8e8;
border-radius: 12px;
font-size: 13px;
padding: 0 15px;
}
div.selected {
border: 1px #0767bf solid;
}
}
.add {
position: absolute;
.iconfont {
width: 55px;
height: 55px;
line-height: 55px;
border-radius: 50%;
position: fixed;
right:42%;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
bottom: 5px;
font-size: 28px;
// color: #ff5933;
font-weight: bold;
}
}
.answerContent {
border-bottom: 1px #ddd solid;
margin-bottom: 5px;
padding: 5px 0;
.questionTitle {
font-weight: 700;
font-size: 13px;
}
.questionContent {
font-size: 16px;
}
}
.answerContent:last-child {
border-bottom: 0;
}
.record {
display: flex;
list-style: none;
justify-content: space-between;
li {
width: 30%;
text-align: center;
height: 30px;
line-height: 30px;
}
}
}
.editContainer {
padding: 10px;
position: fixed;
bottom: 0;
width: 100%;
height: 45%;
background-color: #fff;
z-index: 20;
-webkit-animation: .5s both slowUp;
animation: .5s both slowUp;
min-width: 320px;
max-width: 640px;
margin: 0 auto;
> div {
height: 50px;
border-bottom: 1px solid #dbdbdb;
display: flex;
align-items: center;
justify-content: space-between;
> div:first-child {
width: 100px;
font-size: 15px;
}
> div:last-child {
flex: 1;
}
.form-control {
border: none;
box-shadow: none;
}
}
> div:last-child {
border: none;
}
ul.footer {
display: flex;
list-style: none;
justify-content: center;
margin-top: 15%;
li {
width: 30%;
height: 35px;
line-height: 35px;
text-align: center;
background: #e10d0d;
color: #fff;
margin: 0 10px;
border-radius: 10px;
}
}
}
.recordLists {
li {
border-bottom: 1px solid #f0f0f0;
padding: 5px 10px;
background: rgb(251, 251, 251);
}
li:last-child {
border: none;
}
.opportunityRecordItem {
font-size: 15px;
}
.salesNotice {
font-size: 14px;
color: #8a8a8a;
line-height: 1.1;
margin-bottom: 5px;
display: flex;
justify-content: space-between;
align-items: center;
span{
width: 85%;
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
background-color: #eee;
opacity: .5;
border: none;
outline: none;
box-shadow: none;
padding-left: 0;
}
}
.iconfont{
font-size: 18px;
}
}
.updatedAt {
// font-size: 12px;
// color: #8a8a8a;
// text-align: right;
}
}
.toast {
position: fixed;
left: 0;
right: 0;
min-width: 320px;
max-width: 640px;
width: 100%;
margin: 0 auto;
z-index: 1;
}
.toastWrapper {
height: 100%;
background-color: rgba(0, 0, 0, .5);
top: 0;
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MyBusinessDetailComponent } from './my-business-detail.component';
describe('MyBusinessDetailComponent', () => {
let component: MyBusinessDetailComponent;
let fixture: ComponentFixture<MyBusinessDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MyBusinessDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MyBusinessDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { ActivatedRoute, Router } from "@angular/router";
import { BusinessQuery } from '../../domain/businessQuery';
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-my-business-detail',
templateUrl: './my-business-detail.component.html',
styleUrls: ['./my-business-detail.component.scss']
})
export class MyBusinessDetailComponent implements OnInit {
titleList: Array<any>;
selectedId: number;
surveyAnswersList: Array<any>;
readonlyFlag: boolean = true;
orderId: number;
opportunityId: string;
opportunitySurveyAnswersList: Array<any>;
tagList: Array<any>;
editBusiness: BusinessQuery = new BusinessQuery();
//商机状态
businessStatusList: Array<any>;
//经纪人输入商机来源类型
businessSourceList: Array<any>;
//商机星座类型
businessZodiacList: Array<any>;
//商机血型类型
businessBloodList: Array<any>;
cityFlag: boolean;
provinceList: Array<any>;
provinces: Array<any>;
//返回的标签列表
opportunityCustomerTags: Array<any>;
opportunityRecordInfos: Array<any>;
//是否可以跳转预览方案
isCompletedQuestionnaire: any;
//控制弹框
toastDialog: boolean;
toastInfo: any;
// 增加还是保存
addStatus: boolean;
// 备注信息
salesNotice: string;
// 跟进时间
opportunityRecordNoticeDate: Date;
// 跟进状态
opportunityRecordId: number;
//性别显示
sexFlag: boolean;
//显示女
femaleFlag: boolean;
//显示男
maleFlag: boolean;
isShow: boolean;
//线索id
leadsAssignedId: any;
//控制tab可不可点
clickFlag: boolean;
remarkId: any;
status: any;
isNeedAlert: boolean;
dialogInfo: any;
practitionerId:any;
constructor(private activateRoute: ActivatedRoute, private myService: MyService,
public lifeCommonService: LifeCommonService, private router: Router, ) {
this.titleList = [
{ id: 1, name: '基本信息' },
{ id: 3, name: '商机跟进' },
{ id: 2, name: '咨询问卷' },
{ id: 4, name: '咨询报告' },
]
}
ngOnInit() {
this.orderId = this.activateRoute.snapshot.queryParams['orderId'];
//商机对应的客户id
this.opportunityId = this.activateRoute.snapshot.paramMap.get('id');
//商机id
this.leadsAssignedId = this.activateRoute.snapshot.queryParams['leadsAssignedId'];
this.opportunityRecordId = null;
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']
this.tagQuery();
//商机状态
this.dropOptionsQuery('bizchance_promotion_action');
//经纪人输入商机来源类型
this.dropOptionsQuery('leads_manual_source');
//商机星座类型
this.dropOptionsQuery('leads_manual_zodiac_type');
//商机血型类型
this.dropOptionsQuery('leads_manual_blood_type');
//新增商机
if (Number(this.opportunityId) === 0) {
this.readonlyFlag = false;
this.sexFlag = true;
this.maleFlag = true;
this.femaleFlag = true;
this.clickFlag = false;
//初始化新增
this.editBusiness = new BusinessQuery("", "", "", 1, "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", null);
this.selectTab(1);
} else {
this.clickFlag = true;
this.selectTab(1);
//查询商机
setTimeout(() => {
this.ownOpportunityDetailQuery();
}, 300)
}
}
//改为编辑状态出现男女选项
editInfo() {
this.readonlyFlag = false;
this.sexFlag = true;
this.maleFlag = true;
this.femaleFlag = true;
}
selectTab(id) {
if (this.clickFlag == true) {
this.selectedId = id;
if (id === 4) {
if (this.isCompletedQuestionnaire == 3) {
window.location.href = `https://${window.location.host}/customizedPlanList/3?orderId=${this.orderId}&customerId=${this.opportunityId}`
}
}
} else {
this.selectedId = 1;
}
}
ownOpportunityDetailQuery() {
const detailParam = {
opportunityId: this.opportunityId ? Number(this.opportunityId) : null,
orderId: this.orderId ? Number(this.orderId) : null,
practitionerId: this.practitionerId
}
this.myService.ownOpportunityDetailQuery(detailParam).subscribe((res) => {
if (res['success']) {
this.opportunitySurveyAnswersList = res['data']['opportunityConsultationInfo']['opportunitySurveyAnswersList']
this.editBusiness = res['data']['opportunityBasicInformationInfo'];
this.opportunityCustomerTags = res['data']['opportunityBasicInformationInfo']['opportunityCustomerTags']
this.opportunityRecordInfos = res['data']['opportunityRecordSituationInfo']['opportunityRecordInfos'];
this.isCompletedQuestionnaire = res['data']['opportunityConsultationInfo']['isCompletedQuestionnaire'];
this.status = res['data']['opportunityRecordSituationInfo']['status'];
//如果没有性别显示暂无性别
if (!res['data']['opportunityBasicInformationInfo']['gender']) {
this.sexFlag = false;
} else {
this.sexFlag = true;
if (res['data']['opportunityBasicInformationInfo']['gender'] == 1) {
this.maleFlag = true;
this.femaleFlag = false;
} else {
this.femaleFlag = true;
this.maleFlag = false;
}
}
if (!this.editBusiness.bloodTypeId) {
this.editBusiness.bloodTypeId = '';
}
if (!this.editBusiness.zodiacTypeId) {
this.editBusiness.zodiacTypeId = '';
}
if (!this.editBusiness.sourceFrom) {
this.editBusiness.sourceFrom = '';
}
if (this.opportunityCustomerTags.length > 0) {
for (let i = 0; i < this.opportunityCustomerTags.length; i++) {
for (let j = 0; j < this.tagList.length; j++) {
if (this.opportunityCustomerTags[i]['tagId'] == this.tagList[j]['id']) {
this.tagList[j].selected = true;
} else {
this.tagList[j].selected = false;
}
}
}
}
} else {
this.opportunitySurveyAnswersList = [];
}
})
}
tagQuery() {
this.myService.tagQuery({ tagType: 2, isActive: 1 }).subscribe((res) => {
if (res['success']) {
this.tagList = res['data']['tagVOs'];
}
})
}
//选标签
selectTag(tagItem) {
if (this.readonlyFlag) {
return;
}
this.tagList.forEach((item, idx) => {
if (tagItem.id == item.id) {
this.tagList[idx].selected = !tagItem.selected
}
})
this.editBusiness.opportunityCustomerTags = this.tagList.filter((item) => {
return item.selected == true;
})
}
//选男女
selectedGender(e) {
this.editBusiness.gender = e;
}
// 获取下拉框列表
dropOptionsQuery(dropCode) {
this.myService.dropOptionsQuery({ code: dropCode }).subscribe((res) => {
if (res['success']) {
if (dropCode === 'bizchance_promotion_action') {
this.businessStatusList = res['data']['dropMasterInfoList']['0']['dropOptionsInfoList'];
} else if (dropCode === 'leads_manual_source') {
this.businessSourceList = res['data']['dropMasterInfoList']['0']['dropOptionsInfoList'];
} else if (dropCode === 'leads_manual_zodiac_type') {
this.businessZodiacList = res['data']['dropMasterInfoList']['0']['dropOptionsInfoList'];
} else if (dropCode === 'leads_manual_blood_type') {
this.businessBloodList = res['data']['dropMasterInfoList']['0']['dropOptionsInfoList'];
}
}
})
}
saveInfo() {
// 如果是新增商机,不需要打标签
let newTag;
if (Number(this.opportunityId) != 0) {
newTag = this.editBusiness.opportunityCustomerTags.map((item) => {
return {
tagId: item.id ? item.id : item.tagId,
tagName: item.tagName
}
})
}
if (!this.editBusiness.name) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '姓名不能为空!',
timeout: 3000,
align: 'center'
};
return;
} else {
this.editBusiness.name = this.editBusiness.name.trim();
if (!this.lifeCommonService.nameValid(this.editBusiness.name)) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '不要乱输姓名哦!',
timeout: 3000,
align: 'center'
};
return;
}
}
if (!this.editBusiness.mobileNo) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '手机号不能为空!',
timeout: 3000,
align: 'center'
};
return;
} else {
this.editBusiness.mobileNo = this.editBusiness.mobileNo.trim()
if (!this.lifeCommonService.mobileNoValid(this.editBusiness.mobileNo)) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '输入手机号码错误',
timeout: 3000,
align: 'center'
};
return;
}
}
const OVERZERO_REG = /^[0-9]*[1-9][0-9]*$/;
if (this.editBusiness.age) {
if (OVERZERO_REG.test(this.editBusiness.age)) {
if (parseInt(this.editBusiness.age) > 100) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '年龄不能大于三位数!',
timeout: 3000,
align: 'center'
};
return;
}
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '年龄只能输入正整数!',
timeout: 3000,
align: 'center'
};
return;
}
}
if (this.editBusiness.fyp) {
const fypArr = this.editBusiness.fyp.toString().split('.');
if (fypArr.length - 1 == 1) {
if (fypArr[0].length > 10) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '预计fyp只能输入最多10位整数!',
timeout: 3000,
align: 'center'
};
return;
}
if (fypArr[1].length > 3) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '预计fyp只能输入最多2位小数!',
timeout: 3000,
align: 'center'
};
return;
}
} else if (fypArr.length - 1 > 1) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: 'fyp不能输入多个小数点!',
timeout: 3000,
align: 'center'
};
return;
}
}
if (this.editBusiness.fyc) {
const fycArr = this.editBusiness.fyc.toString().split('.');
if (fycArr.length - 1 == 1) {
if (fycArr[0].length > 10) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '预计fyc只能输入最多10位整数!',
timeout: 3000,
align: 'center'
};
return;
}
if (fycArr[1].length > 3) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '预计fyc只能输入最多2位小数!',
timeout: 3000,
align: 'center'
};
return;
}
} else if (fycArr.length - 1 > 1) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: 'fyc不能输入多个小数点!',
timeout: 3000,
align: 'center'
};
return;
}
}
if (this.editBusiness.pieces) {
if (!OVERZERO_REG.test(this.editBusiness.pieces)) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '预计件数只能输入正整数!',
timeout: 3000,
align: 'center'
};
return;
}
}
this.editBusiness = {
...this.editBusiness,
leadsAssignedId: this.leadsAssignedId ? Number(this.leadsAssignedId) : null,
opportunityId: this.opportunityId ? Number(this.opportunityId) : null,
opportunityCustomerTags: newTag ? newTag : [],
assignedPractitionerId: this.practitionerId,
fyp: this.editBusiness.fyp ? Number(this.editBusiness.fyp) : null,
fyc: this.editBusiness.fyc ? Number(this.editBusiness.fyc) : null,
sourceFrom: this.editBusiness.sourceFrom ? Number(this.editBusiness.sourceFrom) : null
}
this.myService.ownOpportunityBasicInformationSave(this.editBusiness).subscribe((res) => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: Number(this.opportunityId) == 0 ? '新增成功!' : '修改成功!',
timeout: 3000,
align: 'center'
};
this.readonlyFlag = true;
if (this.editBusiness.gender) {
this.sexFlag = true;
if (this.editBusiness.gender == '1') {
this.maleFlag = true;
this.femaleFlag = false;
} else {
this.femaleFlag = true;
this.maleFlag = false;
}
} else {
this.sexFlag = false;
}
//新增的时候要刷新页面
if (Number(this.opportunityId) == 0) {
if (res['data']['opportunityId'] && res['data']['leadsAssignedId']) {
this.opportunityId = res['data']['opportunityId'];
this.leadsAssignedId = res['data']['leadsAssignedId'];
this.router.navigate([`/business/${this.opportunityId}`], { queryParams: { leadsAssignedId: this.leadsAssignedId }, replaceUrl: true });
this.clickFlag = true;
}
}
this.ownOpportunityDetailQuery();
}
})
}
ownOpportunityRecordSave(opportunityRecordItem?: any) {
let param;
if (!opportunityRecordItem) {
const oppDate = new Date(this.opportunityRecordNoticeDate + ' 23:59:59').getTime();
const createDate = new Date(this.editBusiness.opportunityDate).getTime();
// if (nowDate < oppDate) {
// this.toastDialog = true;
// this.toastInfo = {
// status: 1,
// msg: '跟进时间不能大于当前时间!',
// timeout: 3000,
// align: 'center'
// };
// return;
// }
if (oppDate < createDate) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '跟进时间不能在商机之前!',
timeout: 3000,
align: 'center'
};
return;
}
if (!this.opportunityRecordId) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '请选择跟进状态!',
timeout: 3000,
align: 'center'
};
return;
}
if (!this.salesNotice) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '备注不能为空!',
timeout: 3000,
align: 'center'
};
return;
}
if (!this.opportunityRecordNoticeDate) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '跟进时间不能为空!',
timeout: 3000,
align: 'center'
};
return;
}
param = {
id: '',
salesNotice: this.salesNotice,
isActive: 1,
practitionerId: this.practitionerId,
opportunityId: this.opportunityId ? Number(this.opportunityId) : null,
mdDropOptionId: this.opportunityRecordId ? Number(this.opportunityRecordId) : null,
noticeDate: this.opportunityRecordNoticeDate,
leadsAssignedId: this.leadsAssignedId ? Number(this.leadsAssignedId) : null
}
} else {
param = opportunityRecordItem
}
this.myService.ownOpportunityRecordSave(param).subscribe(res => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: opportunityRecordItem ? '修改成功!' : '添加成功!',
timeout: 3000,
align: 'center'
};
this.opportunityRecordId = this.salesNotice = this.opportunityRecordNoticeDate = null;
this.ownOpportunityDetailQuery();
this.isShow = false;
this.remarkId = '';
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
//添加商机弹框
showToast() {
this.isShow = true;
}
closeToast() {
this.isShow = false;
}
inputBlur() {
window.scrollTo(0, 0)
}
editRemark(id) {
this.remarkId = id
}
openPopInfo(message) {
this.myService.applyForExpertSupport({leadsAssignedId:this.leadsAssignedId,practitionerId:this.practitionerId,opportunityId:this.opportunityId}).subscribe((res)=>{
if(res['success']){
this.ownOpportunityDetailQuery();
this.isNeedAlert = true;
this.dialogInfo = {
title: null,
content: { value: message, align: 'center' },
footer: [{ value: '确认离开', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}else{
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
// 关闭弹窗
getPopInfo() {
this.isNeedAlert = false;
}
}
<div class="salesWrapper">
<div class="salesContent">
<div style="text-align: center;margin: 20px auto;font-size: 20px;" *ngIf="businessList?.length==0">暂无商机</div>
<!-- <div class="line" *ngFor="let businessItem of businessList" [queryParams]="{orderId:businessItem.orderId}">
<div></div>
<div>手机号:{{businessItem.mobileNo}}</div>
<div>商机来源:{{businessItem.opportunityFrom}}</div>
<div></div>
</div> -->
<div class="salesItem" *ngFor="let businessItem of businessList"
[routerLink]="['/business',businessItem.opportunityId]"
[queryParams]="{orderId:businessItem.orderId,leadsAssignedId:businessItem.leadsAssignedId}">
<div class="icon_bolck" [ngStyle]="{'background':businessItem.expertType=='1'? '#ddd' : 'none'}">
<span class="iconfont icon-xiansuo1" *ngIf="businessItem.expertType=='0'"></span>
<span class="iconfont icon-zhuanjia" style="color: #093d9b;" *ngIf="businessItem.expertType=='1'"></span>
</div>
<div class="line">
<div>姓名:{{businessItem.name}}</div>
<span class="iconfont icon-ar-r" style="font-size: 10px;position: relative; right: -2px;"></span>
</div>
<div class="line">
<div> 手机号:{{businessItem.mobileNo}}</div>
<div>{{businessItem.mdDropOptionName ? businessItem.mdDropOptionName:'待跟进'}}</div>
</div>
<div class="line">
<div>商机来源:{{businessItem.opportunityFrom}}</div>
<div>{{(businessItem.opportunityDate).substr(0,10)}}</div>
</div>
</div>
</div>
<div class="add">
<i class="iconfont icon-jiahao" (click)="addBussiness()"></i>
</div>
</div>
\ No newline at end of file
.salesWrapper{
width: 100%;
height: 100%;
overflow: auto;
// background:#f7f7f2;
.salesContent{
.salesItem{
border-bottom: 1px #dcdcdc solid;
padding: 10px;
padding-left: 45px;
position: relative;
.icon_bolck{
border: 1px #dcdcdc solid;
width: 35px;
height: 35px;
position: absolute;
left: 3px;
top: 20px;
line-height: 30px;
text-align: center;
border-radius: 50%;
.iconfont{
color: #ff3500;
font-size: 26px;
position: relative;
top: 1px;
}
}
.line{
display: flex;
justify-content: space-between;
align-items: center;
font-size: 13px;
flex: 1;
.price{
font-size: 16px;
color: #ff3500;
font-weight: bold;
}
}
}
.salesItem:last-child{
border-bottom: none;
}
}
.add {
position: absolute;
.iconfont {
width: 55px;
height: 55px;
line-height: 55px;
border-radius: 50%;
position: fixed;
right: 10px;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
bottom: 50px;
font-size: 28px;
// color: #ff5933;
font-weight: bold;
left: 42%;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MyBusinessComponent } from './my-business.component';
describe('MyBusinessComponent', () => {
let component: MyBusinessComponent;
let fixture: ComponentFixture<MyBusinessComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MyBusinessComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MyBusinessComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { LifeCommonService } from '../../common/life-common.service';
import { Router } from "@angular/router";
@Component({
selector: 'ydlife-my-business',
templateUrl: './my-business.component.html',
styleUrls: ['./my-business.component.scss']
})
export class MyBusinessComponent implements OnInit {
businessList: Array<any>;
constructor(private myService: MyService, public lifeCommonService: LifeCommonService, private router: Router) { }
ngOnInit() {
this.ownOpportunityQuery()
}
ownOpportunityQuery() {
const brokerCustomerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['customerId'];
const brokerPractitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.ownOpportunityQuery({ customerId: brokerCustomerId, practitionerId: brokerPractitionerId }).subscribe((res) => {
if (res['data']['ownOpportunityInfos']) {
this.businessList = res['data']['ownOpportunityInfos'];
} else {
this.businessList = []
}
})
}
addBussiness() {
this.router.navigate(['/business/0']);
}
}
<div class="weui-panel">
<div class="weui-panel__hd header">
<!--头部经纪人信息START-->
<div class="avatar" routerLink="setting">
<img
src="{{lifeCustomerInfo?.practitionerBasicInfo?.headImagePath ? lifeCustomerInfo?.practitionerBasicInfo?.headImagePath : './assets/images/icons/meng.png'}}"
alt="头像">
</div>
<div class="brokerInfo">
<div class="brokerName">
<div style="letter-spacing: 2px"><span>{{lifeCustomerInfo?.practitionerBasicInfo?.name}}</span></div>
<span i class="iconfont icon-ar-r" style="font-size:18px;" routerLink="setting"></span>
</div>
<div class="brokerTag">
<div>
<p>{{lifeCustomerInfo?.practitionerBasicInfo?.insurerBranchName ?
lifeCustomerInfo?.practitionerBasicInfo?.insurerBranchName : '银盾保险'}}</p>
</div>
<div>·</div>
<div>{{lifeCustomerInfo?.practitionerBasicInfo?.subordinateName}}</div>
<div>·</div>
<div><span class="ydTitle">{{lifeCustomerInfo?.practitionerBasicInfo?.levelName}}</span></div>
</div>
</div>
<!--头部经纪人信息END-->
</div>
<div class="weui-panel__bd">
<div class="performance_wrapper">
<!-- <img class="bg" src="assets/images/sales__bg.png" > -->
<div class="content">
<span class="detail" (click)="jumpToDetail()">龙虎榜<i class="iconfont icon-ar-r"
style="font-size:12px;"></i></span>
<ul class="tab">
<li *ngFor="let item of performanceList" (click)="rank(item.time,1,2);rank(item.time,2,2)"
[ngClass]="{selected:performanceSelectedFlag==item.time}">
<div style="position: relative;">
<h3>{{item.name}}
<i class="line" *ngIf="performanceSelectedFlag==item.time" [ngStyle]="{'left':leftWidth}"></i>
</h3>
</div>
</li>
</ul>
<div>
<ul class="performance_list title">
<li></li>
<li>首年保费
<!-- <span class="iconfont icon-xiangxia" style="font-size: 10px;margin-left: 3px;"></span> -->
</li>
<li>首年佣金</li>
<li>件数</li>
<li>完成率</li>
</ul>
<ul class="performance_list">
<li>线上</li>
<li class="markPrice" style="margin:0 7px;">
¥{{onlineInfo?.fyp | number: "1.0-0"}}
</li>
<li class="markPrice">
¥{{onlineInfo?.fyc | number: "1.0-0"}}
</li>
<li class="markPrice">{{onlineInfo?.count?onlineInfo.count:'-'}}</li>
<li class="markPrice" style="position: relative;top: 12px;">
{{onlineInfo?.completionRate?onlineInfo.completionRate + '%':'-'}}
</li>
</ul>
<ul class="performance_list">
<li>线下</li>
<li class="markPrice" style="margin:0 7px;">
¥{{offlineInfo?.fyp | number: "1.0-0"}}
</li>
<li class="markPrice">
¥{{offlineInfo?.fyc | number: "1.0-0"}}
</li>
<li class="markPrice">{{offlineInfo?.count?offlineInfo.count:'-'}}</li>
<li class="markPrice">
&nbsp;
</li>
</ul>
</div>
</div>
</div>
<div class="performance_wrapper">
<div class="content">
<div class="activities_grade">
<span>销售活动量分值</span>
<span class="iconfont icon-ar-r" routerLink="scoreDeatil"></span>
</div>
<ul class="activities">
<li class="markPrice">{{this.activities_grade?.scoreDay}}</li>
<li class="markPrice">{{this.activities_grade?.scoreWeek}}</li>
<li class="markPrice">{{this.activities_grade?.scoreMonth}}</li>
<li class="markPrice">
{{this.activities_grade?.achievementRateWeek!=null ? lifeCommonService.toPercent(this.activities_grade?.achievementRateWeek) :'-'}}
</li>
<li class="markPrice">
{{this.activities_grade?.achievementRateMonth!=null ? lifeCommonService.toPercent(this.activities_grade?.achievementRateMonth) :'-'}}
</li>
<li class="markPrice">{{this.activities_grade?.addOpportunityNum}}</li>
</ul>
<ul class="activities">
<li>今天</li>
<li>本周</li>
<li>本月</li>
<li>本周达成率</li>
<li>本月达成率</li>
<li>本周新增商机</li>
</ul>
</div>
</div>
<div class="performance_wrapper notice">
<div style="position: relative;">
<h3 style="font-size: 16px;color: #ff002a;">公告</h3><i class="iconfont" style="color: #ff002a;">&#xe645;</i>
<div #hide style="font-size: 14px;position: absolute;z-index:-100" [innerHtml]="firstAnnouncement"></div>
<div>{{this.firstAnnouncementTitle}}</div>
<span style="position:absolute;right:5px;font-size: 12px;color:#408dc9;"
routerLink="importantAnnouncement">更多</span>
</div>
</div>
<div class="tool_wrapper" *ngFor="let menuItem of menuLists;">
<div class="tool_item" *ngIf="menuItem.isShow">
<h3>{{menuItem.title}}</h3>
<div class="tool_content">
<div class="content_item" *ngFor="let menuItemContent of menuItem['content']" href="javascript:;"
(click)="menuNavigation(menuItemContent)">
<span class="iconfont" [ngClass]="menuItemContent.icon"></span>
<div style="font-size: 13px;">{{menuItemContent.subtitle}}</div>
</div>
</div>
</div>
</div>
<!-- <hr style="border-top: 1px solid #ddd;border-left: none;border-right: none;border-bottom: none;" /> -->
<div class="hotProduct">
<div style="margin-bottom: 10px;">
<h3>热销产品</h3>
</div>
<div class="media borderBottom" *ngFor="let product of products,let i = index" (click)="goProductDetail(product)"
[ngClass]="{'pad15':!isShowShare}">
<div class="media-left media-middle">
<img class="media-object" src="{{product.iconPath}}" alt="{{product.planName}}">
<div class="yd_logo">
<img src="assets/images/yd-online_logo.png" alt="上海银盾保险经纪有限公司">
</div>
</div>
<div class="media-body">
<div class="media-heading">
<h4>{{product.planName}}</h4>
<div class="companylogo">
<span class="logoBox"><img src="{{product.companyLogoPath}}" alt="{{product.companyName}}"
class="img-responsive"></span>
</div>
</div>
<div class="summaryBox">
<div class="summaryContent" *ngFor="let label of product.labels">
<div class="summaryIcon"><i class="iconfont icon-gou"></i></div>
<div class="summaryLabel">{{label}}</div>
</div>
</div>
<div class="priceContainer">
<div style="width: 75%;display: flex;justify-content:space-between;align-items: flex-end">
<span class="price" *ngIf="product.productCategoryId!='4'"><strong>¥{{product.price}}</strong><small
style="font-size:12px;font-weight: normal;margin-left: 2px;"></small><span
style="margin-left: 5px;white-space: nowrap">1人{{product.dayCount>=365 ? '1年' : product.dayCount + '天'}}</span></span>
<span class="price" *ngIf="product.productCategoryId=='4'"><strong>¥{{product.price}}</strong><small
style="font-size:12px;font-weight: normal;margin-left: 2px;">/年 起</small></span>
<span style="color:#4a4a4a;font-weight:lighter;white-space: nowrap">{{product.feedbackCount}}条评价</span>
</div>
<div><span style="font-size: 16px;padding-right: 18px;color:#4a4a4a" class="iconfont icon-ar-r"></span>
</div>
</div>
</div>
</div>
</div>
<!-- <hr style="border-top: 1px solid #ddd;border-left: none;border-right: none;border-bottom: none;" /> -->
<div class="health_wrapper">
<h3>医疗服务</h3>
<img style="border-radius: 10px;width: 48%;margin-right: 10px;" src="assets/images/yindunvipmember.jpg"
(click)="jumpUrl()">
<!-- <img style="border-radius: 10px;width: 48%;" src="assets/images/yindunvipmember.jpg" (click)="jumpUrl()"> -->
</div>
<div class="health_wrapper" style="padding: 12px 10px 12px 10px;">
<h3 style="margin-bottom: 0;">我的设置
<span i class="iconfont icon-ar-r" style="font-size:18px;float: right;" routerLink="setting"></span>
</h3>
</div>
<div class="health_wrapper" style="padding: 12px 10px 12px 10px;">
<h3 style="margin-bottom: 0;">我的消息
<span i class="iconfont icon-ar-r" style="font-size:18px;float: right;" routerLink="news"></span></h3>
</div>
</div>
<div class="footer" style="font-size: 12px;padding-top: 10px;text-align: center;background: #f6f7f2;">
<p>上海银盾保险经纪有限公司</p>
<p>保险业务经营许可证:269615000000800</p>
<p>版权所有©2020银盾保险在线 &nbsp;沪ICP备18000565号</p>
</div>
</div>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
\ No newline at end of file
.weui-panel{
position: relative;
.weui-cell__hd {
i.iconfont {
background-image: -webkit-gradient(linear, left top, right bottom, from(#ff1c2b), to(#461415));
background-image: linear-gradient(to bottom right, #ff1c2b, #461415);
-webkit-background-clip: text;
color: transparent;
margin-right: 10px;
width: 35px;
height: 35px;
line-height: 35px;
text-align: center;
font-size: 26px;
}
}
.weui-panel__hd {
display: flex;
-webkit-box-align: center;
align-items: center;
padding: 10px 0 10px 21px;
width: 100%;
// color: #fff;
// background: linear-gradient(90deg, #494949, #393939);
color: #333;
background: #f6f7f2;
box-sizing: border-box;
img {
max-width: 100%;
height: 100%;
display: block;
}
> div {
margin-right: 15px;
}
.avatar {
width: 60px;
height: 60px;
border-radius: 50%;
overflow: hidden;
}
.brokerInfo {
flex: 1;
.brokerName {
display: flex;
justify-content: space-between;
// color: #e3c385;
font-weight: normal;
font-size: 16px;
> div:first-child {
display: flex;
align-items: flex-end;
font-size: 17px;
}
}
.ydTitle, .brokerTag {
// color: #ae9f82;
border-radius: 6px;
}
.brokerTag {
// margin-top: 10px;
display: flex;
font-weight: normal;
font-size: 14px;
> div {
display: flex;
align-items: center;
margin-right: 5px;
}
}
}
.shareSelfInfoBtn {
padding: 0 15px;
color: #fff;
background-color: #ff4100;
border-radius: 20px;
font-size: 15px;
}
}
.weui-panel__hd.header{
// background: -webkit-linear-gradient(left, #696d90, #a1adc7);
// background: -o-linear-gradient(left, #696d90, #a1adc7);
// background: -moz-linear-gradient(left, #696d90, #a1adc7);
// background: -ms-linear-gradient(left, #696d90, #a1adc7);
// background: linear-gradient(to right, #696d90, #a1adc7);
}
.weui-panel__bd{
background: #f6f7f2;
height: auto;
padding: 0px 8px;
img{
width: 100%;
}
.performance_wrapper{
border-radius: 6px;
// margin: 5px auto 8px auto;
margin: 0 auto 8px auto;
box-shadow: 0 0px 2.5px #eceaea;
position: relative;
// background: url('../../../assets/images/top_bg.png') no-repeat ;
background: url('../../../assets/images/bg_02.jpg') no-repeat ;
background-size: cover;
.bg{
height: 100%;
position: absolute;
z-index: 1;
}
.content{
position: relative;
padding: 0px 0px 5px 8px;
ul{
list-style: none;
}
.tab{
display: flex;
list-style: none;
margin-bottom: 5px;
li {
margin-right: 15px;
line-height: 38px;
height: 38px;
color: #fff;
h3{
font-weight: normal;
font-size: 16px;
}
}
li.selected{
h3{
font-weight: bold;
}
.line{
width: 20px;
height: 3px;
display: inline-block;
position: absolute;
bottom: 2px;
background: #ff002a;
}
}
}
.detail{
display: inline-block;
color: #fff;
text-align: center;
cursor: pointer;
position: absolute;
right: 0px;
top: 5px;
width: 60px;
height: 25px;
line-height: 25px;
background: rgba(0, 0, 0, 0.4);
border-top-left-radius: 12px;
border-bottom-left-radius: 12px;
font-size:12px;
}
.performance_list{
display: flex;
font-size: 14px;
li{
width: 15%;
text-align: center;
line-height: 25px;
font-size: 12px;
color: #fff;
margin: 0 5px;
overflow: hidden;
}
li.markPrice{
color: #fff;
font-weight: bold;
font-size: 15px;
}
li:nth-child(1){
width: 8%;
text-align: left;
margin: 0;
}
li:nth-child(2),li:nth-child(3){
width: 26%;
text-align: right;
}
li:last-child{
width: 18%;
}
}
.activities{
display: flex;
font-size: 14px;
li{
width: 23%;
text-align: center;
line-height: 25px;
font-size: 12px;
color: #fff;
overflow: hidden;
}
li:nth-child(1),li:nth-child(2),li:nth-child(3){
width: 12%;
}
li.markPrice{
color: #fff;
font-weight: bold;
font-size: 15px;
}
}
.activities_grade{
color: #fff;
height: 38px;
line-height: 38px;
display: flex;
justify-content: space-between;
padding-right: 5px;
}
}
}
.notice{
background: #FFF;
padding: 0px 0px 0px 10px;
margin-top: 10px;
div{
display: flex;
align-items: center;
color: #737272;
height: 40px;
.iconfont{
font-size: 30px;
}
}
}
.tool_wrapper{
.tool_item{
display: flex;
flex-direction: column;
flex-wrap: wrap;
background: #fff;
box-shadow:0 0px 2.5px #eceaea;
border-radius: 6px;
margin-bottom: 10px;
padding: 7px 0px 0px 10px;
h3{
font-size: 16px;
margin-bottom: 10px;
}
.tool_content{
display: flex;
justify-content: space-between;
margin-bottom: 10px;
flex-wrap: wrap;
.content_item{
display: flex;
flex-direction: column;
align-items: center;
width: 25%;
height: 60px;
margin-bottom: 10px;
.iconfont{
color: #ff002a;
font-size: 26px;
}
}
}
}
}
.hotProduct{
margin: 10px auto;
background: #fff;
box-shadow: 0 0px 2.5px #eceaea;
border-radius: 6px;
margin-bottom: 10px;
padding: 7px 10px 0px 10px;
h3{
font-weight: normal;
font-size: 16px;
}
.media {
position: relative;
width: 100%;
display: flex;
justify-content: space-between;
align-items: flex-start;
cursor: pointer;
padding-bottom: 15px;
}
.media-left {
width: 30%;
padding-right: 10px;
.yd_logo {
padding: 8px;
background: rgba(114, 209, 196, 0.18);
margin-top: -5px;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
}
}
.media-body {
width: 75%;
}
.summaryBox {
justify-content: space-between;
}
.priceContainer {
width: 100%;
display: flex;
justify-content: space-between;
align-items: flex-end;
line-height: 1;
margin-top: 5px;
span {
font-size: 12px;
color: #e56124;
}
.price {
display: flex;
font-size: 22px;
margin-right: 15px;
color: #e56124;
justify-content: space-between;
align-items: flex-end;
}
}
.media-heading {
display: flex;
justify-content: space-between;
align-items: flex-start;
color: #4a4a4a;
}
h4 {
font-size: 15px;
margin: 0;
width: 85%;
}
.companylogo {
width: 70px;
height: 26px;
margin-top: -1px;
font-size: 12px;
}
.logoBox {
width: 100%;
height: 100%;
display: inline-block;
}
}
.health_wrapper{
background: #fff;
box-shadow: 0 0px 2.5px #eceaea;
border-radius: 6px;
margin-bottom: 10px;
padding: 7px 10px 10px 10px;
h3{
font-weight: normal;
font-size: 16px;
margin-bottom:8px;
}
}
}
.thankWrapper{
width: 95%;
height: 50%;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
text-align: center;
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MyCenterHomeComponent } from './my-center-home.component';
describe('MyCenterHomeComponent', () => {
let component: MyCenterHomeComponent;
let fixture: ComponentFixture<MyCenterHomeComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MyCenterHomeComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MyCenterHomeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import { Router, ActivatedRoute } from "@angular/router";
import { LifeCommonService } from "../../common/life-common.service";
import { environment } from "../../../environments/environment";
import { MyService } from "../my.service";
import { Plans } from '../../domain/plans';
import { User } from '../../domain/user';
import { LocalStorage } from '../../domain/local.storage';
declare var wx: any;
@Component({
selector: 'ydlife-my-center-home',
templateUrl: './my-center-home.component.html',
styleUrls: ['./my-center-home.component.scss'],
})
export class MyCenterHomeComponent implements OnInit, AfterViewInit {
@ViewChild('hide') hide: ElementRef
menuLists: Array<any>;
isNeedAlert: boolean;
dialogInfo: any;
lifeCustomerInfo: any;
deviceType: number;
announcementLists: Array<any>;
firstAnnouncement: string;
performanceList: Array<any>;
performanceSelectedFlag: string;
leftWidth: any;
products: Plans[];
productInfo: Plans;
inquiry: User;
firstAnnouncementTitle: string;
//判断是否显示我的团队
isShow: boolean;
onlineInfo: any;
offlineInfo: any;
activities_grade: any;
constructor(
private router: Router,
public lifeCommonService: LifeCommonService,
private myService: MyService,
private ls: LocalStorage,
private activatedRoute: ActivatedRoute,
) {
}
ngOnInit() {
const title = this.activatedRoute.snapshot.data[0]['title'];
this.lifeCommonService.setTitle(title);
this.deviceType = this.lifeCommonService.checkDeviceType();
this.lifeCustomerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo')) ? JSON.parse(localStorage.getItem('lifeCustomerInfo')) : null;
this.announcementQuery();
this.performanceList = [
{ name: '本月', time: 1 },
{ name: '季度', time: 3 },
{ name: '本年度', time: 2 }
]
//初始化调本月线上 保费+ 本月线下保费
this.rank(1, 1, 1)
this.rank(1, 2, 1)
this.recommendPlanQuery();
//判断是否团队长
this.subordinateSystemMemberQuery();
this.opportunityStatistics();
}
ngAfterViewInit() {
setTimeout(() => {
this.firstAnnouncementTitle = this.getStr(this.hide.nativeElement.innerText, '32')
}, 400);
}
getMenuList() {
this.menuLists = [
{
title: '营销工具',
content: [
{ no: 2, subtitle: 'AI保险医生', icon: 'icon-AI', path: `https://${window.location.host}/questionnaire/#/index?campaign=AIRobot&task=AItask1&customerId=${this.lifeCustomerInfo.customerId}`, routerLink: '' },
{ no: 1, subtitle: '獴哥保险诊所', icon: 'icon-zhensuozhongxin', path: `https://${window.location.host}/consulting`, routerLink: '' },
{ no: 4, subtitle: '线上投保', icon: 'icon-yidonghulianwang2', path: `https://${window.location.host}/index?source=dyd`, routerLink: '' },
{ no: 13, subtitle: '我的商机', icon: 'icon-xiansuo1', path: '', routerLink: 'business' },
{ no: 9, subtitle: '我的名片', icon: 'icon-zhiyezhenghao', path: `https://${window.location.host}/brokerQry/#/brokerDetail/${this.lifeCustomerInfo.practitionerId}?source=0`, routerLink: '' },
{ no: 10, subtitle: '职业类别', icon: 'icon-zhiye', path: 'https://www.ydinsurance.cn/occupationQry/', routerLink: '' },
{ no: 7, subtitle: '文章分享', icon: 'icon-fenxiangwenzhang', path: `https://${window.location.host}/discovery`, routerLink: '' },
{ no: 3, subtitle: '产品海报', icon: 'icon-haibao-1', path: '/salesDetail', routerLink: 'material' },
],
isShow: true
},
{
title: '我的团队',
content: [
{ no: 15, subtitle: '我的团队', icon: 'icon-tuandui', path: '', routerLink: '' },
// { no: 16, subtitle: '团队增员', icon: 'icon-tuanduiguanlisvg', path: '', routerLink: '' },
{ no: 16, subtitle: '团队增员', icon: 'icon-tuanduiguanlisvg', path: '', routerLink: 'recruiting' },
{ no: 18, subtitle: '招募海报', icon: 'icon-haibao-1', path: '', routerLink: '' },
{ no: '', subtitle: '', icon: '', path: '', routerLink: '' }
],
isShow: this.isShow
},
{
title: '教育培训',
content: [
{ no: 5, subtitle: '保险ABC', icon: 'icon-zidian', path: `https://${window.location.host}/issue`, routerLink: '' },
{ no: 6, subtitle: '培训课件', icon: 'icon-ziliaoku', path: '', routerLink: 'training' },
{ no: 11, subtitle: '文件下载', icon: 'icon-xiazai1', path: 'https://www.ydinsurance.cn/?page_id=13957', routerLink: 'fileUpload' },
{ no: 17, subtitle: '产品库', icon: 'icon-jingxuanchanpinku', path: 'https://www.ydinsurance.cn/?page_id=14331', routerLink: '' },
],
isShow: true
}, {
title: '我的展业',
content: [
{ no: 12, subtitle: '我的保单', icon: 'icon-baodanyangben', path: '', routerLink: '' },
{ no: 20, subtitle:'我的客户',icon:'icon-ren1',path:'',routerLink:''},
{ no: 14, subtitle: '我的佣金', icon: 'icon-yongjin', path: '', routerLink: '' },
{ no: 19, subtitle: '薪资单', icon: 'icon-xinzidan', path: '', routerLink: 'salary' }
],
isShow: true
}
];
}
// 菜单导航
menuNavigation(item) {
if (item.routerLink) {
this.router.navigate([`./${item.routerLink}`]);
} else if (item.path) {
window.open(item.path);
}
// else if (item.no === 9) {
// this.shareIdCard();
// }
else if (item.no === 12) {
this.router.navigate(['/salesDetail'], { queryParams: { searchType: this.performanceSelectedFlag, showType: 'orderform' } });
} else if (item.no === 14) {
this.router.navigate(['/salesDetail'], { queryParams: { searchType: this.performanceSelectedFlag, showType: 'sales' } });
} else if (item.no === 15) {
this.router.navigate(['/teamPanel'])
} else if (!item.subtitle) {
return;
} else if (item.no === 18) {
this.router.navigate(['/material'], { queryParams: { recruit: 'recruit' } });
} else {
this.isNeedAlert = true;
this.dialogInfo = {
title: null,
content: { value: '即将开发,敬请期待!', align: 'center' },
footer: [{ value: '我知道了', routerLink: '', className: 'weui-dialog__btn_primary' }],
};
}
}
// 关闭弹窗
getPopInfo() {
this.isNeedAlert = false;
}
// 分享名片
shareIdCard() {
const imgUrl = this.lifeCustomerInfo.practitionerBasicInfo.headImagePath ? this.lifeCustomerInfo.practitionerBasicInfo.headImagePath : `${environment.ORIGINNAME}/ydLife/assets/images/icons/meng.png`;
this.lifeCommonService.shareStatusPublish(1);
this.lifeCommonService.wxShare(
`银盾保险经纪 ${this.lifeCustomerInfo.practitionerBasicInfo.name}`,
'您的家庭保险专家、财务策划师。规划成就人生。',
`https://${window.location.host}/brokerQry/#/brokerDetail/${this.lifeCustomerInfo.practitionerId}`,
imgUrl);
}
announcementQuery() {
this.myService.announcementQuery(null, null).subscribe(res => {
if (res['success']) {
this.announcementLists = res['data']['announcementInfoList'];
this.firstAnnouncement = this.announcementLists[0]['title'];
}
});
}
getOut() {
localStorage.removeItem('lifeCustomerInfo');
this.router.navigate(['/login']);
}
/**
* time 1-month,2-year,3-季度
* type 1-保费,2-佣金 3-件数
* platform //1-online,2-offline
*/
rank(time, platform, type) {
this.performanceSelectedFlag = time;
const param = {
mobileNo: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['mobileNo'],
time: time,
platform: platform,
type: type
}
if (time == 1) {
this.leftWidth = '15%';
} else if (time == 2) {
this.leftWidth = '30%';
} else {
this.leftWidth = '17%';
}
this.myService.rank(param).subscribe((res) => {
if (res['success']) {
if (platform == 1) {
this.onlineInfo = res['data']['practitionerInfo'];
}
if (platform == 2) {
this.offlineInfo = res['data']['practitionerInfo'];
}
}
})
}
//截取字符串
getStr(str, len) {
if (!str) return "";
if (len <= 0) return "";
var templen = 0;
for (var i = 0; i < str.length; i++) {
if (str.charCodeAt(i) > 255) {
templen += 2;
} else {
templen++;
}
if (len == templen || len == templen + 1) {
return str.substring(0, i + 1) + '...';
} else if (templen > len + 1) {
return str.substring(0, i);
}
}
return str;
}
// 大家都在买产品查询列表
recommendPlanQuery() {
this.myService.queryproductlistbytag({ mdTagId: 97 }).subscribe(res => {
this.products = res['data'].plans;
})
}
// 点击产品进入详情页
goProductDetail(product: Plans): void {
this.productInfo = product;
this.productInfo.type = 2;
this.inquiry = {
planId: this.productInfo.planId,
adultCount: this.productInfo.adultCount,
childCount: this.productInfo.childCount,
eldCount: this.productInfo.eldCount,
dayCount: this.productInfo.minDay
};
this.setInitDate();
this.ls.setObject('inquiry', this.inquiry);
if (this.productInfo.noPlanProduct === true) {
window.location.href = `https://${window.location.host}/life/${this.productInfo.productId}`
} else {
if (this.productInfo.productCategoryId === 1 || this.productInfo.productCategoryId === 4) {
window.location.href = `https://${window.location.host}/pdetail/${this.productInfo.planId}`
} else if (this.productInfo.productCategoryId === 2) {
window.location.href = `https://${window.location.host}/hProductDetail/${this.productInfo.planId}?type=7`
} else if (this.productInfo.productCategoryId === 5) {
window.location.href = `https://${window.location.host}/hProductDetail/${this.productInfo.planId}?type=9`
} else {
window.location.href = `https://${window.location.host}/life/${this.productInfo.productId}`
this.router.navigate(['/pdetail', this.productInfo.planId]);
}
}
}
// 根据开始时间设置结束时间,天数应减1,当日~当日是一天
setInitDate() {
this.productInfo.dayCount = this.lifeCommonService.yearDayCount(this.productInfo.dayCount, this.productInfo.insurerId == '5');
this.lifeCommonService.setInitDate(this.productInfo.dayCount);
}
jumpUrl() {
window.location.href = `https://${window.location.host}/mk/ydviphexincoupon`
}
jumpToDetail() {
this.router.navigate(['/rank'], { queryParams: { time: this.performanceSelectedFlag } });
}
//查询是否团队长
subordinateSystemMemberQuery() {
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.subordinateSystemMemberQuery({ practitionerId: practitionerId, time: 1 }).subscribe((res) => {
if (res['success']) {
this.isShow = true;
sessionStorage.setItem('isTeamleader', '1');
sessionStorage.setItem('subordinateSystemName', res['data']['subordinateSystemName'])
this.getMenuList();
} else {
this.isShow = false;
sessionStorage.setItem('isTeamleader', '0')
this.getMenuList();
}
})
}
//经纪人商机分数统计
opportunityStatistics() {
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.opportunityStatistics({ practitionerId: practitionerId }).subscribe((res) => {
if (res['success']) {
this.activities_grade = res['data'];
} else {
this.activities_grade = null;
}
})
}
}
<div class="wrapper">
<div class="item" [routerLink]="['/thanks']">
<span>银盾保险经纪董事长欢迎信</span>
<div class="content">
<span class="iconfont icon-ar-r"></span>
</div>
</div>
</div>
\ No newline at end of file
.wrapper{
position: relative;
width: 100%;
height: 100%;
padding: 10px 5px;
background: #efefef;
.item{
height: 60px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
width: 95%;
margin: 10px auto;
background: #fff;
box-shadow:0 0px 3.5px #eceaea;
border-radius: 6px;
.switch{
.iconfont{
color: #ff002a;
font-size: 18px;
}
}
img{
width: 35px;
height: 35px;
margin-right: 10px;
}
}
.lifeList{
display: flex;
>div{
width: 50%;
background-color: #ddd;
flex: 1;
border-right: 3px solid #fff;
img{
display: block;
max-width: 100%;
height: auto;
}
}
>div:last-child{
border: none;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MyNewsComponent } from './my-news.component';
describe('MyNewsComponent', () => {
let component: MyNewsComponent;
let fixture: ComponentFixture<MyNewsComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MyNewsComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MyNewsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'ydlife-my-news',
templateUrl: './my-news.component.html',
styleUrls: ['./my-news.component.scss']
})
export class MyNewsComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MyCenterHomeComponent } from './my-center-home/my-center-home.component';
import { AuthGuard } from '../auth/auth.guard';
import { MkMaterialComponent } from './mk-material/mk-material.component';
import { MkMaterialDetailComponent } from './mk-material-detail/mk-material-detail.component';
import { FileUploadComponent } from './file-upload/file-upload.component';
import { ImportantAnnouncementComponent } from './important-announcement/important-announcement.component';
import { SalesDetailComponent } from './sales-detail/sales-detail.component';
import { AnnouncementDetailComponent } from './announcement-detail/announcement-detail.component';
import { MyBusinessComponent } from './my-business/my-business.component';
import { MyBusinessDetailComponent } from './my-business-detail/my-business-detail.component';
import { SalesRankComponent } from './sales-rank/sales-rank.component';
import { TeamRankComponent } from './team-rank/team-rank.component';
import { RecruitingComponent } from './recruiting/recruiting.component';
import { RecruitingDetailComponent } from './recruiting-detail/recruiting-detail.component';
import { ThanksComponent } from './thanks/thanks.component';
import { MySettingComponent } from './my-setting/my-setting.component';
import { MySettingDetailComponent } from './my-setting-detail/my-setting-detail.component';
import { MyNewsComponent } from './my-news/my-news.component';
import { MyTargetComponent } from "./my-target/my-target.component";
import { TeamPanelComponent } from './team-panel/team-panel.component';
import { TeamSalesScoreComponent } from './team-sales-score/team-sales-score.component';
import { ScoreDetailsComponent } from './score-details/score-details.component';
import { BusinessCardComponent } from "./business-card/business-card.component";
import { OrderDetailComponent } from './order-detail/order-detail.component';
import { SalaryComponent } from './salary/salary.component';
const myRoutes: Routes = [
{ path: '', component: MyCenterHomeComponent, canActivate: [AuthGuard], data: [{ title: '银盾保险经纪 - 工作台' }] },
{ path: 'material', component: MkMaterialComponent, canActivate: [AuthGuard] },
{ path: 'material/:itemId', component: MkMaterialDetailComponent, canActivate: [AuthGuard] },
{ path: 'fileUpload', component: FileUploadComponent, canActivate: [AuthGuard], data: [{ type: 'fileUpload' }] },
{ path: 'training', component: FileUploadComponent, canActivate: [AuthGuard], data: [{ type: 'training' }] },
{ path: 'importantAnnouncement', component: ImportantAnnouncementComponent, canActivate: [AuthGuard] },
{ path: 'salesDetail', component: SalesDetailComponent, canActivate: [AuthGuard] },
{ path: 'importantAnnouncement/:id', component: AnnouncementDetailComponent, canActivate: [AuthGuard] },
{ path: 'business', component: MyBusinessComponent, canActivate: [AuthGuard] },
{ path: 'business/:id', component: MyBusinessDetailComponent, canActivate: [AuthGuard] },
{ path: 'rank', component: SalesRankComponent, canActivate: [AuthGuard] },
{ path: 'teamRank', component: TeamRankComponent, canActivate: [AuthGuard] },
{ path: 'recruiting', component: RecruitingComponent, canActivate: [AuthGuard] },
{ path: 'recruiting/:id', component: RecruitingDetailComponent, canActivate: [AuthGuard] },
{ path: 'thanks', component: ThanksComponent, canActivate: [AuthGuard] },
{ path: 'setting', component: MySettingComponent, canActivate: [AuthGuard] },
{ path: 'setting/:uploadType', component: MySettingDetailComponent, canActivate: [AuthGuard] },
{ path: 'news', component: MyNewsComponent, canActivate: [AuthGuard] },
{ path: 'target', component: MyTargetComponent, canActivate: [AuthGuard] },
{ path: 'teamPanel', component: TeamPanelComponent, canActivate: [AuthGuard] },
{ path: 'teamPanel/:type', component: TeamSalesScoreComponent, canActivate: [AuthGuard] },
{ path: 'scoreDeatil', component: ScoreDetailsComponent, canActivate: [AuthGuard] },
{ path: 'businessCard', component: BusinessCardComponent, canActivate: [AuthGuard] },
{ path: 'orderDetail', component: OrderDetailComponent, canActivate: [AuthGuard] },
{ path: 'salary', component: SalaryComponent, canActivate: [AuthGuard] }
];
@NgModule({
imports: [RouterModule.forChild(myRoutes)],
exports: [RouterModule]
})
export class MyRoutingModule {
}
<div class="wrapper_pic">
<div class="picItem headPic" *ngIf="this.uploadType =='headUrl'">
<div class="pic">
<img *ngIf="settingInfo.headImgUrl" src="{{settingInfo.headImgUrl}}" />
</div>
<div *ngIf="settingInfo.headImgUrl" (click)="chooseImg('headImgUrl','','','change')">更换头像</div>
</div>
<div style="margin-top: 10px;" *ngIf="this.uploadType =='headUrl'">上传头像时图片比例必须1:1</div>
<!--上传头像-->
<div class="saveBtn" *ngIf="uploadType=='headUrl' && settingInfo.headImgUrl" (click)="mySettingSave()">确定</div>
<div *ngIf="uploadType =='headUrl' && !settingInfo.headImgUrl" class="add"
(click)="chooseImg('headImgUrl','','','add')">
<i class="iconfont icon-jiahao"></i>
</div>
<div class="picItem wxPic" *ngIf="this.uploadType =='wxUrl'">
<div class="pic">
<img *ngIf="settingInfo.wxQRImgUrl" src="{{settingInfo.wxQRImgUrl}}" />
</div>
<div *ngIf="settingInfo.wxQRImgUrl" (click)="chooseImg('wxQRImgUrl','','','change')">更换微信二维码</div>
</div>
<div style="margin-top: 10px;" *ngIf="this.uploadType =='wxUrl'">上传微信二维码时图片比例必须1:1</div>
<!-- 上传二维码 -->
<div class="saveBtn" *ngIf="uploadType=='wxUrl' && settingInfo.wxQRImgUrl" (click)="mySettingSave()">确定</div>
<div *ngIf="this.uploadType =='wxUrl' && !settingInfo.wxQRImgUrl" class="add"
(click)="chooseImg('wxQRImgUrl','','','add')">
<i class="iconfont icon-jiahao"></i>
</div>
<div class="picItem lifePic" *ngIf="this.uploadType =='lifeUrl'">
<div class="lifePicItem" *ngFor="let lifeImgUrlItem of settingInfo.lifeImgUrls;index as i;">
<div class="pic">
<img src="{{lifeImgUrlItem.lifeImgUrl}}" />
</div>
<div class="delete">
<div *ngIf="lifeImgUrlItem.lifeImgUrl" (click)="chooseImg('lifeImgUrl',i,lifeImgUrlItem.id)">更新
</div>
<div *ngIf="lifeImgUrlItem.lifeImgUrl" (click)="myImgDelete(lifeImgUrlItem.id,i,'deletePic')">
<span class="iconfont icon-shanchu1" style="font-size: 28px;color: #a5a2a2;"></span>
</div>
</div>
</div>
</div>
<div *ngIf="this.uploadType =='lifeUrl'" class="add" (click)="chooseImg('lifeImgUrl')">
<i class="iconfont icon-jiahao"></i>
</div>
<div style="margin-top: 10px;" *ngIf="this.uploadType =='lifeUrl'">
上传生活照时图片比例必须4:3</div>
<!-- 上传生活照 -->
<div class="saveBtn" *ngIf="uploadType=='lifeUrl' && settingInfo.lifeImgUrls?.length>0" (click)="mySettingSave()">确定
</div>
<div class="picItem introduction" *ngIf="this.uploadType=='introduction'">
<div style="height: 30px;font-size: 20px;margin-bottom: 20px;">自我介绍</div>
<textarea class="form-control" rows="10" [(ngModel)]="settingInfo.bioIntro" placeholder="赶紧介绍一下你自己吧!"
maxlength="200" style="border: none;" (keydown)="controlWord($event)"></textarea>
<span class="maxWord">{{ 200- (settingInfo.bioIntro)?.length}}</span>
<div class="saveBtn" (click)="mySettingSave()">确定</div>
</div>
<div class="picItem switch" *ngIf="this.uploadType =='switch'">
<div class="switchItem">
<div class="title">
<span>显示手机号</span>
<span class="tips">在海报和名片上显示手机号</span>
</div>
<div class="iconfont icon-kaiguanswitch-jibenzhuangtai-dianliangzhuangtai-copy" *ngIf="settingInfo.isMobileShow"
(click)="settingInfo.isMobileShow =0" style="color: #ff002a;">
</div>
<div class="iconfont icon-kaiguanswitch-jibenzhuangtai-dianliangzhuangtai" *ngIf="!settingInfo.isMobileShow"
(click)="settingInfo.isMobileShow =1" style="color: #e9e9eb"></div>
</div>
<div class="switchItem">
<div class="title">
<span> 显示姓名</span>
<span class="tips">在海报和名片上显示姓名</span>
</div>
<div class="iconfont icon-kaiguanswitch-jibenzhuangtai-dianliangzhuangtai-copy" *ngIf="settingInfo.isNameShow"
(click)="settingInfo.isNameShow =0" style="color: #ff002a;"></div>
<div class="iconfont icon-kaiguanswitch-jibenzhuangtai-dianliangzhuangtai" *ngIf="!settingInfo.isNameShow"
(click)="settingInfo.isNameShow =1" style="color: #e9e9eb"></div>
</div>
<div class="saveBtn" (click)="mySettingSave()">确定</div>
</div>
</div>
<ydlife-alert *ngIf="isNeedAlert" [dialogInfo]="dialogInfo" (popInfo)="getPopInfo()"></ydlife-alert>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
\ No newline at end of file
.wrapper_pic{
width: 100%;
padding: 20px 5px;
text-align: center;
// background: #efefef;
.picItem{
.pic{
width: 100%;
margin: 10px auto;
img{
width: 90%;
margin: 0 auto;
max-width: 90%;
}
}
}
.lifePic{
.lifePicItem{
margin:0px auto 15px auto;
.delete{
display: flex;
justify-content: space-evenly;
height: 30px;
align-items: center;
}
}
}
.introduction{
position: relative;
padding: 0 5px;
.maxWord{
position: absolute;
right: 0;
}
}
.switch{
width: 100%;
padding: 5px 10px;
.switchItem{
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px #eceaea solid;
.title{
height: 60px;
font-size: 18px;
span{
width: 100%;
float: left;
text-align: left;
}
span.tips{
color: #a5a4a4;
font-size: 14px;
}
}
.iconfont{
font-weight: bold;
font-size: 24px;
}
}
}
.saveBtn{
padding: 8px 10px;
background: #ff002a;
color: #fff;
width: 40%;
border-radius: 20px;
text-align: center;
margin: 20px auto;
}
.add {
position: absolute;
.iconfont {
width: 55px;
height: 55px;
line-height: 55px;
border-radius: 50%;
position: fixed;
right: 10px;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
bottom: 30px;
font-size: 28px;
// color: #ff5933;
font-weight: bold;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MySettingDetailComponent } from './my-setting-detail.component';
describe('MySettingDetailComponent', () => {
let component: MySettingDetailComponent;
let fixture: ComponentFixture<MySettingDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MySettingDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MySettingDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { ChangeDetectorRef } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { SettingInfo } from '../../domain/settinginfo';
declare const wx: any;
@Component({
selector: 'ydlife-my-setting-detail',
templateUrl: './my-setting-detail.component.html',
styleUrls: ['./my-setting-detail.component.scss']
})
export class MySettingDetailComponent implements OnInit {
settingInfo: SettingInfo = new SettingInfo();
serverId: any;
thumbnailPath: any;
isNeedAlert: boolean;
dialogInfo: any;
uploadType: any;
//控制上传数量
uploadNumber: number;
lifeUrlLen: number;
//控制弹框
toastDialog: boolean;
toastInfo: any;
//暂存准备删除的图片
deleteList: Array<any> = [];
headFlag: boolean = false;
wxFlag: boolean = false;
constructor(private activateRoute: ActivatedRoute, private myService: MyService, private changeDetectorRef: ChangeDetectorRef) {
}
ngOnInit() {
this.uploadType = this.activateRoute.snapshot.paramMap.get('uploadType');
this.mySettingQuery();
}
//查询详情
mySettingQuery() {
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.mySettingQuery({ practitionerId: practitionerId }).subscribe((res) => {
if (res['success']) {
this.settingInfo = res['data'];
}
})
}
// 上传图片 add表示选了新的图片(可能是新增也可能是更换)
chooseImg(picType, rechoseIndex?: any, picId?: any, add?: any) {
if (picType == 'lifeImgUrl') {
if (this.settingInfo.lifeImgUrls.length >= 3) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '生活照只能有三张,请将之前的删除!',
timeout: 3000,
align: 'center'
};
return;
}
}
// 5.1 拍照、本地选图
const t = this;
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
this.localId = res.localIds[0]; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
const THIS = t;
wx.uploadImage({
localId: this.localId, // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (response) {
THIS.serverId = response.serverId; // 返回图片的服务器端ID
const m = {
mediaId: response.serverId,
origin: 'ydLife'
};
THIS.myService.mediaGet(m).subscribe(async e => {
if (e['success']) {
if (picType == 'headImgUrl') {
THIS.settingInfo.headImgUrl = e['data']['imgUrl'];
if (add == 'add' || add == 'change') {
THIS.headFlag = true;
} else {
THIS.headFlag = false;
}
}
if (picType == 'wxQRImgUrl') {
THIS.settingInfo.wxQRImgUrl = e['data']['imgUrl'];
if (add == 'add' || add == 'change') {
THIS.wxFlag = true;
} else {
THIS.wxFlag = false;
}
}
if (picType == 'lifeImgUrl') {
//传需要删除的图片位置
if (rechoseIndex || rechoseIndex == 0) {
//传了生活照id就是通过接口删除否则就是自己删除
if (picId) {
//暂存更换之前的图片
THIS.deleteList.push({ id: picId })
THIS.settingInfo.lifeImgUrls.splice(rechoseIndex, 1, { id: undefined, lifeImgUrl: e['data']['imgUrl'] });
} else {
THIS.settingInfo.lifeImgUrls.splice(rechoseIndex, 1);
THIS.settingInfo.lifeImgUrls.push({ id: undefined, lifeImgUrl: e['data']['imgUrl'] })
}
} else {
THIS.settingInfo.lifeImgUrls.push({ id: undefined, lifeImgUrl: e['data']['imgUrl'] })
}
}
THIS.changeDetectorRef.markForCheck();
THIS.changeDetectorRef.detectChanges();
} else {
alert(e['message'])
}
});
}
});
}
});
}
// 关闭弹窗
getPopInfo() {
this.isNeedAlert = false;
}
//删除图片
myImgDelete(picId, index?: any, deletePic?: any) {
if (picId) {
const param = {
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
fileId: Number(picId)
}
return new Promise((resolve, reject) => {
this.myService.myImgDelete(param).subscribe((res) => {
if (!res['success']) {
alert(res['message'])
} else {
if (deletePic == 'deletePic') {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '删除成功!',
timeout: 3000,
align: 'center'
};
this.mySettingQuery();
}
resolve(res)
}
})
})
} else {
this.settingInfo.lifeImgUrls.splice(index, 1);
this.changeDetectorRef.markForCheck();
this.changeDetectorRef.detectChanges();
}
}
//用户点击保存时才真删除
async mySettingSave() {
let param;
if (this.uploadType == 'headUrl') {
if (this.headFlag) {
param = {
settingSave: 'img',
headImgUrl: this.settingInfo.headImgUrl,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
lifeImgUrls: []
}
} else {
param = {
settingSave: 'img',
headImgUrl: undefined,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
lifeImgUrls: []
}
}
}
if (this.uploadType == 'wxUrl') {
if (this.wxFlag) {
param = {
settingSave: 'img',
wxQRImgUrl: this.settingInfo.wxQRImgUrl,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
lifeImgUrls: []
}
} else {
param = {
settingSave: 'img',
wxQRImgUrl: undefined,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
lifeImgUrls: []
}
}
}
if (this.uploadType == 'lifeUrl') {
//如果有暂存图片删除
if (this.deleteList.length > 0) {
for (let j = 0; j < this.deleteList.length; j++) {
await this.myImgDelete(this.deleteList[j]['id'])
}
}
let lifeImgUrlsParam = [];
for (let i = 0; i < this.settingInfo.lifeImgUrls.length; i++) {
if (!this.settingInfo.lifeImgUrls[i].id) {
lifeImgUrlsParam.push(this.settingInfo.lifeImgUrls[i]['lifeImgUrl'])
}
}
param = {
settingSave: 'img',
lifeImgUrls: lifeImgUrlsParam,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
}
}
if (this.uploadType == 'introduction') {
param = {
settingSave: 'intro',
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
bioIntro: this.settingInfo.bioIntro
}
}
if (this.uploadType == 'switch') {
param = {
settingSave: 'isShow',
isNameShow: this.settingInfo.isNameShow,
isMobileShow: this.settingInfo.isMobileShow,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
}
}
// alert(JSON.stringify(param))
this.myService.mySettingSave(param).subscribe((res) => {
if (res['success']) {
alert('保存成功!')
this.mySettingQuery();
setTimeout(() => {
if (this.uploadType == 'headUrl') {
const lifeCustomerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo')) ? JSON.parse(localStorage.getItem('lifeCustomerInfo')) : null;
lifeCustomerInfo.practitionerBasicInfo.headImagePath = this.settingInfo.headImgUrl;
localStorage.setItem('lifeCustomerInfo', JSON.stringify(lifeCustomerInfo))
}
}, 300)
} else {
alert(res['message']);
}
})
}
controlWord(event) {
if (this.settingInfo.bioIntro) {
if (this.settingInfo.bioIntro.length >= 200) {
// 删除:46 退格:8 回车:13
if (!(event.which == '46' || event.which == '8' || event.which == '13')) {
event.returnValue = false;
}
}
}
}
}
<div class="wrapper">
<div class="item" [routerLink]="['/setting','headUrl']">
<span>头像</span>
<div class="content">
<img style="border-radius: 50%;" *ngIf="settingInfo.headImgUrl" src="{{settingInfo.headImgUrl}}">
<span class="iconfont icon-ar-r"></span>
</div>
</div>
<div class="item" [routerLink]="['/setting','wxUrl']">
<span>微信二维码</span>
<div class="content">
<img *ngIf="settingInfo.wxQRImgUrl" src="{{settingInfo.wxQRImgUrl}}">
<span class="iconfont icon-ar-r"></span>
</div>
</div>
<div class="item" [routerLink]="['/setting','lifeUrl']">
<span>生活照</span>
<div class="content">
<span class="iconfont icon-ar-r"></span>
</div>
</div>
<div class="item" [routerLink]="['/setting','introduction']">
<span>自我介绍</span>
<div class="content">
<span class="iconfont icon-ar-r"></span>
</div>
</div>
<div class="item" [routerLink]="['/setting','switch']">
<span>个性设置</span>
<div class="content">
<span class="iconfont icon-ar-r"></span>
</div>
</div>
<div class="item" [routerLink]="['/target']">
<span>目标设置</span>
<div class="content">
<span class="iconfont icon-ar-r"></span>
</div>
</div>
<div class="saveBtn" (click)="getOut()">退出系统</div>
</div>
\ No newline at end of file
.wrapper{
position: relative;
width: 100%;
height: 100%;
padding: 10px 5px;
background: #efefef;
.item{
height: 60px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
width: 95%;
margin: 10px auto;
background: #fff;
box-shadow:0 0px 3.5px #eceaea;
border-radius: 6px;
.switch{
.iconfont{
color: #ff002a;
font-size: 18px;
}
}
img{
width: 35px;
height: 35px;
margin-right: 10px;
}
}
.lifeList{
display: flex;
>div{
width: 50%;
background-color: #ddd;
flex: 1;
border-right: 3px solid #fff;
img{
display: block;
max-width: 100%;
height: auto;
}
}
>div:last-child{
border: none;
}
}
.toast_bg{
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: 0 auto;
background: rgba(0, 0, 0, 0.6);
height: 100%;
text-align: center;
img{
width: 80%;
margin-top: 45%;
}
}
.saveBtn{
padding: 8px 10px;
border:1px solid #ff002a;
color: #ff002a;
width: 40%;
border-radius: 20px;
text-align: center;
margin: 20px auto;
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MySettingComponent } from './my-setting.component';
describe('MySettingComponent', () => {
let component: MySettingComponent;
let fixture: ComponentFixture<MySettingComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MySettingComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MySettingComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { SettingInfo } from '../../domain/settinginfo';
import { Router } from "@angular/router";
@Component({
selector: 'ydlife-my-setting',
templateUrl: './my-setting.component.html',
styleUrls: ['./my-setting.component.scss']
})
export class MySettingComponent implements OnInit {
settingInfo: SettingInfo = new SettingInfo();
constructor(
private myService: MyService, private router: Router) { }
ngOnInit() {
this.mySettingQuery();
}
mySettingQuery() {
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.mySettingQuery({ practitionerId: practitionerId }).subscribe((res) => {
if (res['success']) {
this.settingInfo = res['data'];
}
})
}
getOut() {
localStorage.removeItem('lifeCustomerInfo');
this.router.navigate(['/login']);
}
}
<div class="wrapper_target">
<div class="nav">
<ul class="tab">
<li (click)="searchType=1;this.salesTargetQuery(1)" [ngClass]="{selected:searchType===1}">销售目标</li>
<li (click)="searchType=2;salesTargetQuery(1)" [ngClass]="{selected:searchType===2}">销售活动量</li>
<li (click)="searchType=5;this.salesTargetQuery(2)" *ngIf="isTeamleader==='1'"
[ngClass]="{selected:searchType===5}">团队销售目标</li>
<!-- <li (click)="searchType=6;this.salesTargetQuery(2)" *ngIf="isTeamleader==='1'"
[ngClass]="{selected:searchType===6}">团队销售活动量</li> -->
<li (click)="searchType=3;potentialGoalsQuery();" *ngIf="isTeamleader==='1'"
[ngClass]="{selected:searchType===3}">
增员目标</li>
<li (click)="searchType=4;potentialGoalsActionsQuery()" *ngIf="isTeamleader==='1'"
[ngClass]="{selected:searchType===4}">增员活动量</li>
</ul>
</div>
<div class="content_target" *ngIf="searchType===1">
<div class="content_target_wrapper">
<div class="line">
<i class="iconfont icon-bianji" *ngIf="personalSalesReadonlyFlag" (click)="personalSalesReadonlyFlag = false;">
<span>编辑</span>
</i>
<i class="iconfont icon-save" *ngIf="!personalSalesReadonlyFlag" (click)="salesTargetSave(1)">
<span class="save">保存</span>
</i>
<div class="title">个人年度销售目标</div>
<div class="content_target_item">
<span>首年保费FYP</span>
<input class="form-control" type="text" [(ngModel)]="premium" (ngModelChange)="getMonthAverage('premium');"
(blur)="inputBlur()" placeholder="{{personalSalesReadonlyFlag?'暂无预计年保费':'请输入预计年保费'}}"
[disabled]="personalSalesReadonlyFlag" *ngIf="!personalSalesReadonlyFlag" />
<div *ngIf="personalSalesReadonlyFlag">{{premium | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>首年佣金FYC</span>
<input class="form-control" type="text" [(ngModel)]="commission"
(ngModelChange)="getMonthAverage('commission')" (blur)="inputBlur()"
placeholder="{{personalSalesReadonlyFlag?'暂无预计年佣金':'请输入预计年佣金'}}" [disabled]="personalSalesReadonlyFlag"
*ngIf="!personalSalesReadonlyFlag" />
<div *ngIf="personalSalesReadonlyFlag">{{commission | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>件均保费</span>
<input class="form-control" type="text" [(ngModel)]="pieceAveragePremium"
(ngModelChange)="getMonthAverage('pieceAveragePremium')" (blur)="inputBlur()"
*ngIf="!personalSalesReadonlyFlag" placeholder="{{personalSalesReadonlyFlag?'暂无件均保费':'请输入年度件均保费'}}"
[disabled]="personalSalesReadonlyFlag" />
<div *ngIf="personalSalesReadonlyFlag">{{pieceAveragePremium | number:'1.0-2'}}</div>
</div>
<div class="content_target_item" style="border-bottom: none;">
<span>成交件数(FYP/件均保费)</span>
<!-- <input class="form-control" type="text" [(ngModel)]="pieces" style="width: 40%;"
placeholder="{{personalSalesReadonlyFlag?'暂无预计成交件数':'FYP/年件均保费'}}" disabled /> -->
<div>{{pieces | number:'1.0-2'}}</div>
</div>
</div>
<div class="line">
<div class="title">个人月销售目标</div>
<div class="month_target_item_wrapper" *ngFor="let salesTargetMonthsItem of salesTargetMonths;index as idx">
<span class="dot" style="font-weight: bold;">{{salesTargetMonthsItem.monthNum}}月</span>
<div class="content_target_item">
<span>FYP</span>
<input type="text" class="form-control" placeholder="{{personalSalesReadonlyFlag?'暂无目标保费':'请输入目标保费'}}"
[(ngModel)]="salesTargetMonthsItem.premium" (ngModelChange)="changePremium(idx,'FYP');"
[disabled]="personalSalesReadonlyFlag" (blur)="inputBlur()" *ngIf="!personalSalesReadonlyFlag">
<div *ngIf="personalSalesReadonlyFlag">{{salesTargetMonthsItem.premium | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>FYC</span>
<input type="number" class="form-control" placeholder="{{personalSalesReadonlyFlag?'暂无目标佣金':'请输入目标佣金'}}"
[(ngModel)]="salesTargetMonthsItem.commission" (ngModelChange)="changePremium(idx,'FYC')"
[disabled]="personalSalesReadonlyFlag" (blur)="inputBlur()" *ngIf="!personalSalesReadonlyFlag">
<div *ngIf="personalSalesReadonlyFlag">{{salesTargetMonthsItem.commission | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>件数</span>
<input type="number" class="form-control" placeholder="件数" disabled
[(ngModel)]="salesTargetMonthsItem.pieces">
</div>
</div>
</div>
</div>
</div>
<div class="content_target" *ngIf="searchType===2">
<div class="content_target_wrapper">
<div class="line">
<i class="iconfont icon-bianji" *ngIf="personalSalesActivityFlag"
(click)="personalSalesActivityFlag = false;"><span>编辑</span></i>
<i class="iconfont icon-save" *ngIf="!readonlyFlag && salesTargetFlag && !personalSalesActivityFlag"
(click)="salesTargetMonthSave(1)">
<span class="save">保存</span>
</i>
<div class="title">月均销售活动量目标</div>
<div *ngIf="!salesTargetActions || salesTargetActions.length<=0" style="text-align: center;">请先设置销售目标</div>
<div class="content_target_item" *ngFor="let salesTargetActionItem of salesTargetActions">
<span>{{salesTargetActionItem.leadsActionName}}</span>
<input class="form-control" type="text" [(ngModel)]="salesTargetActionItem.actionStandards"
(blur)="inputBlur()" [disabled]="personalSalesActivityFlag" />
</div>
</div>
</div>
</div>
<div class="content_target" *ngIf="searchType===3">
<div class="content_target_wrapper">
<div class="line">
<i class="iconfont icon-bianji" *ngIf="recruitsReadonlyFlag"
(click)="recruitsReadonlyFlag = false;"><span>编辑</span></i>
<i class="iconfont icon-save" *ngIf="!recruitsReadonlyFlag" (click)="potentialGoalsSetting()">
<span class="save">保存</span>
</i>
<div class="title">年增员目标</div>
<div class="content_target_item">
<span>年度增员目标</span>
<input class="form-control" type="text" [(ngModel)]="numberRecruitsYear"
(ngModelChange)="getMonthRecruitsAverage('Recruits')" [disabled]="recruitsReadonlyFlag"
placeholder="{{readonlyFlag?'暂无年度增员目标':'请输入预计年度增员目标'}}" (blur)="inputBlur()" />
</div>
<div class="content_target_item" style="border-bottom: none;">
<span>MDRT数量</span>
<input class="form-control" type="text" [(ngModel)]="numberMDRTYear"
(ngModelChange)="getMonthRecruitsAverage('MDRT')" [disabled]="recruitsReadonlyFlag"
placeholder="{{readonlyFlag?'暂无年MDRT数量':'请输入预计年度MDRT数量'}}" (blur)="inputBlur()" />
</div>
</div>
<div class="line">
<div class="title">月增员目标</div>
<div class="month_target_item_wrapper" *ngFor="let recruitGoalForMonthItem of recruitGoalForMonthList">
<div class="content_target_item">
<span>{{recruitGoalForMonthItem.month}}月增员目标数</span>
<input type="number" class="form-control" placeholder="请输入增员目标数" [disabled]="recruitsReadonlyFlag"
[(ngModel)]="recruitGoalForMonthItem.numberRecruits" (ngModelChange)="changeMonthRecruit()"
(blur)="inputBlur()">
</div>
</div>
</div>
</div>
</div>
<div class="content_target" *ngIf="searchType===4">
<div class="content_target_wrapper">
<div class="line">
<i class="iconfont icon-bianji" *ngIf="recruitsActivityReadonlyFlag"
(click)="recruitsActivityReadonlyFlag = false;"><span>编辑</span></i>
<i class="iconfont icon-save" *ngIf="!readonlyFlag && recruitingTargetFlag && !recruitsActivityReadonlyFlag"
(click)="potentialGoalsActionsUpdate()"> <span class="save">保存</span></i>
<div class="title">月均增员活动量目标</div>
<div *ngIf="!goalsActionsInfoList || goalsActionsInfoList.length<=0" style="text-align: center;">请先设置增员目标</div>
<div class="content_target_item" *ngFor="let goalsActionsInfoItem of goalsActionsInfoList">
<span>{{goalsActionsInfoItem.potentialActionName}}</span>
<input type="number" style="width: 30%;" class="form-control"
[(ngModel)]="goalsActionsInfoItem.actionStandards" (blur)="inputBlur()"
[disabled]="recruitsActivityReadonlyFlag" />
</div>
</div>
</div>
</div>
<div class="content_target" *ngIf="searchType===5">
<div class="content_target_wrapper">
<div class="line">
<i class="iconfont icon-bianji" *ngIf="personalSalesReadonlyFlag"
(click)="personalSalesReadonlyFlag = false;"><span>编辑</span></i>
<i class="iconfont icon-save" *ngIf="!personalSalesReadonlyFlag" (click)="salesTargetSave(2)">
<span class="save">保存</span></i>
<div class="title">团队年度销售目标</div>
<div class="content_target_item">
<span>首年保费FYP</span>
<input class="form-control" type="text" [(ngModel)]="premium" (ngModelChange)="getMonthAverage('premium')"
placeholder="{{personalSalesReadonlyFlag?'暂无预计年保费':'请输入预计年保费'}}" [disabled]="personalSalesReadonlyFlag"
*ngIf="!personalSalesReadonlyFlag" />
<div *ngIf="personalSalesReadonlyFlag">{{premium | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>首年佣金FYC</span>
<input class="form-control" type="text" [(ngModel)]="commission"
(ngModelChange)="getMonthAverage('commission')" *ngIf="!personalSalesReadonlyFlag"
placeholder="{{personalSalesReadonlyFlag?'暂无预计年佣金':'请输入预计年佣金'}}" [disabled]="personalSalesReadonlyFlag" />
<div *ngIf="personalSalesReadonlyFlag">{{commission | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>件均保费</span>
<input class="form-control" type="text" [(ngModel)]="pieceAveragePremium"
(ngModelChange)="getMonthAverage('pieceAveragePremium')" *ngIf="!personalSalesReadonlyFlag"
placeholder="{{personalSalesReadonlyFlag?'暂无件均保费':'请输入年度件均保费'}}" [disabled]="personalSalesReadonlyFlag" />
<div *ngIf="personalSalesReadonlyFlag">{{pieceAveragePremium | number:'1.0-2'}}</div>
</div>
<div class="content_target_item" style="border-bottom: none;">
<span>成交件数(FYP/件均保费)</span>
<!-- <input class="form-control" type="text" [(ngModel)]="pieces" style="width: 40%;"
placeholder="{{personalSalesReadonlyFlag?'暂无预计成交件数':'FYP/年件均保费'}}" disabled /> -->
<div *ngIf="pieces">{{pieces | number:'1.0-2'}}</div>
<div *ngIf="!pieces">暂无预计成交件数</div>
</div>
</div>
<div class="line">
<div class="title">团队月销售目标</div>
<div class="month_target_item_wrapper" *ngFor="let salesTargetMonthsItem of salesTargetMonths;index as idx">
<span class="dot" style="font-weight: bold;">{{salesTargetMonthsItem.monthNum}}月</span>
<div class="content_target_item">
<span>FYP</span>
<input type="number" class="form-control" placeholder="{{personalSalesReadonlyFlag?'暂无目标保费':'请输入目标保费'}}"
[(ngModel)]="salesTargetMonthsItem.premium" (ngModelChange)="changePremium(idx,'FYP')"
[disabled]="personalSalesReadonlyFlag" *ngIf="!personalSalesReadonlyFlag">
<div *ngIf="personalSalesReadonlyFlag">{{salesTargetMonthsItem.premium | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>FYC</span>
<input type="number" class="form-control" placeholder="{{personalSalesReadonlyFlag?'暂无目标佣金':'请输入目标佣金'}}"
[(ngModel)]="salesTargetMonthsItem.commission" (ngModelChange)="changePremium(idx,'FYC')"
[disabled]="personalSalesReadonlyFlag" *ngIf="!personalSalesReadonlyFlag">
<div *ngIf="personalSalesReadonlyFlag">{{salesTargetMonthsItem.commission | number:'1.0-2'}}</div>
</div>
<div class="content_target_item">
<span>件数</span>
<input type="number" class="form-control" placeholder="件数" disabled
[(ngModel)]="salesTargetMonthsItem.pieces">
<!-- <div *ngIf="personalSalesReadonlyFlag">{{salesTargetMonthsItem.pieces | number:'1.0-2'}}</div> -->
</div>
</div>
</div>
</div>
</div>
<!-- <div class="content_target" *ngIf="searchType===6">
<div class="content_target_wrapper">
<div class="line">
<i class="iconfont icon-bianji" *ngIf="personalSalesActivityFlag"
(click)="personalSalesActivityFlag = false;"></i>
<i class="iconfont icon-save" *ngIf="!readonlyFlag && salesTargetFlag && !personalSalesActivityFlag"
(click)="salesTargetMonthSave(2)"></i>
<div class="title">月均销售活动量目标</div>
<div *ngIf="!salesTargetFlag" style="text-align: center;">请先设置销售目标</div>
<div class="content_target_item" *ngFor="let salesTargetActionItem of salesTargetActions">
<span>{{salesTargetActionItem.leadsActionName}}</span>
<input class="form-control" type="text" [(ngModel)]="salesTargetActionItem.actionStandards"
(blur)="inputBlur()" [disabled]="personalSalesActivityFlag" />
</div>
</div>
</div>
</div> -->
</div>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
\ No newline at end of file
ul li,ol li{
list-style: none;
}
.wrapper_target{
.nav{
overflow: hidden;
width: 100%;
overflow-x: auto;
.tab{
padding: 10px 2px;
margin-bottom: 10px;
float: left;
width: 130%;
overflow: hidden;
overflow-x: auto;
li {
border: 1px #a9aabb solid;
text-align: center;
font-size: 14px;
height: 30px;
line-height: 30px;
border-radius: 20px;
margin: 0px 2px;
float: left;
width: 19%;
h3{
font-weight: normal;
font-size: 16px;
}
}
li.selected{
background-color: #e10d0d;
color: #fff;
border: 1px #f0f0f0 solid;
// border: 1px #e10d0d solid;
}
}
}
.content_target{
.content_target_wrapper{
.line{
padding: 8px;
margin-bottom: 10px;
border-bottom: 1px #ddd solid;
position: relative;
.iconfont{
width: 55px;
height: 55px;
border-radius: 50%;
position: absolute;
right: 10px;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
top: -5px;
span{
font-size: 12px;
position: absolute;
left: 28%;
top: 60%;
}
}
// .iconfont.icon-bianji{
// line-height: 55px;
// }
.title{
font-size: 16px;
font-weight: bold;
margin: 10px 0 15px 0;
}
.content_target_item{
display: flex;
justify-content: space-between;
align-items: center;
margin: 0 0 5px 17px;
border-bottom: 1px #ddd solid;
div{
height: 34px;
padding: 6px 12px;
font-size: 18px;
opacity: .75;
}
input.form-control {
width: 65%;
background: none;
outline: none;
border: none;
text-align: right;
box-shadow: none;
display: flex;
flex-wrap: wrap;
font-size: 18px;
}
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control{
opacity:.75;
}
}
.month_target_item_wrapper{
margin-bottom: 15px;
.dot{
width: 35px;
height: 35px;
line-height: 35px;
background: #ff002a;
border-radius: 50%;
color: #fff;
display: block;
text-align: center;
margin-left: 10px;
}
}
.content_target_monthItem{
border: 1px #ddd solid;
display: flex;
border-right: none;
border-bottom: none;
// .month_target_left{
// display: flex;
// flex-wrap: wrap;
// flex:0 0 23%;
// border-right: 1px #ddd solid;
// .month_target{
// div {
// width: 92px;
// padding: 6px 12px;
// border-bottom: 1px #ddd solid;
// }
// }
// }
.month_target_right{
width: 100%;
display: flex;
flex-wrap: wrap;
// flex:0 0 75%;
// border-right: 1px #ddd solid;
ul {
width: 100%;
display: flex;
justify-content: space-between;
li{
width: 100%;
text-align: center;
border-right: 1px #ddd solid;
.month_target{
text-align: left;
div{
border-bottom: 1px #ddd solid;
}
div.month_target_item{
display: flex;
align-items: center;
span{
width: 40%;
}
}
.form-control{
background: none;
outline: none;
border: none;
box-shadow: none;
}
.count{
border-bottom: none;
}
}
}
}
// ul:nth-child(3n) li{
// border-right: none;
// }
}
}
}
.line:last-child{
border: none;
}
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MyTargetComponent } from './my-target.component';
describe('MyTargetComponent', () => {
let component: MyTargetComponent;
let fixture: ComponentFixture<MyTargetComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MyTargetComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MyTargetComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-my-target',
templateUrl: './my-target.component.html',
styleUrls: ['./my-target.component.scss']
})
export class MyTargetComponent implements OnInit {
//个人销售目标
personalSalesReadonlyFlag: boolean;
personalSalesActivityFlag: boolean;
//增员目标编辑
recruitsReadonlyFlag: boolean;
recruitsActivityReadonlyFlag: boolean;
searchType: any;
//判断是否团队长
isTeamleader: any;
salesTargetMonths: Array<any>;
practitionerId: any;
//个人保费
premium: any;
//个人佣金
commission: any;
//个人件数
pieces: any;
//个人件平均保费
pieceAveragePremium: any;
recruitGoalForMonthList: Array<any>;
numberRecruitsYear: number;
numberMDRTYear: number;
//控制弹框
toastDialog: boolean;
toastInfo: any;
//月均销售活动量得分
salesTargetActions: Array<any>;
//增员活动量得分
goalsActionsInfoList: Array<any>;
salesTargetFlag: boolean = true;
recruitingTargetFlag: boolean = true;
money: any;
constructor(private myService: MyService) { }
ngOnInit() {
this.searchType = 1;
this.isTeamleader = sessionStorage.getItem('isTeamleader');
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
//初始化查个人销售目标
this.salesTargetQuery(1);
}
//销售目标保存
salesTargetSave(goalsType) {
const salesTargetParam = {
practitionerId: this.practitionerId,
pieceAveragePremium: this.pieceAveragePremium,
pieces: this.pieces,
premium: Number(this.premium),
commission: this.commission,
salesTargetMonths: this.salesTargetMonths,
goalsType: goalsType
}
for (let i = 0; i < this.salesTargetMonths.length; i++) {
if (!this.salesTargetMonths[i]['premium'] && this.salesTargetMonths[i]['premium'] != 0) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: `请输入${this.salesTargetMonths[i]['monthNum']}月预计保费!`,
timeout: 3000,
align: 'center'
};
return;
}
if (!this.salesTargetMonths[i]['commission'] && this.salesTargetMonths[i]['commission'] != 0) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: `请输入${this.salesTargetMonths[i]['monthNum']}月预计佣金!`,
timeout: 3000,
align: 'center'
};
return;
}
if (!this.salesTargetMonths[i]['pieceAveragePremium'] && this.salesTargetMonths[i]['pieceAveragePremium'] != 0) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: `请输入${this.salesTargetMonths[i]['monthNum']}月件均保费!`,
timeout: 3000,
align: 'center'
};
return;
}
}
this.myService.salesTargetSave(salesTargetParam).subscribe((res) => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '保存成功!',
timeout: 3000,
align: 'center'
};
this.salesTargetQuery(goalsType);
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
//查询销售目标
salesTargetQuery(goalsType) {
this.myService.salesTargetQuery({ practitionerId: this.practitionerId, goalsType: goalsType }).subscribe((res) => {
if (res['success']) {
if (res['data']['salesTargetMonths'].length > 0) {
this.salesTargetMonths = res['data']['salesTargetMonths'];
this.salesTargetFlag = true;
this.personalSalesReadonlyFlag = true;
this.personalSalesActivityFlag = true;
} else {
this.initSalesTargetMonths();
this.salesTargetFlag = false;
this.personalSalesReadonlyFlag = false;
this.personalSalesActivityFlag = false;
}
this.commission = res['data']['commission'];
this.pieceAveragePremium = res['data']['pieceAveragePremium'];
this.pieces = res['data']['pieces'];
this.premium = res['data']['premium'];
this.salesTargetActions = res['data']['salesTargetActions'];
} else {
this.commission = this.pieceAveragePremium = this.pieces = this.premium = null;
this.salesTargetFlag = false;
this.initSalesTargetMonths()
}
})
}
//修改平均值获取新的年度目标
changePremium(idx,type) {
let premium = 0;
let commission = 0;
for (let i = 0; i < this.salesTargetMonths.length; i++) {
premium += Number(this.salesTargetMonths[i]['premium']);
commission += Number(this.salesTargetMonths[i]['commission']);
}
this.premium = premium;
this.commission = commission;
if (this.premium && this.pieceAveragePremium) {
this.pieces = Math.ceil(this.premium / this.pieceAveragePremium);
}
if(type=='FYP' || type=='FYC'){
let totalPiece = 0;
for(let j=0;j<this.salesTargetMonths.length;j++){
this.salesTargetMonths[idx]['pieces'] = Math.ceil(Number(this.salesTargetMonths[idx]['premium'])/Number(this.salesTargetMonths[idx]['pieceAveragePremium']));
totalPiece += Number(this.salesTargetMonths[j]['pieces']);
}
this.pieces = totalPiece;
}
}
//获取月销售平均值
getMonthAverage(type) {
this.salesTargetMonths.forEach(item => {
if (type === 'premium') {
item.premium = Math.ceil(this.premium / 12);
}
if (type === 'commission') {
item.commission = Math.ceil(this.commission / 12);
}
if (type === 'pieceAveragePremium') {
item.pieceAveragePremium = this.pieceAveragePremium;
}
if(type!='commission'){
if (item.premium && Number(item.pieceAveragePremium)) {
item.pieces = Math.ceil((this.premium / this.pieceAveragePremium) / 12);
} else {
item.pieces = 0;
}
}
});
if(type!='commission'){
if (this.premium && Number(this.pieceAveragePremium)) {
this.pieces = Math.ceil(this.premium / this.pieceAveragePremium);
} else {
this.pieces = 0;
}
}
}
//月活动量保存
salesTargetMonthSave(goalsType) {
const param = {
practitionerId: this.practitionerId,
salesTargetActionsList: this.salesTargetActions,
goalsType: goalsType
}
this.myService.salesTargetMonthSave(param).subscribe((res) => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '保存成功!',
timeout: 3000,
align: 'center'
};
this.salesTargetQuery(goalsType);
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
//增员目标保存
potentialGoalsSetting() {
const recruitingParam = {
practitionerId: this.practitionerId,
numberRecruitsYear: this.numberRecruitsYear,
numberMDRTYear: this.numberMDRTYear,
recruitGoalForMonthList: this.recruitGoalForMonthList
}
this.myService.potentialGoalsSetting(recruitingParam).subscribe((res) => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '保存成功!',
timeout: 3000,
align: 'center'
};
this.potentialGoalsQuery();
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
//增员目标查询接口
potentialGoalsQuery() {
this.myService.potentialGoalsQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
if (res['success']) {
this.numberRecruitsYear = res['data']['numberRecruitsYear'];
this.numberMDRTYear = res['data']['numberMDRTYear'];
if (res['data']['recruitGoalForMonthList'].length > 0) {
this.recruitGoalForMonthList = res['data']['recruitGoalForMonthList'];
this.recruitingTargetFlag = true;
this.recruitsReadonlyFlag = true;
} else {
this.initRecruitGoalForMonthList();
this.recruitingTargetFlag = false;
this.recruitsReadonlyFlag = false;
}
} else {
this.numberRecruitsYear = null;
this.numberMDRTYear = null;
this.recruitingTargetFlag = false;
this.initRecruitGoalForMonthList();
}
})
}
//获取月平均增员数
getMonthRecruitsAverage(type) {
this.recruitGoalForMonthList.forEach(item => {
if (type === 'Recruits') {
item.numberRecruits = Math.ceil(this.numberRecruitsYear / 12);
}
if (type === 'MDRT') {
item.numberMDRT = Math.ceil(this.numberMDRTYear / 12);
}
});
}
//获取总增员数
changeMonthRecruit() {
let numberRecruitsYear = 0;
let numberMDRTYear = 0;
for (let i = 0; i < this.recruitGoalForMonthList.length; i++) {
numberRecruitsYear += this.recruitGoalForMonthList[i]['numberRecruits'];
numberMDRTYear += this.recruitGoalForMonthList[i]['numberMDRT'];
}
this.numberRecruitsYear = numberRecruitsYear;
this.numberMDRTYear = numberMDRTYear;
}
//增员活动量查询
potentialGoalsActionsQuery() {
this.myService.potentialGoalsActionsQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
if (res['success']) {
if (res['data']['goalsActionsInfoList']) {
this.goalsActionsInfoList = res['data']['goalsActionsInfoList'];
this.recruitsActivityReadonlyFlag = true;
} else {
this.recruitsActivityReadonlyFlag = false;
this.goalsActionsInfoList = [];
}
} else {
this.goalsActionsInfoList = [];
this.recruitsActivityReadonlyFlag = false;
}
})
}
//增员活动量更新
potentialGoalsActionsUpdate() {
const RecruitActionParam = {
practitionerId: this.practitionerId,
goalsActionsInfoList: this.goalsActionsInfoList
}
this.myService.potentialGoalsActionsUpdate(RecruitActionParam).subscribe((res) => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '保存成功!',
timeout: 3000,
align: 'center'
};
this.potentialGoalsActionsQuery();
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
inputBlur() {
window.scrollTo(0, 0)
}
//初始化增员目标
initRecruitGoalForMonthList() {
this.recruitGoalForMonthList = [
{ numberMDRT: null, numberRecruits: null, month: 1 },
{ numberMDRT: null, numberRecruits: null, month: 2 },
{ numberMDRT: null, numberRecruits: null, month: 3 },
{ numberMDRT: null, numberRecruits: null, month: 4 },
{ numberMDRT: null, numberRecruits: null, month: 5 },
{ numberMDRT: null, numberRecruits: null, month: 6 },
{ numberMDRT: null, numberRecruits: null, month: 7 },
{ numberMDRT: null, numberRecruits: null, month: 8 },
{ numberMDRT: null, numberRecruits: null, month: 9 },
{ numberMDRT: null, numberRecruits: null, month: 10 },
{ numberMDRT: null, numberRecruits: null, month: 11 },
{ numberMDRT: null, numberRecruits: null, month: 12 }
]
}
//初始化商机目标
initSalesTargetMonths() {
this.salesTargetMonths = [
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 1 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 2 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 3 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 4 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 5 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 6 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 7 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 8 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 9 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 10 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 11 },
{ premium: null, commission: null, pieces: null, pieceAveragePremium: null, monthNum: 12 }
]
}
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DatePipe } from "@angular/common";
import { MyRoutingModule } from './my-routing.module';
import { MyCenterHomeComponent } from './my-center-home/my-center-home.component';
import { LifeCommonModule } from "../common/life-common.module";
import { MkMaterialComponent } from './mk-material/mk-material.component';
import { MkMaterialDetailComponent } from './mk-material-detail/mk-material-detail.component';
import { FileUploadComponent } from './file-upload/file-upload.component';
import { ImportantAnnouncementComponent } from './important-announcement/important-announcement.component';
import { SalesDetailComponent } from './sales-detail/sales-detail.component';
import { AnnouncementDetailComponent } from './announcement-detail/announcement-detail.component';
import { MyBusinessComponent } from './my-business/my-business.component';
import { MyBusinessDetailComponent } from './my-business-detail/my-business-detail.component';
import { PickerComponent } from '../common/picker/picker.component';
import { ToastComponent } from '../common/toast/toast.component';
import { SalesRankComponent } from './sales-rank/sales-rank.component';
import { TeamRankComponent } from './team-rank/team-rank.component';
import { RecruitingComponent } from './recruiting/recruiting.component';
import { RecruitingDetailComponent } from './recruiting-detail/recruiting-detail.component';
import { ThanksComponent } from './thanks/thanks.component';
import { MySettingComponent } from './my-setting/my-setting.component';
import { MySettingDetailComponent } from './my-setting-detail/my-setting-detail.component';
import { MyNewsComponent } from './my-news/my-news.component';
import { MyTargetComponent } from './my-target/my-target.component';
import { TeamPanelComponent } from './team-panel/team-panel.component';
import { SwitchNumberPipe } from '../common/pipe/switch-number.pipe';
import { TeamSalesScoreComponent } from './team-sales-score/team-sales-score.component';
import { ScoreDetailsComponent } from './score-details/score-details.component';
import { BusinessCardComponent } from './business-card/business-card.component';
import { OrderDetailComponent } from './order-detail/order-detail.component';
import { SalaryComponent } from './salary/salary.component';
@NgModule({
declarations: [MyCenterHomeComponent, MkMaterialComponent, MkMaterialDetailComponent, FileUploadComponent, ImportantAnnouncementComponent, SalesDetailComponent, AnnouncementDetailComponent, MyBusinessComponent, MyBusinessDetailComponent, PickerComponent, ToastComponent, SalesRankComponent, TeamRankComponent, RecruitingComponent, RecruitingDetailComponent, ThanksComponent, MySettingComponent, MySettingDetailComponent, MyNewsComponent, MyTargetComponent, TeamPanelComponent, SwitchNumberPipe, TeamSalesScoreComponent, ScoreDetailsComponent, BusinessCardComponent, OrderDetailComponent, SalaryComponent],
imports: [
CommonModule,
LifeCommonModule,
MyRoutingModule,
],
providers: [
DatePipe
]
})
export class MyModule {
}
import { TestBed } from '@angular/core/testing';
import { MyService } from './my.service';
describe('MyService', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: MyService = TestBed.get(MyService);
expect(service).toBeTruthy();
});
});
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { environment } from '../../environments/environment';
@Injectable({
providedIn: 'root'
})
export class MyService {
constructor(private http: HttpClient) {
}
private API = environment.BACKEND_URL_CONFIG_VALUE;
private ydapi = environment.ORIGINNAME;
// 保存分享码
shareCallBack(shareInfo) {
const url = this.API + '/shareCallBack';
return this.http
.post(url, JSON.stringify(shareInfo));
}
// 文件下载
filePath(itemType, itemId, fileCategory, code, mdDropOptionId) {
const url = this.API + '/filePathQuery';
return this.http
.post(url, JSON.stringify({ itemType: itemType, itemId: itemId, fileCategory: fileCategory, code: code, mdDropOptionId: mdDropOptionId }));
}
// 重要公告
announcementQuery(id, announcementTypeId) {
const url = this.ydapi + '/market/announcementQuery';
return this.http
.post(url, JSON.stringify({ id: id, announcementTypeId: announcementTypeId }));
}
// 产品海报
posterQuery(paginationInfo) {
const url = this.ydapi + '/market/posterQuery';
return this.http
.post(url, JSON.stringify(paginationInfo));
}
//热销产品
recommendPlanQuery(param) {
const url = this.API + '/recommendPlanQuery';
return this.http
.post(url, JSON.stringify(param));
}
//培训资料分类
dropOptionsQuery(param) {
const url = this.API + "/metadata/dropOptionsQuery";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
queryproductlistbytag(param) {
const url = this.API + "/queryproductlistbytag";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
//经纪人商机列表
ownOpportunityQuery(param) {
const url = this.ydapi + "/practitioner/ownOpportunityQuery";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
//经纪人商机详情
ownOpportunityDetailQuery(param) {
const url = this.ydapi + "/practitioner/ownOpportunityDetailQuery";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
//经纪人修改商机跟进信息
ownOpportunityRecordSave(param) {
const url = this.ydapi + "/practitioner/ownOpportunityRecordSave";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
//标签列表查询
tagQuery(param) {
const url = this.API + "/metadata/tagQuery";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
//商机基本信息保存
ownOpportunityBasicInformationSave(param) {
const url = this.ydapi + "/practitioner/ownOpportunityBasicInformationSave";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
//获取省份
provinceqry(param) {
const url = this.API + "/partner/provinceqry";
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
/**
* 获取城市
* @param objParam
* @returns {Promise<TResult2|TResult1>}
*/
cityqry(param) {
const url = this.API + '/partner/cityqry';
return this.http.post(url, JSON.stringify(param)).pipe(res => {
return res;
});
}
//查保单明细(不包括寿险)
practitionerPolicyListQuery(practitionerId) {
const url = this.API + '/practitioner/practitionerPolicyListQuery';
return this.http
.post(url, JSON.stringify(practitionerId));
}
//保单明细列表包括寿险
policyListQuery(practitionerId) {
const url = this.ydapi + '/practitioner/policyListQuery';
return this.http
.post(url, JSON.stringify(practitionerId));
}
//保单明细详细信息
policyInfoQuery(practitionerId) {
const url = this.ydapi + '/practitioner/policyInfoQuery';
return this.http
.post(url, JSON.stringify(practitionerId));
}
//查询团队业绩及是否团队长
subordinateSystemMemberQuery(practitionerId) {
const url = this.ydapi + '/practitioner/subordinateSystemMemberQuery';
return this.http
.post(url, JSON.stringify(practitionerId));
}
//下载多媒体文件接口
mediaGet(mediaId) {
const url = this.ydapi + '/practitioner/mediaGet';
return this.http.post(url, JSON.stringify(mediaId));
}
//设置查询
mySettingQuery(practitionerId) {
const url = this.ydapi + '/practitioner/settingQuery';
return this.http.post(url, JSON.stringify(practitionerId));
}
//我的设置保存
mySettingSave(param) {
const url = this.ydapi + '/practitioner/settingSave';
return this.http.post(url, JSON.stringify(param));
}
//删除生活照
myImgDelete(param) {
const url = this.ydapi + '/practitioner/imgDelete';
return this.http.post(url, JSON.stringify(param));
}
//排行榜
rank(param) {
const url = this.ydapi + '/practitioner/rank';
return this.http
.post(url, JSON.stringify(param));
}
//新增增员接口
recruit(param) {
const url = this.ydapi + '/practitioner/recruit';
return this.http
.post(url, JSON.stringify(param));
}
//创建增员跟进记录
addRecruitTrack(param) {
const url = this.ydapi + '/practitioner/addRecruitTrack';
return this.http
.post(url, JSON.stringify(param));
}
//增员查询跟进接口
recruitTrackQuery(param) {
const url = this.ydapi + '/practitioner/recruitTrackQuery';
return this.http
.post(url, JSON.stringify(param));
}
// 教育等级查询
educationLevelQuery() {
const url = this.API + '/metadata/educationLevelQuery';
return this.http.get(url);
}
//增员列表查询
recruitListQuery(param) {
const url = this.ydapi + '/practitioner/recruitListQuery';
return this.http
.post(url, JSON.stringify(param));
}
//过渡页心灵鸡汤
knowledgeQry(param) {
const url = this.API + '/metadata/knowledgeQry';
return this.http
.post(url, JSON.stringify(param));
}
//经纪人商机分数统计
opportunityStatistics(param) {
const url = this.ydapi + '/practitioner/opportunityStatistics';
return this.http
.post(url, JSON.stringify(param));
}
//销售目标保存
salesTargetSave(param) {
const url = this.ydapi + '/practitioner/salesTargetSave';
return this.http
.post(url, JSON.stringify(param));
}
//查询销售目标
salesTargetQuery(param) {
const url = this.ydapi + '/practitioner/salesTargetQuery';
return this.http
.post(url, JSON.stringify(param));
}
//月均销售活动量
salesTargetMonthSave(param) {
const url = this.ydapi + '/practitioner/salesTargetMonthSave';
return this.http
.post(url, JSON.stringify(param));
}
//增员目标保存
potentialGoalsSetting(param) {
const url = this.ydapi + '/practitioner/potentialGoalsSetting';
return this.http
.post(url, JSON.stringify(param));
}
//增员目标查询接口
potentialGoalsQuery(param) {
const url = this.ydapi + '/practitioner/potentialGoalsQuery';
return this.http
.post(url, JSON.stringify(param));
}
//增员活动量更新
potentialGoalsActionsUpdate(param) {
const url = this.ydapi + '/practitioner/potentialGoalsActionsUpdate';
return this.http
.post(url, JSON.stringify(param));
}
//活动量查询
potentialGoalsActionsQuery(param) {
const url = this.ydapi + '/practitioner/potentialGoalsActionsQuery';
return this.http
.post(url, JSON.stringify(param));
}
//团队平均
teamActionsAverageQuery(param) {
const url = this.ydapi + '/practitioner/teamActionsAverageQuery';
return this.http
.post(url, JSON.stringify(param));
}
//增员统计
potentialActivityQuery(param) {
const url = this.ydapi + '/practitioner/potentialActivityQuery';
return this.http
.post(url, JSON.stringify(param));
}
//团队成员销售活动量得分
playerSalesActivityQuery(param) {
const url = this.ydapi + '/practitioner/playerSalesActivityQuery';
return this.http
.post(url, JSON.stringify(param));
}
//战队成员销售业绩预测
salesPerformanceForecastListQuery(param) {
const url = this.ydapi + '/practitioner/salesPerformanceForecastListQuery';
return this.http
.post(url, JSON.stringify(param));
}
//销售活动量分值详情
salesScoreDetailQuery(param) {
const url = this.ydapi + '/practitioner/salesScoreDetailQuery';
return this.http
.post(url, JSON.stringify(param));
}
//薪资列表
payScaleListQuery(param) {
const url = this.ydapi + '/practitioner/payScaleListQuery';
return this.http
.post(url, JSON.stringify(param));
}
//薪资pdf
payScalePdf(param) {
const url = this.ydapi + '/practitioner/payScalePdf';
return this.http
.post(url, JSON.stringify(param));
// this.http.post(`${this.ydapi}/practitioner/payScalePdf`, param, { responseType: 'blob', observe: 'response' }).subscribe(data => {
// const link = document.createElement('a');
// const blob = new Blob([data.body], { type: 'application/pdf;charset=UTF-8' });
// link.setAttribute('href', window.URL.createObjectURL(blob));
// link.setAttribute('download', data.headers.get('Content-Disposition').split('filename=')[1]);
// link.style.visibility = 'hidden';
// document.body.appendChild(link);
// link.click();
// document.body.removeChild(link);
// })
}
applyForExpertSupport(param){
const url = this.ydapi + '/practitioner/applyForExpertSupport';
return this.http
.post(url, JSON.stringify(param));
}
}
<div class="scrollContainer">
<div class="detailContainer scrollContent">
<div class="orderdetailBox">
<div class="btnBox">
<span class="alignItemCenter"><i class="line"></i>保单明细</span>
</div>
<ul class="list-group" *ngIf="policyInfo?.policyNo">
<li class="list-group-item">
<span>保单号</span>
<span>{{policyInfo?.policyNo}}</span>
</li>
<li class="list-group-item" *ngIf="policyInfo?.startDate">
<span>生效日期</span>
<span>{{policyInfo?.startDate.substr(0,10)}}</span>
</li>
<li class="list-group-item" *ngIf="policyInfo?.endDate">
<span>结束日期</span>
<span>{{policyInfo?.endDate}}</span>
</li>
<li class="list-group-item" *ngIf="policyInfo?.status">
<span>状态</span>
<span>{{policyInfo?.status}}</span>
</li>
<div class="insuredsBox coverContent">
<h4 class="text-left alignItemCenter"><i class="line"></i>保障内容</h4>
<ul *ngFor="let productInfo of policyFactorInfos;index as i">
<li class="list-group-item" *ngIf="productInfo?.productName">
<span style="width: 30%;">产品</span>
<span style="text-align: right;">{{productInfo?.productName}}</span>
</li>
<li class="list-group-item" *ngIf="productInfo?.insuredAmount">
<span>保额</span>
<span>{{productInfo?.insuredAmount}} {{productInfo?.amountUnit}}</span>
</li>
<li class="list-group-item" *ngIf="productInfo?.period">
<span>缴费年限</span>
<span>{{productInfo?.period}}年</span>
</li>
<li class="list-group-item" *ngIf="productInfo?.payFrequency">
<span>缴费方式</span>
<span>{{productInfo?.payFrequency}}</span>
</li>
<li class="list-group-item" *ngIf="productInfo?.commission">
<span>销售佣金</span>
<span>¥{{productInfo?.commission | number:'1.2-2'}}</span>
</li>
<li class="list-group-item" *ngIf="productInfo?.premium">
<span>保费</span>
<span>¥{{productInfo?.premium | number:'1.2-2'}}</span>
</li>
</ul>
</div>
<div class="btnBox">
<span class="alignItemCenter"><i class="line"></i>投保人信息</span>
</div>
<li class="list-group-item">
<span>姓名</span>
<span>{{holderInfo?.name}}</span>
</li>
<li class="list-group-item" *ngIf="holderInfo?.gender">
<span>性别</span>
<ng-container [ngSwitch]="holderInfo?.gender">
<span *ngSwitchCase="1"></span>
<span *ngSwitchCase="2"></span>
<span *ngSwitchDefault></span>
</ng-container>
</li>
<li class="list-group-item" *ngIf="holderInfo?.birthDay">
<span>出生日期</span>
<span>{{holderInfo?.birthDay}}</span>
</li>
<li class="list-group-item" *ngIf="holderInfo?.idInfo.idType">
<span>证件类型</span>
<ng-container [ngSwitch]="holderInfo?.idInfo.idType">
<span *ngSwitchCase="1">身份证</span>
<span *ngSwitchCase="2">护照</span>
<span *ngSwitchCase="3">港澳身份证</span>
<span *ngSwitchCase="4">台胞证</span>
<span *ngSwitchCase="9">其他</span>
<span *ngSwitchCase="20">统一社会信用代码</span>
<span *ngSwitchDefault>/</span>
</ng-container>
</li>
<li class="list-group-item" *ngIf="holderInfo?.idInfo.idNo">
<span>证件号码</span>
<span>{{holderInfo?.idInfo.idNo}}</span>
</li>
</ul>
<div class="insuredsBox" *ngFor="let insured of insuredInfos;index as i">
<h4 class="text-left alignItemCenter"><i class="line"></i>被保人信息{{i+1}}</h4>
<ul>
<li class="list-group-item" *ngIf="this.insured?.name">
<span>姓名</span>
<span>{{this.insured?.name}}</span>
</li>
<li class="list-group-item" *ngIf="this.insured?.gender">
<span>性别</span>
<ng-container [ngSwitch]="insured?.gender">
<span *ngSwitchCase="1"></span>
<span *ngSwitchCase="2"></span>
<span *ngSwitchDefault></span>
</ng-container>
</li>
<li class="list-group-item" *ngIf="this.insured?.birthDay">
<span>出生日期</span>
<span>{{this.isReferral==='true' ? '****-'+this.insured?.birthDay.substr(5) : this.insured?.birthDay}}</span>
</li>
<li class="list-group-item" *ngIf="insured?.idInfo?.idType">
<span>证件类型</span>
<ng-container [ngSwitch]="insured?.idInfo?.idType">
<span *ngSwitchCase="1">身份证</span>
<span *ngSwitchCase="2">护照</span>
<span *ngSwitchCase="4">台胞证</span>
<span *ngSwitchCase="9">其他</span>
<span *ngSwitchCase="20">统一社会信用代码</span>
<span *ngSwitchDefault>/</span>
</ng-container>
</li>
<li class="list-group-item" *ngIf="this.insured?.idInfo?.idNo">
<span>证件号码</span>
<span>{{this.isReferral==='true' ? this.insured?.idInfo?.idNo.substr(0,2) + '******' + this.insured?.idInfo?.idNo.substr(this.insured?.idInfo?.idNo.length-2,2) : this.insured?.idInfo?.idNo}}</span>
</li>
<li class="list-group-item" *ngIf="this.insured?.occupationName">
<span>职业类别</span>
<span>{{this.insured?.occupationName}}</span>
</li>
<li class="list-group-item" *ngIf="this.insured?.address">
<span style="white-space: nowrap;margin-right: 8px;">详细地址</span>
<span>{{this.insured?.address}}</span>
</li>
<li class="list-group-item" *ngIf="this.insured?.salary">
<span>去年年收入(万元)</span>
<span>{{this.insured?.salary}}</span>
</li>
<li class="list-group-item" *ngIf="this.insured?.salaryType">
<span>收入类型</span>
<span>{{this.insured?.salaryType}}</span>
</li>
</ul>
</div>
<ul class="priceContainer">
<li class="list-group-item" *ngIf="policyInfo?.price">
<span>总保费</span>
<span>¥{{policyInfo?.price | number:'1.2-2'}}</span>
</li>
<li class="list-group-item" *ngIf="policyInfo?.referralInfo?.referralAmount">
<span style="color: #c9af71;">总销售佣金</span>
<span class="light-color">¥{{policyInfo?.referralInfo?.referralAmount | number:'1.2-2'}}</span>
</li>
</ul>
</div>
</div>
</div>
\ No newline at end of file
.detailContainer {
background-color: #f7f7f2;
}
.orderdetailBox {
margin: 20px 8px;
background-color: #f9fdff;
padding-top: 14px;
padding-left: 11px;
box-shadow: -1px 0 1px #eeeee9, /*左边阴影*/ 1px 0 1px #eeeee9, /*右边阴影*/ 0 3px 3px #e5e5e0; /*底边阴影*/
}
.orderdetailBox .btnBox {
display: flex;
justify-content: space-between;
align-items: center;
padding-right: 10px;
font-size: 14px;
font-weight: bold;
}
.orderdetailBox .btnBox div .downloadBtn {
display: inline-block;
background-color: #73d1c4;
color: #fff !important;
border-radius: 6px;
padding: 5px;
}
.orderdetailBox .btnBox div .invoiceBtn {
display: inline-block;
background-color: #fff;
color: #73d1c4 !important;
border-radius: 6px;
padding: 5px;
border: 1px solid #73d1c4;
margin-right: 8px;
}
.line {
margin-right: 5px;
}
.orderdetailBox ul li {
display: flex;
justify-content: space-between;
}
.list-group {
margin-bottom: 0;
}
.list-group-item {
border: none;
background-color: transparent;
padding-left: 0;
padding-right: 0;
margin-right: 8px;
color: #4a4a4a;
position: relative;
}
.list-group-item + .list-group-item::before {
position: absolute;
top: -1px;
left: 0;
content: '';
width: 100%;
height: 1px;
border-top: 1px solid #dcdcdc;
-webkit-transform: scaleY(0.3);
transform: scaleY(0.3)
}
.list-group-item:nth-last-child(1) {
border: none;
}
.orderdetailBox ul li.list-group-item:last-child {
border-radius: 0;
}
.title {
font-size: 14px;
color: #73d1c4;
padding: 0;
display: flex;
align-items: center;
margin-bottom: 10px;
}
.priceContainer li {
border-top: 1px solid #dcdcdc;
}
h4 {
font-size: 14px;
font-weight: bold;
display: flex;
align-items: center;
}
.line {
display: inline-block;
width: 6px;
height: 15px;
margin-right: 6px;
vertical-align: text-bottom;
background-color: #ec2d37;
}
.coverContent{
ul{
border-bottom: 1px #ddd solid;
}
ul:last-child{
border-bottom: none;
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { OrderDetailComponent } from './order-detail.component';
describe('OrderDetailComponent', () => {
let component: OrderDetailComponent;
let fixture: ComponentFixture<OrderDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ OrderDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(OrderDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { ActivatedRoute } from "@angular/router";
@Component({
selector: 'ydlife-order-detail',
templateUrl: './order-detail.component.html',
styleUrls: ['./order-detail.component.scss']
})
export class OrderDetailComponent implements OnInit {
orderNo: string;
policyInfo: any;
holderInfo: any;
insuredInfos: Array<any>;
policyFactorInfos: Array<any>;
constructor(private myService: MyService, private activatedRoute: ActivatedRoute) { }
ngOnInit() {
this.orderNo = this.activatedRoute.snapshot.queryParams.orderNo;
this.policyInfoQuery();
}
policyInfoQuery() {
this.myService.policyInfoQuery({ orderNo: this.orderNo, platform: 2 }).subscribe((res) => {
if (res['success']) {
this.policyInfo = res['data'];
this.holderInfo = this.policyInfo['holderInfo'];
this.insuredInfos = this.policyInfo['insuredInfos'];
this.policyFactorInfos = this.policyInfo['policyFactorInfos'];
}
})
}
}
<div class="wrapper">
<ul class="tab">
<li *ngFor="let titleItem of titleList" (click)="selectTab(titleItem.id)"
[ngClass]="{selected:selectedId===titleItem.id}">
<div style="position: relative;">
<h3>{{titleItem.name}}
</h3>
</div>
</li>
</ul>
<div class="content" *ngIf="selectedId===1">
<i class="iconfont icon-bianji" *ngIf="readonlyFlag" (click)="editInfo()"></i>
<i class="iconfont icon-save" *ngIf="!readonlyFlag" (click)="saveInfo()"></i>
<div class="contentDetail">
<div class="contentItem">
<span><sub>*</sub>姓名</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无姓名':'请输入姓名'}}"
[(ngModel)]="editRecruiting.name" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>年龄</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无年龄信息':'请输入年龄'}}"
[(ngModel)]="editRecruiting.age" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>性别</span>
<div class="sexWrapper">
<button class="form-control sex" [ngClass]="{'sexBtn':editRecruiting?.gender=='1' && maleFlag && femaleFlag}"
(click)="selectedGender('1')" [disabled]="readonlyFlag" *ngIf="sexFlag && maleFlag">
</button>
<button class="form-control sex" [ngClass]="{'sexBtn':editRecruiting?.gender=='2' && maleFlag && femaleFlag}"
(click)="selectedGender('2')" [disabled]="readonlyFlag" *ngIf="sexFlag && femaleFlag">
</button>
</div>
<input class="form-control" type="text" placeholder="暂无性别信息" *ngIf="!sexFlag" disabled />
</div>
<div class="contentItem">
<span><sub>*</sub>手机</span>
<a *ngIf="this.potentialId!=0" style="text-decoration:none;color: #333;margin-right: 16px;"
href="tel:{{editRecruiting.mobileNo}}">
<i class="iconfont icon-dianhua" style="color: #e10d0d;"></i>
{{editRecruiting.mobileNo}}
</a>
<input *ngIf="this.potentialId==0" class="form-control" type="text" maxlength="11"
[(ngModel)]="editRecruiting.mobileNo" placeholder="请输入手机号" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>微信</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无微信':'请输入微信'}}"
[(ngModel)]="editRecruiting.wechatId" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>其他联系</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无其他联系方式':'请输入其他联系方式'}}"
[(ngModel)]="editRecruiting.othersContacts" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem">
<span>学历</span>
<select class="form-control" [(ngModel)]="editRecruiting.educationLevel" [disabled]="readonlyFlag"
style=" direction: rtl;" (blur)="inputBlur()">
<option value=''>{{readonlyFlag ?'暂无学历信息':'请选择学历'}}</option>
<option *ngFor="let educationLevelItem of educationLevelList" [value]="educationLevelItem.id">
{{educationLevelItem.name}}
</option>
</select>
</div>
<div class="contentItem">
<span>招募来源</span>
<select class="form-control" [(ngModel)]="editRecruiting.resourceDropMasterId" [disabled]="readonlyFlag"
style=" direction: rtl;" (blur)="inputBlur()">
<option value="">{{readonlyFlag ?'暂无招募来源':'请选择招募来源'}}</option>
<option *ngFor="let resourceItem of resourceList" [value]="resourceItem.id">
{{resourceItem.dropOptionName}}
</option>
</select>
</div>
<div class="contentItem" *ngIf="this.id!=0">
<span>增员创建时间</span>
<input class="form-control" type="text" placeholder="增员创建时间" [(ngModel)]="editRecruiting.createdAt" disabled />
</div>
<div class="contentItem" *ngIf="this.id!=0">
<span>预计报聘时间</span>
<input *ngIf="readonlyFlag" class="form-control" type="text"
placeholder="{{readonlyFlag ?'暂无预计报聘时间':'请选择预计报聘时间'}}" [(ngModel)]="editRecruiting.timeToOnboarding"
[disabled]="readonlyFlag" (blur)="inputBlur()" />
<input *ngIf="!readonlyFlag" class="form-control" type="date"
[ngStyle]="{'margin-right':this.isPC == '1' ? '-8%' : '-4.5%'}"
placeholder="{{readonlyFlag ?'暂无预计报聘时间':'请选择预计报聘时间'}}" [(ngModel)]="editRecruiting.timeToOnboarding"
[disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
<div class="contentItem" *ngIf="this.id!=0">
<span>增员状态</span>
<div style="padding: 6px 15px;padding: 6px 15px;color: #e10d0d;font-weight: bold;">
{{editRecruiting.trackStatus}}</div>
</div>
<div class="contentItem">
<span>备注</span>
<input class="form-control" type="text" placeholder="{{readonlyFlag ?'暂无备注':'请输入备注信息'}}"
[(ngModel)]="editRecruiting.remark" [disabled]="readonlyFlag" (blur)="inputBlur()" />
</div>
</div>
</div>
<div class="content" *ngIf="selectedId===2" style="text-align: center;font-size: 16px;margin-top: 10px;">
<div *ngIf="!this.editRecruiting.ossPathResume">
暂无简历</div>
<a [href]="this.editRecruiting.ossPathResume">
{{this.lifeCommonService.getFileName(this.editRecruiting.ossPathResume)}}
</a>
</div>
<div class="content" *ngIf="selectedId===3;">
<ul class="recordLists">
<li *ngFor="let recruitTrackInfoItem of recruitTrackInfoList;index as idx;">
<div style="display: flex;justify-content: space-between;">
<div class="updatedAt">
{{recruitTrackInfoItem.trackTime?recruitTrackInfoItem.trackTime:recruitTrackInfoItem.createAt}}</div>
<div class="opportunityRecordItem">{{recruitTrackInfoItem.trackStatus}}</div>
</div>
<div class="salesNotice">
<span>
<input type="text" class="form-control" [disabled]="remarkId!=recruitTrackInfoItem.trackId"
[(ngModel)]="recruitTrackInfoItem.notice" (blur)="inputBlur()">
</span>
<i *ngIf="remarkId!=recruitTrackInfoItem.trackId" class="iconfont icon-bianji"
(click)="editRemark(recruitTrackInfoItem.trackId)"></i>
<i *ngIf="remarkId==recruitTrackInfoItem.trackId" class="iconfont icon-save"
(click)="addRecruitTrack(recruitTrackInfoItem)"></i>
</div>
</li>
</ul>
<div class="add" (click)="this.isShow = true;">
<i class="iconfont icon-jiahao"></i>
</div>
</div>
<div class="toastWrapper toast" *ngIf="isShow" (click)="this.isShow = false;">
</div>
<!--编辑框-->
<div class="editContainer" *ngIf="isShow">
<div>
<div>增员状态</div>
<div style="position:relative">
<select name="businessStatus" (onChange)="inputBlur()" id="businessStatus" class="form-control"
[(ngModel)]="trackStatusId">
<option value="">请选择</option>
<option *ngFor="let recruitingStatusItem of recruitingStatusList" value="{{recruitingStatusItem.id}}">
{{recruitingStatusItem.dropOptionName}}
</option>
</select>
<i class="iconfont icon-xiangxia" style="position: absolute;right: 50px;top: 5px;"></i>
</div>
</div>
<div>
<div>备注</div>
<div><input type="text" id="remark" class="form-control" placeholder="输入备注信息" [(ngModel)]="notice"
(blur)="inputBlur()"></div>
</div>
<div>
<div>跟进时间</div>
<div>
<input style="-webkit-appearance: none;" id="time" class="form-control" type="date" [(ngModel)]="trackTime"
(blur)="inputBlur()">
</div>
</div>
<ul class="footer">
<li (click)="addRecruitTrack()">确定</li>
<li (click)="this.isShow = false;">取消</li>
</ul>
</div>
</div>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
\ No newline at end of file
.wrapper {
font-size: 16px;
select{
-webkit-appearance: none;
}
.tab {
display: flex;
list-style: none;
margin: 10px 0px;
padding-left: 1%;
li {
margin-right: 10px;
line-height: 30px;
height: 30px;
width: 25%;
text-align: center;
border: 1px #a9aabb solid;
border-radius: 20px;
h3 {
font-weight: normal;
font-size: 16px;
}
}
li.selected {
// background-color: #ff5a32;
// color: #fff;
border: 1px #e10d0d solid;
}
}
.content {
padding: 10px 5px;
position: relative;
> .iconfont {
width: 55px;
height: 55px;
line-height: 55px;
border-radius: 50%;
position: fixed;
right: 10px;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
bottom: 5px;
left: 42%;
}
.contentDetail {
margin-top: 15px;
.contentItem {
display: flex;
margin-bottom: 10px;
justify-content: space-between;
align-items: center;
// border-bottom: 1px #ddd solid;
margin: 0 8px 5px 8px;
> span:first-child{
white-space: nowrap;
}
input.form-control,select.form-control {
display: inline-block;
// width: 60%;
margin: 0 5px;
background: none;
outline: none;
border: none;
text-align: right;
box-shadow: none;
display: flex;
flex-wrap: wrap;
font-size: 16px;
}
input[type="date"]{
margin-right: -4.5%;
direction: rtl;
}
.sexWrapper {
display: flex;
width: 60%;
justify-content: flex-end;
padding-right: 3px;
.form-control.sex {
width: 20%;
margin-left: 5px;
border: none;
box-shadow: none;
}
.form-control.sex.sexBtn {
border: 1px #0767bf solid;
}
.form-control[disabled] {
background-color: transparent;
opacity: 1;
}
}
span{
position: relative;
sub{
position: absolute;
margin-right: 5px;
font-weight: bold;
color: #e10d0d;
top: 13px;
left: -8px;
}
}
}
.contentItem:last-child {
border-bottom: none;
}
select.form-control[disabled] {
background-color: transparent;
color: #999;
}
}
.tagWrapper {
display: flex;
flex-wrap: wrap;
padding-left: 8px;
div.tagContent {
margin: 10px 3px 0 3px;
height: 28px;
line-height: 28px;
text-align: center;
// background-color: #e8e8e8;
border-radius: 12px;
font-size: 13px;
padding: 0 15px;
}
div.selected {
border: 1px #0767bf solid;
}
}
.add {
position: absolute;
.iconfont {
width: 55px;
height: 55px;
line-height: 55px;
border-radius: 50%;
position: fixed;
left: 42%;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
bottom: 5px;
font-size: 28px;
// color: #ff5933;
font-weight: bold;
}
}
.answerContent {
border-bottom: 1px #ddd solid;
margin-bottom: 5px;
padding: 5px 0;
.questionTitle {
font-weight: 700;
font-size: 13px;
}
.questionContent {
font-size: 16px;
}
}
.answerContent:last-child {
border-bottom: 0;
}
.record {
display: flex;
list-style: none;
justify-content: space-between;
li {
width: 30%;
text-align: center;
height: 30px;
line-height: 30px;
}
}
}
.editContainer {
margin-top: 15px;
background: #ffffff;
padding: 10px;
position: fixed;
bottom: 0;
width: 100%;
height: 45%;
background-color: #fff;
z-index: 20;
-webkit-animation: .5s both slowUp;
animation: .5s both slowUp;
min-width: 320px;
max-width: 640px;
margin: 0 auto;
> div {
height: 50px;
border-bottom: 1px solid #dbdbdb;
display: flex;
align-items: center;
justify-content: space-between;
> div:first-child {
width: 100px;
font-size: 15px;
}
> div:last-child {
flex: 1;
}
.form-control {
border: none;
box-shadow: none;
}
}
> div:last-child {
border: none;
}
ul.footer{
display: flex;
list-style: none;
justify-content: center;
margin-top: 15%;
li{
width: 30%;
height: 35px;
line-height: 35px;
text-align: center;
background: #e10d0d;
color: #fff;
margin: 0 10px;
border-radius: 10px;
}
}
}
.recordLists {
li {
border-bottom: 1px solid #f0f0f0;
padding: 5px 10px;
background: rgb(251, 251, 251);
}
li:last-child {
border: none;
}
.opportunityRecordItem {
font-size: 15px;
}
.salesNotice {
font-size: 14px;
color: #8a8a8a;
line-height: 1.1;
margin-bottom: 5px;
display: flex;
justify-content: space-between;
align-items: center;
span{
width: 85%;
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
background-color: #eee;
opacity: .5;
border: none;
outline: none;
box-shadow: none;
padding-left: 0;
}
}
.iconfont{
font-size: 18px;
}
}
}
.toast {
position: fixed;
left: 0;
right: 0;
min-width: 320px;
max-width: 640px;
width: 100%;
margin: 0 auto;
z-index: 1;
}
.toastWrapper {
height: 100%;
background-color: rgba(0,0,0,.5);
top: 0;
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { RecruitingDetailComponent } from './recruiting-detail.component';
describe('RecruitingDetailComponent', () => {
let component: RecruitingDetailComponent;
let fixture: ComponentFixture<RecruitingDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ RecruitingDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(RecruitingDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from "@angular/router";
import { LifeCommonService } from '../../common/life-common.service';
import { MyService } from '../my.service';
import { RecruitingQuery } from '../../domain/recruitingQuery';
@Component({
selector: 'ydlife-recruiting-detail',
templateUrl: './recruiting-detail.component.html',
styleUrls: ['./recruiting-detail.component.scss']
})
export class RecruitingDetailComponent implements OnInit {
editRecruiting: RecruitingQuery = new RecruitingQuery();
//潜在增员的id
potentialId: any;
titleList: Array<any>;
selectedId: number;
readonlyFlag: boolean = true;
//性别显示
sexFlag: boolean;
//显示女
femaleFlag: boolean;
//显示男
maleFlag: boolean;
isShow: boolean;
recruitingStatusList: Array<any>;
//控制tab可不可点
clickFlag: boolean;
educationLevelList: Array<any>;
//新增增员记录的备注
notice: any;
trackStatusId: any;
//控制弹框
toastDialog: boolean;
toastInfo: any;
recruitTrackInfoList: Array<any>;
resourceList: Array<any>;
trackTime: any;
status: any;
remarkId: any;
isPC: any;
constructor(
private activateRoute: ActivatedRoute,
public lifeCommonService: LifeCommonService,
private myService: MyService,
private router: Router) {
this.titleList = [
{ id: 1, name: '基本信息' },
{ id: 2, name: '简历' },
{ id: 3, name: '增员跟进' }
]
}
ngOnInit() {
this.isPC = this.lifeCommonService.checkDeviceType();
//潜在增员id
this.potentialId = Number(this.activateRoute.snapshot.paramMap.get('id'));
//状态
this.status = this.activateRoute.snapshot.queryParams['status'];
this.dropOptionsQuery(1);
this.educationLevelQuery();
if (this.potentialId === 0) {
this.readonlyFlag = false;
this.sexFlag = true;
this.maleFlag = true;
this.femaleFlag = true;
this.clickFlag = false;
this.editRecruiting = new RecruitingQuery('', 1, '', '', '', '', '', '', '', null, '', '', '', '');
this.selectTab(1);
} else {
this.clickFlag = true;
this.selectTab(1);
this.editRecruiting.resourceDropMasterId = ''
}
//获取基本信息
this.recruitListQuery()
}
selectTab(id) {
if (this.clickFlag == true) {
this.selectedId = id;
if (this.selectedId === 3) {
//初始化
this.trackStatusId = '';
//跟进列表查询
this.recruitTrackQuery();
//招募来源列表
this.dropOptionsQuery(2);
}
if (this.selectedId === 1 || this.selectedId === 2) {
this.recruitListQuery()
}
} else {
this.selectedId = 1;
}
}
//改为编辑状态出现男女选项
editInfo() {
this.readonlyFlag = false;
this.sexFlag = true;
this.maleFlag = true;
this.femaleFlag = true;
}
//选男女
selectedGender(e) {
this.editRecruiting.gender = e;
}
//查询跟进记录
recruitTrackQuery() {
const param = {
potentialId: this.potentialId ? this.potentialId : null,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']
}
this.myService.recruitTrackQuery(param).subscribe((res) => {
if (res['success']) {
this.recruitTrackInfoList = res['data']['recruitTrackInfoList'];
}
})
}
//跟进状态列表type=2跟进状态type=1招募列表
dropOptionsQuery(type) {
if (type === 1) {
//招募来源列表
this.myService.dropOptionsQuery({ code: 'team_building_source' }).subscribe((res) => {
if (res['success']) {
this.resourceList = res['data']['dropMasterInfoList']['0']['dropOptionsInfoList'];
}
})
}
if (type === 2) {
//跟进状态列表
this.myService.dropOptionsQuery({ code: 'team_building_track' }).subscribe((res) => {
if (res['success']) {
this.recruitingStatusList = res['data']['dropMasterInfoList']['0']['dropOptionsInfoList'];
}
})
}
}
// 教育等级查询
educationLevelQuery() {
this.myService.educationLevelQuery().subscribe(res => {
if (res['success']) {
this.educationLevelList = res['data']['educationLevelList']
}
})
}
inputBlur() {
window.scrollTo(0, 0)
}
//新增增员基本信息
saveInfo() {
this.editRecruiting = {
...this.editRecruiting,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
potentialId: this.potentialId ? this.potentialId : null
}
if (!this.editRecruiting.name) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '姓名不能为空!',
timeout: 3000,
align: 'center'
};
return;
} else {
this.editRecruiting.name = this.editRecruiting.name.trim();
if (!this.lifeCommonService.nameValid(this.editRecruiting.name)) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '不要乱输姓名哦!',
timeout: 3000,
align: 'center'
};
return;
}
}
const OVERZERO_REG = /^[0-9]*[1-9][0-9]*$/;
if (this.editRecruiting.age) {
if (OVERZERO_REG.test(this.editRecruiting.age)) {
if (parseInt(this.editRecruiting.age) > 100) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '年龄不能大于三位数!',
timeout: 3000,
align: 'center'
};
return;
}
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '年龄只能输入正整数!',
timeout: 3000,
align: 'center'
};
return;
}
}
if (!this.editRecruiting.mobileNo) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '手机号不能为空!',
timeout: 3000,
align: 'center'
};
return;
} else {
this.editRecruiting.mobileNo = this.editRecruiting.mobileNo.trim()
if (!this.lifeCommonService.mobileNoValid(this.editRecruiting.mobileNo)) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '输入手机号码错误',
timeout: 3000,
align: 'center'
};
return;
}
}
this.myService.recruit(this.editRecruiting).subscribe((res) => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: Number(this.potentialId) == 0 ? '添加增员对象成功!' : '修改成功!',
timeout: 3000,
align: 'center'
};
this.readonlyFlag = true;
if (this.editRecruiting.gender) {
this.sexFlag = true;
if (this.editRecruiting.gender == '1') {
this.maleFlag = true;
this.femaleFlag = false;
} else {
this.femaleFlag = true;
this.maleFlag = false;
}
} else {
this.sexFlag = false;
}
//新增的时候要刷新页面replaceUrl: true更新路由后不把当前状态计入历史
if (this.potentialId === 0) {
if (res['data']['potentialId']) {
this.potentialId = Number(res['data']['potentialId']);
this.router.navigate([`/recruiting/${this.potentialId}`], { replaceUrl: true });
this.clickFlag = true;
}
}
this.recruitListQuery();
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
//新增增员跟进记录
addRecruitTrack(recruitTrackInfoItem?: any) {
let param;
if (!recruitTrackInfoItem) {
const oppDate = new Date(this.trackTime + ' 23:59:59').getTime();
const createDate = new Date(this.editRecruiting.createdAt).getTime();
// if (nowDate < oppDate) {
// this.toastDialog = true;
// this.toastInfo = {
// status: 1,
// msg: '跟进时间不能大于当前时间!',
// timeout: 3000,
// align: 'center'
// };
// return;
// }
if (oppDate < createDate) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '跟进时间不能在增员时间之前!',
timeout: 3000,
align: 'center'
};
return;
}
if (!this.trackStatusId) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '请选择跟进状态!',
timeout: 3000,
align: 'center'
};
return;
}
if (!this.trackTime) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '跟进时间不能为空!',
timeout: 3000,
align: 'center'
};
return;
}
param = {
potentialId: this.potentialId,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'],
notice: this.notice,
trackStatusId: this.trackStatusId,
trackTime: this.trackTime
}
} else {
param = recruitTrackInfoItem;
param.potentialId = this.potentialId;
param.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
}
this.myService.addRecruitTrack(param).subscribe((res) => {
if (res['success']) {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: recruitTrackInfoItem ? '修改成功!' : '添加成功!',
timeout: 3000,
align: 'center'
};
this.recruitTrackQuery();
this.remarkId = '';
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: res['message'],
timeout: 3000,
align: 'center'
};
}
})
}
//查询基本信息
recruitListQuery() {
const listParam = {
status: null,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerId
}
this.myService.recruitListQuery(listParam).subscribe((res) => {
if (res['success']) {
if (res['data']['practitionerPotentialInfoList']) {
const list = res['data']['practitionerPotentialInfoList'];
for (let i = 0; i < list.length; i++) {
if (this.potentialId == list[i]['potentialId']) {
this.editRecruiting = list[i];
if (!this.editRecruiting.gender) {
this.sexFlag = false;
} else {
this.sexFlag = true;
if (this.editRecruiting.gender == 1) {
this.maleFlag = true;
this.femaleFlag = false;
} else {
this.femaleFlag = true;
this.maleFlag = false;
}
}
if (!this.editRecruiting.resourceDropMasterId) {
this.editRecruiting.resourceDropMasterId = '';
}
}
}
}
}
})
}
editRemark(id) {
this.remarkId = id
}
}
<div class="salesWrapper">
<ul class="tab">
<li *ngFor="let titleItem of titleList" (click)="selectTab(titleItem.id)"
[ngClass]="{selected:selectedId===titleItem.id}">
<div style="position: relative;">
<h3>{{titleItem.name}}
</h3>
</div>
</li>
</ul>
<div class="salesContent">
<div style="text-align: center;margin: 20px auto;font-size: 20px;" *ngIf="businessList?.length==0">暂无商机</div>
<div class="salesItem" *ngFor="let recruitingItem of recruitingList"
[routerLink]="['/recruiting',recruitingItem.potentialId]" [queryParams]="{status:selectedId}">
<div class="icon_bolck"><span class="iconfont icon-tuanduiguanlisvg"></span></div>
<div class="line">
<div>姓名:{{recruitingItem.name}}</div>
<span class="iconfont icon-ar-r" style="font-size: 10px;position: relative; right: -2px;"></span>
</div>
<div class="line">
<div> 手机号:{{recruitingItem.mobileNo}}</div>
<div>{{recruitingItem.trackStatus}}</div>
</div>
<div class="line">
<div>招募来源:{{recruitingItem.resourceDropMasterName}}</div>
<div>{{recruitingItem.createdAt}}</div>
</div>
</div>
</div>
<div class="add">
<i class="iconfont icon-jiahao" (click)="addMember()"></i>
</div>
</div>
\ No newline at end of file
.salesWrapper{
width: 100%;
height: 100%;
overflow: auto;
// background:#f7f7f2;
.tab {
display: flex;
list-style: none;
margin: 10px 0px;
padding-left: 1%;
li {
margin-right: 10px;
line-height: 30px;
height: 30px;
width: 25%;
text-align: center;
border: 1px #a9aabb solid;
border-radius: 20px;
h3 {
font-weight: normal;
font-size: 16px;
}
}
li.selected {
border: 1px #e10d0d solid;
}
}
.salesContent{
.salesItem{
border-bottom: 1px #dcdcdc solid;
padding: 10px;
padding-left: 45px;
position: relative;
.icon_bolck{
border: 1px #dcdcdc solid;
width: 35px;
height: 35px;
position: absolute;
left: 3px;
top: 20px;
line-height: 30px;
text-align: center;
border-radius: 50%;
.iconfont{
color: #ff3500;
font-size: 26px;
position: relative;
top: 1px;
}
}
.line{
display: flex;
justify-content: space-between;
align-items: center;
font-size: 13px;
flex: 1;
.price{
font-size: 16px;
color: #ff3500;
font-weight: bold;
}
}
}
.salesItem:last-child{
border-bottom: none;
}
}
.add {
position: absolute;
.iconfont {
width: 55px;
height: 55px;
line-height: 55px;
border-radius: 50%;
position: fixed;
right: 10px;
font-size: 24px;
color: #fff;
background: #0767bf;
text-align: center;
font-size: 28px;
// color: #ff5933;
font-weight: bold;
bottom: 50px;
left: 42%;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { RecruitingComponent } from './recruiting.component';
describe('RecruitingComponent', () => {
let component: RecruitingComponent;
let fixture: ComponentFixture<RecruitingComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ RecruitingComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(RecruitingComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { Router } from "@angular/router";
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-recruiting',
templateUrl: './recruiting.component.html',
styleUrls: ['./recruiting.component.scss']
})
export class RecruitingComponent implements OnInit {
recruitingList: Array<any>;
titleList: Array<any>;
selectedId: any;
constructor(private router: Router, private myService: MyService) { }
ngOnInit() {
this.titleList = [
{ id: 1, name: '待跟进' },
{ id: 2, name: '跟进中' },
{ id: 3, name: '已报聘' },
]
this.selectTab(1)
}
addMember() {
this.router.navigate(['/recruiting/0']);
}
selectTab(id) {
this.selectedId = id;
this.recruitListQuery(id)
}
//1-待跟进,2-跟进中,3-已完成
recruitListQuery(type) {
const listParam = {
status: type,
practitionerId: JSON.parse(localStorage.getItem('lifeCustomerInfo')).practitionerId
}
this.myService.recruitListQuery(listParam).subscribe((res) => {
if (res['success']) {
this.recruitingList = res['data']['practitionerPotentialInfoList']
}
})
}
}
<div class="salesWrapper">
<div class="salesContent">
<div class="salesItem" *ngFor="let payScaleItem of payScaleInfos">
<div class="icon_bolck"><span class="iconfont icon-xinzidan"></span></div>
<div class="line">
<div>薪资日期</div>
<div>{{lifeCommonService.getDate(payScaleItem.monDtlPeriod)}}</div>
</div>
<div class="line">
<div>流水编号</div>
<div>{{payScaleItem.monShId}}</div>
</div>
<div class="line">
<span>应发佣金</span>
<div class="price">¥{{payScaleItem.monDtlAmount | number: "1.0-2"}}</div>
</div>
<div class="line">
<span>扣除税</span>
<div class="price">¥{{(payScaleItem.monDtlAmount-payScaleItem.monDtlRAmount) | number: "1.0-2"}}</div>
</div>
<div class="line">
<span>实发佣金</span>
<div class="price">¥{{payScaleItem.monDtlRAmount | number: "1.0-2"}}</div>
</div>
<div class="line">
<div></div>
<div (click)="getPdf(payScaleItem.monShId)">
薪资单明细
<span class="iconfont icon-xiazai" style="color:#ff3500;margin-left: 5px;"></span>
</div>
</div>
</div>
<div style="text-align: center;margin-top: 20px;" *ngIf="payScaleInfos?.length<=0">暂无数据</div>
</div>
</div>
<ydlife-toast *ngIf="toastDialog" [toastInfo]="toastInfo"></ydlife-toast>
\ No newline at end of file
.salesWrapper{
width: 100%;
height: 100%;
overflow: auto;
.top{
display: flex;
justify-content: space-between;
align-items: center;
.tab{
display: flex;
list-style: none;
/* margin-bottom: 5px; */
margin: 10px 0px;
padding:0 2%;
justify-content: space-between;
li {
text-align: center;
// border: 1px #a9aabb solid;
// border-radius: 20px;
font-size: 16px;
}
li.selected{
// background-color: #ff5a32;
// color: #fff;
// border: 1px #f0f0f0 solid;
// border: 1px #e10d0d solid;
border-bottom: 2px #e10d0d solid;
font-weight: bold;
}
}
.tab:nth-child(1){
width: 50%;
}
.tab:nth-child(2){
width: 28%;
}
}
.salesContent{
.salesItem{
border-bottom: 1px #dcdcdc solid;
padding: 10px;
padding-left: 45px;
position: relative;
.icon_bolck{
border: 1px #dcdcdc solid;
width: 35px;
height: 35px;
position: absolute;
left: 3px;
top: 50px;
line-height: 30px;
text-align: center;
border-radius: 50%;
.iconfont{
color: #ff3500;
font-size: 22px;
position: relative;
top: 1px;
}
}
.line{
display: flex;
justify-content: space-between;
align-items: center;
// height: 20px;
font-size: 14px;
.price{
font-size: 16px;
color: #ff3500;
font-weight: bold;
}
}
.long_line{
font-size: 12px;
}
}
.salesItem:last-child{
border-bottom: none;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SalaryComponent } from './salary.component';
describe('SalaryComponent', () => {
let component: SalaryComponent;
let fixture: ComponentFixture<SalaryComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SalaryComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SalaryComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-salary',
templateUrl: './salary.component.html',
styleUrls: ['./salary.component.scss']
})
export class SalaryComponent implements OnInit {
practitionerIdEG: any;
practitionerId: any;
payScaleInfos: Array<any>;
//控制弹框
toastDialog: boolean;
toastInfo: any;
constructor(private myService: MyService, public lifeCommonService: LifeCommonService) { }
ngOnInit() {
this.practitionerIdEG = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerIdEG'];
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId']
this.payScaleListQuery();
}
payScaleListQuery() {
this.myService.payScaleListQuery({ practitionerIdEG: this.practitionerIdEG }).subscribe((res) => {
if (res['success']) {
this.payScaleInfos = res['data']['payScaleInfos'];
} else {
this.payScaleInfos = [];
}
})
}
//下载pdf
getPdf(monShId) {
this.myService.payScalePdf({ monShId: monShId, practitionerId: Number(this.practitionerId) }).subscribe((res) => {
if (res['success']) {
if (res['data']['url']) {
location.href = res['data']['url'];
} else {
this.toastDialog = true;
this.toastInfo = {
status: 1,
msg: '暂无薪资单!',
timeout: 3000,
align: 'center'
};
return;
}
}
})
}
}
<div class="salesWrapper">
<div class="top">
<ul class="tab">
<li *ngFor="let item of performanceList" (click)="selectRang(item.time)"
[ngClass]="{selected:searchType==item.time}">
{{item.name}}
</li>
</ul>
<ul class="tab">
<li (click)="platform=1;practitionerPolicyListQuery(1)" [ngClass]="{selected:platform==1}">线上</li>
<li (click)="platform=2;practitionerPolicyListQuery(2)" [ngClass]="{selected:platform==2}">寿险</li>
</ul>
</div>
<div class="salesContent">
<div class="salesItem" *ngFor="let salesDetailItem of salesDetailList"
(click)="jumpToOrderdetail(salesDetailItem.orderNo,salesDetailItem.platform,salesDetailItem.fortuneId)">
<div class="icon_bolck" *ngIf="showType==='sales'"><span class="iconfont icon-yongjin"></span></div>
<div class="icon_bolck" *ngIf="showType==='orderform'"><span class="iconfont icon-baodanyangben"
style="font-size: 20px;"></span></div>
<div class="line">
<div>投保人:{{salesDetailItem.holderName}}</div>
<span class="iconfont icon-ar-r" style="font-size: 10px;position: relative; right: -2px;"></span>
</div>
<div class="line long_line">
<span>{{salesDetailItem.productName ? salesDetailItem.productName:salesDetailItem.planName}}</span>
<div class="price" *ngIf="showType==='sales'">¥{{salesDetailItem.referralAmount | number: "1.2-2"}}</div>
<div class="price" *ngIf="showType==='orderform'">¥{{salesDetailItem.orderPrice | number: "1.2-2"}}</div>
</div>
<div class="line long_line">
<div>保单号:{{salesDetailItem.policyNo}}</div>
<div>{{(salesDetailItem.orderDate).substr(0,10)}}</div>
</div>
</div>
<div style="text-align: center;margin-top: 20px;" *ngIf="salesDetailList?.length<=0">暂无数据</div>
</div>
</div>
\ No newline at end of file
.salesWrapper{
width: 100%;
height: 100%;
overflow: auto;
.top{
display: flex;
justify-content: space-between;
align-items: center;
.tab{
display: flex;
list-style: none;
/* margin-bottom: 5px; */
margin: 10px 0px;
padding:0 2%;
justify-content: space-between;
li {
text-align: center;
// border: 1px #a9aabb solid;
// border-radius: 20px;
font-size: 16px;
}
li.selected{
// background-color: #ff5a32;
// color: #fff;
// border: 1px #f0f0f0 solid;
// border: 1px #e10d0d solid;
border-bottom: 2px #e10d0d solid;
font-weight: bold;
}
}
.tab:nth-child(1){
width: 50%;
}
.tab:nth-child(2){
width: 28%;
}
}
.salesContent{
.salesItem{
border-bottom: 1px #dcdcdc solid;
padding: 10px;
padding-left: 45px;
position: relative;
.icon_bolck{
border: 1px #dcdcdc solid;
width: 35px;
height: 35px;
position: absolute;
left: 3px;
top: 20px;
line-height: 30px;
text-align: center;
border-radius: 50%;
.iconfont{
color: #ff3500;
font-size: 22px;
position: relative;
top: 1px;
}
}
.line{
display: flex;
justify-content: space-between;
align-items: center;
// height: 20px;
font-size: 14px;
.price{
font-size: 16px;
color: #ff3500;
font-weight: bold;
}
}
.long_line{
font-size: 12px;
}
}
.salesItem:last-child{
border-bottom: none;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SalesDetailComponent } from './sales-detail.component';
describe('SalesDetailComponent', () => {
let component: SalesDetailComponent;
let fixture: ComponentFixture<SalesDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SalesDetailComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SalesDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { ActivatedRoute, Router } from "@angular/router";
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-sales-detail',
templateUrl: './sales-detail.component.html',
styleUrls: ['./sales-detail.component.scss']
})
export class SalesDetailComponent implements OnInit {
salesDetailList: Array<any>;
searchType: any;
performanceList: Array<any>;
showType: any;
platform: number;
constructor(private router: Router, private myService: MyService, private activatedRoute: ActivatedRoute, public lifeCommonService: LifeCommonService) {
this.performanceList = [
{ time: 1, name: '本月' },
{ time: 3, name: '本季' },
{ time: 2, name: '本年度' }
]
}
ngOnInit() {
this.searchType = this.activatedRoute.snapshot.queryParams.searchType;
this.showType = this.activatedRoute.snapshot.queryParams.showType;
this.platform = 1;
this.practitionerPolicyListQuery(this.platform);
}
//查询保单
practitionerPolicyListQuery(platform?: any) {
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.policyListQuery({ practitionerId: practitionerId, time: this.searchType }).subscribe((res) => {
if (res['success']) {
this.salesDetailList = res['data']['policyInfoList'];
if (platform == 1) {
this.salesDetailList = this.salesDetailList.filter(item => {
return item.platform == 1;
})
} else {
this.salesDetailList = this.salesDetailList.filter(item => {
return item.platform == 2;
})
}
} else {
this.salesDetailList = [];
}
})
}
selectRang(e) {
this.searchType = e;
this.practitionerPolicyListQuery(this.platform);
}
jumpToOrderdetail(orderNo, platform, fortuneId) {
if (platform === 1) {
const customerId = JSON.parse(localStorage.getItem('lifeCustomerInfo')).customerId;
window.location.href = `https://${window.location.host}/mine/orderdetail/${orderNo}?customerId=${customerId}&isReferral=true&paid=true&fortuneId=${fortuneId}`;
} else {
this.router.navigate(['/orderDetail'], { queryParams: { orderNo: orderNo } });
}
}
}
<div class="salesWrapper">
<div
style="height: 35px;line-height: 35px;float: left;width: 100%;font-size: 20px;margin-bottom: 5px;text-align: center;color: #ea2a37;">
<span class="iconfont icon-paihangbang" style="font-size: 30px;color: #ea2a37;"></span> 龙虎榜
</div>
<div class="title">
<ul class="tab">
<li *ngFor="let item of performanceList" (click)="rank(item.type,isOnlineType,searchType)"
[ngClass]="{selected:timeType==item.type}">
{{item.name}}
</li>
</ul>
<ul class="tab">
<li *ngFor="let listItem of typelist" (click)="rank(timeType,listItem.type,searchType)"
[ngClass]="{selected:isOnlineType==listItem.type}">
{{listItem.name}}
</li>
</ul>
<!-- <ul class="tab">
<li *ngFor="let searchListItem of searchList" (click)="rank(timeType,isOnlineType,searchListItem.type)"
[ngClass]="{selected:searchType==searchListItem.type}">
{{searchListItem.name}}
</li>
</ul> -->
</div>
<div class="rankContent">
<ul>
<li>排名</li>
<li>姓名</li>
<li>团队</li>
<li *ngIf="searchType=='1'" style="color: #333;font-weight: normal;" (click)="rank(timeType,isOnlineType,2)">
首年保费<span class="iconfont icon-xiangxia"></span>
</li>
<li *ngIf="searchType=='2'" style="color: #333;font-weight: normal;" (click)="rank(timeType,isOnlineType,3)">
首年佣金<span class="iconfont icon-xiangxia"></span>
</li>
<li *ngIf="searchType=='3'" style="color: #333;font-weight: normal;margin-right: 0;"
(click)="rank(timeType,isOnlineType,1)">
件数<span class="iconfont icon-xiangxia"></span>
</li>
</ul>
<div style="width: 100%;text-align: center;float: left;" *ngIf="rankList?.length <=0">暂无数据</div>
<ul *ngFor="let rankItem of rankList;index as i;">
<li class="icon">
<ng-container *ngIf="i<=2">
<div [ngSwitch]="i+1">
<i class="iconfont icon-medal" *ngSwitchCase="1"
[ngStyle]="{'color':'#fdb941','position': 'absolute','left':'0','font-size':'35px','top':'0','right':'0','bottom':'0','margin':'-3px auto'}"></i>
<i class="iconfont icon-medal" *ngSwitchCase="2"
[ngStyle]="{'color':'#b4b9c1','position': 'absolute','left':'0','font-size':'35px','top':'0','right':'0','bottom':'0','margin':'-3px auto'}"></i>
<i class="iconfont icon-medal" *ngSwitchCase="3"
[ngStyle]="{'color':'#ca8a6e','position': 'absolute','left':'0','font-size':'35px','top':'0','right':'0','bottom':'0','margin':'-3px auto'}"></i>
<i class="iconfont icon-medal" *ngSwitchDefault
[ngStyle]="{'color':'#fdb941','position': 'absolute','left':'0','font-size':'35px','top':'0','right':'0','bottom':'0','margin':'-3px auto'}"></i>
</div>
</ng-container>
{{rankItem.rank}}
</li>
<li>{{rankItem.name}}</li>
<li>{{rankItem.subordinateSystemName}}</li>
<li *ngIf="searchType==1">¥{{rankItem.fyp | number: "1.2-2"}}</li>
<li *ngIf="searchType==2">¥{{rankItem.fyc | number: "1.2-2"}}</li>
<li *ngIf="searchType==3">{{rankItem.count}}</li>
</ul>
</div>
<div class="rankContent">
<ul>
<li>{{practitionerInfo?.rank!=null ?practitionerInfo?.rank:'-'}}</li>
<li>{{practitionerBasicInfo?.name}}</li>
<li>{{practitionerBasicInfo?.subordinateName}}</li>
<li *ngIf="searchType=='1'">{{practitionerInfo?.fyp}}</li>
<li *ngIf="searchType=='2'">{{practitionerInfo?.fyc}}</li>
<li *ngIf="searchType=='3'">{{practitionerInfo?.count}}</li>
</ul>
</div>
</div>
\ No newline at end of file
.salesWrapper{
padding: 10px 5px;
// background: #002495;
background: #0664a4;
height: 100%;
ul,ol{
list-style: none;
}
.title{
display: flex;
margin-bottom: 10px;
padding: 10px 15px;
justify-content: space-between;
width: 100%;
align-items: center;
ul.tab{
display: flex;
li{
margin-right: 5px;
text-align: left;
height: 30px;
line-height: 30px;
color: #fff;
}
li.selected{
font-size: 18px;
font-weight: bold;
border-bottom: 2px #ff002a solid;
}
li:last-child{
margin-right: 0;
}
}
ul.tab:nth-child(3){
width: 55%;
float: right;
margin-right: 0;
li{
width: 38%;
margin-right: 2%;
text-align: center;
}
li:nth-child(3){
float: right;
width: 20%;
margin-right: 0;
}
}
}
.rankContent{
float: left;
width: 100%;
overflow: auto;
background: #fff;
box-shadow: 0 0px 2.5px #969696;
border-radius: 6px;
padding: 5px 10px 5px 5px;
margin-bottom: 20px;
ul{
width: 100%;
li{
float: left;
width: 30%;
height: 34px;
line-height: 34px;
text-align: left;
margin-right: 1%;
position: relative;
margin-bottom: 5px;
overflow: hidden;
height: 30px;
li.icon .iconfont{
position: absolute;
}
}
li:nth-child(1){
width: 16%;
text-align: center;
}
li:nth-child(3){
width: 20%;
}
li:nth-child(4){
text-align: right;
color: #ff002a;
font-weight: bold;
font-size: 15px;
}
}
}
.personal{
color: #fff;
span{
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SalesRankComponent } from './sales-rank.component';
describe('SalesRankComponent', () => {
let component: SalesRankComponent;
let fixture: ComponentFixture<SalesRankComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SalesRankComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SalesRankComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from "@angular/router";
import { MyService } from "../my.service";
@Component({
selector: 'ydlife-sales-rank',
templateUrl: './sales-rank.component.html',
styleUrls: ['./sales-rank.component.scss']
})
export class SalesRankComponent implements OnInit {
time: any;
performanceList: Array<any>;
typelist: Array<any>;
searchList: Array<any>;
timeType: any;
searchType: any;
isOnlineType: any;
rankList: Array<any>;
practitionerInfo: any;
practitionerBasicInfo: any;
constructor(private activatedRoute: ActivatedRoute, private myService: MyService) {
this.performanceList = [
{ type: 1, name: '本月' },
{ type: 3, name: '季度' },
{ type: 2, name: '本年' }
]
this.typelist = [
{ type: 1, name: '线上' },
{ type: 2, name: '寿险' },
]
this.searchList = [
{ type: 1, name: '首年保费' },
{ type: 2, name: '首年佣金' },
{ type: 3, name: '件数' }
]
}
ngOnInit() {
this.practitionerBasicInfo = JSON.parse(localStorage.getItem("lifeCustomerInfo"))['practitionerBasicInfo'];
this.time = this.activatedRoute.snapshot.queryParams.time ? Number(this.activatedRoute.snapshot.queryParams.time) : null;
//初始化查线上保费
this.rank(this.time, 1, 1)
}
/**
* time 1-month,2-year,3-季度
* type 1-fyc,2-fyp 3-件数
* platform //1-online,2-offline
*/
rank(time, platform, type) {
this.timeType = time;
this.isOnlineType = platform;
this.searchType = type;
const param = {
mobileNo: JSON.parse(localStorage.getItem('lifeCustomerInfo'))['mobileNo'],
time: time,
platform: platform,
type: type
}
this.myService.rank(param).subscribe((res) => {
if (res['success']) {
this.rankList = res['data']['rank'];
this.practitionerInfo = res['data']['practitionerInfo'];
} else {
this.rankList = [];
this.practitionerInfo = {};
}
})
}
}
<div class="scoreDetail_wrapper">
<div class="top">
<div>销售活动量分值详情</div>
<ul>
<!-- <li [ngClass]="{selected:selectedTime===''}" (click)="salesScoreDetailQuery('')">全部</li> -->
<li [ngClass]="{selected:selectedTime==='D'}" (click)="salesScoreDetailQuery('D')">今天</li>
<li [ngClass]="{selected:selectedTime==='W'}" (click)="salesScoreDetailQuery('W')">本周</li>
<li [ngClass]="{selected:selectedTime==='M'}" (click)="salesScoreDetailQuery('M')">本月</li>
</ul>
</div>
<div class="contentWrapper">
<div *ngIf="salesScoreDetails?.length>0">
<div class="content" *ngFor="let scoreItem of salesScoreDetails">
<span>{{scoreItem.dropOptionsName}}</span>
<span>{{scoreItem.number * scoreItem.score}}</span>
</div>
</div>
<div class="tips" *ngIf="salesScoreDetails?.length<=0">暂无销售活动量得分</div>
</div>
</div>
\ No newline at end of file
ul ,ol{
list-style: none;
}
.scoreDetail_wrapper{
padding: 10px 15px;
.top{
display: flex;
justify-content: space-between;
align-items: center;
height: 35px;
margin-bottom: 15px;
ul{
width: 40%;
display: flex;
justify-content: space-between;
align-items: center;
li.selected{
font-weight: bold;
border-bottom: 2px #ff002a solid;
}
}
}
.contentWrapper{
.content{
display: flex;
justify-content: space-between;
align-items: center;
height: 30px;
}
.tips{
text-align: center;
height: 40px;
line-height: 40px;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ScoreDetailsComponent } from './score-details.component';
describe('ScoreDetailsComponent', () => {
let component: ScoreDetailsComponent;
let fixture: ComponentFixture<ScoreDetailsComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ScoreDetailsComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ScoreDetailsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-score-details',
templateUrl: './score-details.component.html',
styleUrls: ['./score-details.component.scss']
})
export class ScoreDetailsComponent implements OnInit {
salesScoreDetails: Array<any>;
selectedTime: string;
constructor(private myService: MyService) { }
ngOnInit() {
this.selectedTime = 'D';
this.salesScoreDetailQuery('D');
}
//销售活动量详情D-天 W-周 M-月
salesScoreDetailQuery(time) {
this.selectedTime = time;
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.myService.salesScoreDetailQuery({ practitionerId: practitionerId, time: this.selectedTime }).subscribe((res) => {
if (res['success']) {
this.salesScoreDetails = res['data']['salesScoreDetails'];
}
})
}
}
<div class="taem_panel_wrapper">
<div class="teamInfo">
<span class="icon-tuandui iconfont"
style="position: absolute;width:45px;height:45px;line-height:35px;font-size: 30px;left:0;border: 1px #dcdcdc solid; padding: 5px;border-radius: 50%;"></span>
<div style="float: left;">{{subordinateSystemName}}战队</div>
</div>
<div class="taem_panel_item_wrapper">
<div class="taem_panel_item_top">
<div class="item_title">
战队业绩(¥)
</div>
<ul class="tab">
<li [ngClass]="{selected:selectedRecruitingItem===1}" (click)="subordinateSystemMemberQuery(1)">本月</li>
<li [ngClass]="{selected:selectedRecruitingItem===3}" (click)="subordinateSystemMemberQuery(3)">本季</li>
<li [ngClass]="{selected:selectedRecruitingItem===2}" (click)="subordinateSystemMemberQuery(2)">本年</li>
</ul>
</div>
<div class="taem_panel_item_content">
<ul>
<li class="big" style="width: 30%;">{{statisticInfo?.fyp | number: "1.0-2"}}</li>
<li class="big" style="width: 30%;">{{statisticInfo?.fyc | number: "1.0-2"}}</li>
<li class="big" style="width: 15%;">{{statisticInfo?.count | number}}</li>
<li class="big" style="width: 15%;">{{statisticInfo?.completionRate + '%'}}</li>
</ul>
<ul>
<li style="width: 30%;">首年保费</li>
<li style="width: 30%;">首年佣金</li>
<li style="width: 15%;">件数</li>
<li style="width: 15%;">达成率</li>
</ul>
</div>
<div class="next">
<span class="iconfont icon-ar-r" routerLink="/teamRank"></span>
</div>
</div>
<div class="taem_panel_item_wrapper">
<div class="taem_panel_item_top">
<div class="item_title">
战队销售活动量
</div>
</div>
<div class="taem_panel_item_content">
<ul>
<li class="big">{{this.teamActionsData?.scoreDayAverage?this.teamActionsData?.scoreDayAverage:'0'}}</li>
<li class="big">{{this.teamActionsData?.scoreWeekAverage?this.teamActionsData?.scoreWeekAverage:'0'}}</li>
<li class="big">{{this.teamActionsData?.scoreMonthAverage?this.teamActionsData?.scoreMonthAverage:'0'}}</li>
<li class="big">{{this.teamActionsData?.opportunitiesNum?this.teamActionsData?.opportunitiesNum:'0'}}</li>
</ul>
<ul>
<li>今天平均</li>
<li>本周平均</li>
<li>本月平均</li>
<li>本周新增商机</li>
</ul>
</div>
<div class="next">
<span class="iconfont icon-ar-r" routerLink="teamSalesScore"></span>
</div>
</div>
<div class="taem_panel_item_wrapper">
<div class="taem_panel_item_top">
<div class="item_title">
我的增员活动量
</div>
</div>
<div class="taem_panel_item_content">
<ul>
<li class="big">{{recruitingStatistics?.activityForToday}}</li>
<li class="big">{{recruitingStatistics?.activityForWeek}}</li>
<li class="big">{{recruitingStatistics?.activityForMonth}}</li>
<li class="big" style="width: 30%;">{{recruitingStatistics?.recruitSucceed}}</li>
</ul>
<ul>
<li>今天</li>
<li>本周</li>
<li>本月</li>
<li style="width: 30%;">本月新增对象</li>
</ul>
</div>
<div class="next">
<span class="iconfont icon-ar-r" routerLink="/recruiting"></span>
</div>
</div>
<div class="taem_panel_item_wrapper">
<div class="taem_panel_item_top">
<div class="item_title">
战队销售业绩预测(¥)
</div>
<ul class="tab">
<li [ngClass]="{selected:selectedSalseItem==='month'}" (click)="selectSales('month')">本月</li>
<li [ngClass]="{selected:selectedSalseItem==='quarter'}" (click)="selectSales('quarter')">本季</li>
<li [ngClass]="{selected:selectedSalseItem==='year'}" (click)="selectSales('year')">本年</li>
</ul>
</div>
<div class="taem_panel_item_content forecast">
<ul>
<li class="big">{{premiums?lifeCommonService.transform(premiums):'0'}}</li>
<li class="big">{{commission?lifeCommonService.transform(commission):'0'}}</li>
<li class="big">{{count?count:'0'}}</li>
<li class="big">{{completionRates?completionRates + '%':'0%'}}</li>
</ul>
<ul>
<li>{{selectedSalseItemName}}保费</li>
<li>{{selectedSalseItemName}}佣金</li>
<li>{{selectedSalseItemName}}件数</li>
<li>{{selectedSalseItemName}}完成率</li>
</ul>
</div>
<div class="next">
<span class="iconfont icon-ar-r" routerLink="forecast"></span>
</div>
</div>
</div>
\ No newline at end of file
.taem_panel_wrapper{
padding: 5px 8px;
background: #eff0f1;
// background: #0664a4;
height: auto;
ul li,ol li{
list-style: none;
}
.teamInfo{
font-size: 24px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
padding: 15px 0 10px 0;
text-align: center;
overflow: hidden;
border-radius: 6px;
color: #ff002a;
}
.taem_panel_item_wrapper{
margin: 10px 0;
background: #fff;
box-shadow: 0 0px 2.5px #eceaea;
border-radius: 6px;
padding: 8px 10px;
.taem_panel_item_top{
display: flex;
justify-content: space-between;
align-items: center;
height: 38px;
.item_title{
font-weight: bold;
font-size: 16px;
}
.tab{
display: flex;
width: 35%;
justify-content: space-around;
li.selected{
font-weight: bold;
border-bottom: 3px red solid;
}
}
}
.taem_panel_item_content{
ul{
display: flex;
justify-content: space-between;
li{
width: 20%;
text-align: center;
height: 30px;
line-height: 30px;
overflow: hidden;
}
li.big{
font-size: 16px;
}
li:nth-child(4){
width: 30%;
}
}
}
.taem_panel_item_content.forecast{
ul li{
width: 20%;
}
ul li:nth-child(3){
width: 18%;
}
ul li:nth-child(1){
width: 40%;
}
}
.next{
text-align: right;
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { TeamPanelComponent } from './team-panel.component';
describe('TeamPanelComponent', () => {
let component: TeamPanelComponent;
let fixture: ComponentFixture<TeamPanelComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TeamPanelComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TeamPanelComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-team-panel',
templateUrl: './team-panel.component.html',
styleUrls: ['./team-panel.component.scss']
})
export class TeamPanelComponent implements OnInit {
//战队名称
subordinateSystemName: any;
teamActionsData: any;
//保费
premiums: number;
//佣金
commission: number;
//件数
count: number;
//完成率
completionRates: number;
selectedSalseItem: any;
selectedSalseItemName: any;
practitionerId: any;
recruitingStatistics: any;
selectedRecruitingItem: any;
statisticInfo: any;
constructor(private myService: MyService, public lifeCommonService: LifeCommonService) { }
ngOnInit() {
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.subordinateSystemName = sessionStorage.getItem('subordinateSystemName');
this.teamActionsAverageQuery();
this.potentialActivityQuery();
this.subordinateSystemMemberQuery(1);
}
teamActionsAverageQuery() {
this.myService.teamActionsAverageQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
if (res['success']) {
this.teamActionsData = res['data'];
this.selectSales('month')
}
})
}
selectSales(type) {
this.selectedSalseItem = type;
if (type === 'month') {
this.selectedSalseItemName = '本月';
this.premiums = this.teamActionsData.premiumMonth;
this.commission = this.teamActionsData.commissionMonth;
this.count = this.teamActionsData.piecesMonth;
this.completionRates = this.teamActionsData.achievementRateMonth;
}
if (type === 'quarter') {
this.selectedSalseItemName = '本季';
this.premiums = this.teamActionsData.premiumQuarter;
this.commission = this.teamActionsData.commissionQuarter;
this.count = this.teamActionsData.piecesQuarter;
this.completionRates = this.teamActionsData.achievementRateQuarter;
}
if (type === 'year') {
this.selectedSalseItemName = '本年';
this.premiums = this.teamActionsData.premiumYear;
this.commission = this.teamActionsData.commissionYear;
this.count = this.teamActionsData.piecesYear;
this.completionRates = this.teamActionsData.achievementRateYear;
}
}
subordinateSystemMemberQuery(type) {
this.selectedRecruitingItem = type;
const param = {
time: type,
practitionerId: this.practitionerId
}
this.myService.subordinateSystemMemberQuery(param).subscribe((res) => {
if (res['success']) {
this.statisticInfo = res['data']['statisticInfo']
}
})
}
//增员统计
potentialActivityQuery() {
this.myService.potentialActivityQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
if (res['success']) {
this.recruitingStatistics = res['data'];
}
})
}
}
<div class="salesWrapper">
<div class="teamHeader">
<div class="teamItem teamInfo">
<span class="icon-tuandui iconfont"
style="position: absolute;width:45px;height:45px;line-height:35px;font-size: 30px;left:0;border: 1px #dcdcdc solid; padding: 5px;border-radius: 50%;"></span>
<div style="float: left;">{{subordinateSystemName}}战队</div>
</div>
<div class="teamItem totalSales">
<div class="teamTotal">
<div style="padding-left: 5px;color: #fff;"> 战队业绩</div>
<div class="title">
<ul class="tab">
<li *ngFor="let item of performanceList" (click)="subordinateSystemMemberQuery(item.time, online)"
[ngClass]="{selected:time==item.time}">
{{item.name}}
</li>
</ul>
</div>
</div>
<div class="salseContent">
<div class="num">¥{{statisticInfo?.fyp | number: "1.2-2"}}</div>
<div class="num">¥{{statisticInfo?.fyc | number: "1.2-2"}}</div>
<div class="num count">{{statisticInfo?.count}}</div>
</div>
<div class="salseContent">
<div>首年保费</div>
<div>首年佣金</div>
<div class="count">件数</div>
</div>
</div>
</div>
<div class="rankInfoWrapper">
<div class="rankContent">
<div style="font-size: 18px;margin-bottom: 10px;">战队排名</div>
<ul>
<!-- <li class="rank">排名</li> -->
<li class="name">姓名</li>
<li class="fyp">首年保费</li>
<li class="fyc">首年佣金</li>
<li class="count">件数</li>
</ul>
<div style="width: 100%;text-align: center;float: left;height: 35px;" *ngIf="performanceListShow?.length <=0">
暂无战队成员,努力去增员吧
</div>
<ul *ngFor="let performanceItem of performanceListShow;index as i;">
<!-- <li class="rank">
{{performanceItem.rank}}
</li> -->
<li class="name">{{performanceItem.name}}</li>
<li class="fyp remark">¥{{performanceItem.fyp | number: "1.0-2"}}</li>
<li class="fyc remark">¥{{performanceItem.fyc | number: "1.0-2"}}</li>
<li class="count remark">{{performanceItem.count}}</li>
</ul>
</div>
</div>
</div>
\ No newline at end of file
.salesWrapper{
padding: 0 10px 20px 10px;
background: #f6f7f2;
// background: #f7f7f2;
min-height: 100%;
height: auto;
overflow: hidden;
ul,ol{
list-style: none;
}
.teamHeader{
color: #ff002a;
.teamItem {
text-align: center;
overflow: hidden;
border-radius: 6px;
}
.teamItem.teamInfo{
font-size: 24px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
padding:15px 0 10px 0;
}
.teamItem.totalSales{
margin: 8px 0px;
padding: 10px 0;
background: url('../../../assets/images/bg_02.jpg') no-repeat ;
box-shadow: 0 0px 2.5px #eceaea;
background-size: cover;
.teamTotal{
width: 100%;
font-size: 18px;
color: #333;
display: flex;
margin-bottom: 10px;
justify-content: space-between;
.title{
color: #333;
width: 60%;
ul.tab{
float: right;
width: 70%;
font-size: 16px;
color: #fff;
li{
float: left;
margin-right: 5px;
text-align: left;
height: 30px;
line-height: 30px;
margin-right: 12%;
}
li.selected{
font-size: 18px;
font-weight: bold;
border-bottom: 2px #ff002a solid;
}
li:nth-child(3){
margin-right: 0;
}
}
ul.tab:nth-child(3){
width: 37%;
float: right;
li:nth-child(3){
float: right;
margin-right: 5%;
}
}
}
}
.salseContent{
width: 100%;
float: left;
padding: 5px 2.5%;
div{
float: left;
width: 40%;
text-align: center;
color: #dcdcdc;
font-size: 12px;
}
div.num{
font-weight: bold;
font-size: 18px;
color: #fff;
}
div.count{
width: 18%;
}
}
}
}
.rankInfoWrapper{
overflow: auto;
width: 100%;
float: left;
.rankContent{
float: left;
width: 100%;
overflow: auto;
background: #fff;
box-shadow: 0 0px 2.5px #eceaea;
border-radius: 6px;
padding: 5px;
ul{
width: 100%;
height: 30px;
line-height: 30px;
li{
float: left;
width: 28%;
text-align: right;
margin-right: 1%;
position: relative;
margin-bottom: 5px;
overflow: hidden;
height: 30px;
li.icon .iconfont{
position: absolute;
}
}
li.name,li.count{
width: 18%;
}
li.name{
text-align: center;
}
li.remark{
font-weight: bold;
color: #ff002a;
}
}
}
}
}
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { TeamRankComponent } from './team-rank.component';
describe('TeamRankComponent', () => {
let component: TeamRankComponent;
let fixture: ComponentFixture<TeamRankComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TeamRankComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TeamRankComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MyService } from '../my.service';
@Component({
selector: 'ydlife-team-rank',
templateUrl: './team-rank.component.html',
styleUrls: ['./team-rank.component.scss']
})
export class TeamRankComponent implements OnInit {
performanceListShow: Array<any>;
performanceList: Array<any>;
list: Array<any>;
time: any;
lineType: any;
allPerformanceInfo: any;
subordinateSystemName: string;
statisticInfo: any;
constructor(private myService: MyService) {
this.performanceList = [
{ time: 1, name: '本月' },
{ time: 3, name: '本季' },
{ time: 2, name: '本年' }
]
this.list = [
{ type: 'online', name: '线上' },
{ type: 'underLine', name: '寿险' },
]
}
ngOnInit() {
this.performanceListShow = [];
this.subordinateSystemMemberQuery(1, 'online');
}
//初始化查询本月+线上
subordinateSystemMemberQuery(time, online?: any) {
this.time = time;
this.lineType = online;
const practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
//如果是寿险不显示
if (online == 'underLine') {
this.allPerformanceInfo = null
} else {
this.myService.subordinateSystemMemberQuery({ practitionerId: practitionerId, time: time }).subscribe((res) => {
if (res['success']) {
this.allPerformanceInfo = res['data'];
this.subordinateSystemName = res['data']['subordinateSystemName'];
this.statisticInfo = res['data']['statisticInfo'];
this.performanceListShow = res['data']['memberInfoList'];
}
})
}
}
}
<div class="team_sales_detail_wrapper">
<div class="teamHeader">
<div class="teamItem teamInfo">
<span class="icon-tuandui iconfont"
style="position: absolute;width:45px;height:45px;line-height:35px;font-size: 30px;left:0;border: 1px #dcdcdc solid; padding: 5px;border-radius: 50%;"></span>
<div style="float: left;">{{subordinateSystemName}}战队</div>
</div>
</div>
<div *ngIf="this.showType==='teamSalesScore'">
<div class="rankInfoWrapper">
<div class="rankContent">
<div style="font-size: 18px;margin-bottom: 10px;">战队成员销售活动量得分</div>
<div class="content_wrapper">
<ul>
<li>姓名</li>
<li>今天得分</li>
<li>本周得分</li>
<li>本月得分</li>
<li>本周新增商机</li>
</ul>
<div style="width: 100%;text-align: center;float: left;height: 35px;"
*ngIf="playerSalesActivityInfo?.length <=0">
暂无战队成员,努力去增员吧
</div>
<ul *ngFor="let playerSalesActivityItem of playerSalesActivityInfo;index as i;">
<li>{{playerSalesActivityItem.name}}</li>
<li>{{playerSalesActivityItem.scoreDay!=null?playerSalesActivityItem.scoreDay:'-'}}</li>
<li>{{playerSalesActivityItem.scoreWeek!=null?playerSalesActivityItem.scoreWeek:'-'}}</li>
<li>{{playerSalesActivityItem.scoreMonth!=null?playerSalesActivityItem.scoreMonth:'-'}}</li>
<li>{{playerSalesActivityItem.addOpportunityNum!=null?playerSalesActivityItem.addOpportunityNum:'-'}}</li>
</ul>
</div>
</div>
</div>
</div>
<div *ngIf="this.showType==='forecast'">
<div class="rankInfoWrapper">
<div class="rankContent">
<div class="tab">
<div style="font-size: 18px;">战队销售业绩预测(预计)</div>
<ul>
<li [ngClass]="{selected:selectedSalseItem==='m'}" (click)="salesPerformanceForecastListQuery('m')">本月</li>
<li [ngClass]="{selected:selectedSalseItem==='q'}" (click)="salesPerformanceForecastListQuery('q')">本季</li>
<li [ngClass]="{selected:selectedSalseItem==='y'}" (click)="salesPerformanceForecastListQuery('y')">本年</li>
</ul>
</div>
<div class="content_wrapper forecast">
<ul>
<li class="name">姓名</li>
<li>FYP</li>
<li>FYC</li>
<li class="count">件数</li>
<li>完成率</li>
</ul>
<div style="width: 100%;text-align: center;float: left;height: 35px;"
*ngIf="salesPerformanceForecastInfos?.length <=0">
暂无战队成员,努力去增员吧
</div>
<ul *ngFor="let forecastItem of salesPerformanceForecastInfos;index as i;">
<li class="name">{{forecastItem.name}}</li>
<li>{{forecastItem.premium!=null?'¥'+lifeCommonService.transform(forecastItem.premium):'-'}}</li>
<li>{{forecastItem.commission!=null?'¥'+lifeCommonService.transform(forecastItem.commission):'-'}}</li>
<li class="count">{{forecastItem.pieces!=null?forecastItem.pieces:'-'}}</li>
<li>{{forecastItem.achievementRate!=null?lifeCommonService.toPercent(forecastItem.achievementRate):'-' }}
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
\ No newline at end of file
.team_sales_detail_wrapper{
padding: 5px 8px;
background: #eff0f1;
overflow: auto;
height: 100%;
ul li,ol li{
list-style: none;
}
.teamInfo{
font-size: 24px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
padding: 15px 0 10px 0;
text-align: center;
overflow: hidden;
border-radius: 6px;
color: #ff002a;
}
.rankInfoWrapper{
overflow: auto;
width: 100%;
float: left;
.rankContent{
float: left;
width: 100%;
overflow: auto;
background: #fff;
box-shadow: 0 0px 2.5px #eceaea;
border-radius: 6px;
padding: 5px;
.tab{
display: flex;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
align-items: center;
ul{
width: 30%;
display: flex;
justify-content: space-between;
li.selected{
font-weight: bold;
border-bottom: 2px red solid;
}
}
}
.content_wrapper{
ul{
width: 100%;
height: 30px;
line-height: 30px;
li{
float: left;
width: 18%;
text-align: center;
margin:0 1%;
position: relative;
margin-bottom: 5px;
overflow: hidden;
height: 30px;
li.icon .iconfont{
position: absolute;
}
}
li.name{
width: 20%;
}
li:last-child{
margin-right: 0;
}
}
}
.content_wrapper.forecast{
ul li{
width: 28%;
margin: 0;
overflow: hidden;
}
ul li:nth-child(2),ul li:nth-child(3){
text-align: right;
}
ul li:nth-child(3){
width: 22%;
}
ul li:nth-child(4),ul li:nth-child(5){
width: 16%;
}
ul li.name{
width: 15%;
}
}
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { TeamSalesScoreComponent } from './team-sales-score.component';
describe('TeamSalesScoreComponent', () => {
let component: TeamSalesScoreComponent;
let fixture: ComponentFixture<TeamSalesScoreComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TeamSalesScoreComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TeamSalesScoreComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from "@angular/router";
import { MyService } from '../my.service';
import { LifeCommonService } from '../../common/life-common.service';
@Component({
selector: 'ydlife-team-sales-score',
templateUrl: './team-sales-score.component.html',
styleUrls: ['./team-sales-score.component.scss']
})
export class TeamSalesScoreComponent implements OnInit {
showType: any;
practitionerId: any;
subordinateSystemName: any;
playerSalesActivityInfo: Array<any>;
selectedSalseItem: any;
salesPerformanceForecastInfos: Array<any>;
constructor(private activateRoute: ActivatedRoute, private router: Router,
private myService: MyService, public lifeCommonService: LifeCommonService) { }
ngOnInit() {
this.practitionerId = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerId'];
this.subordinateSystemName = sessionStorage.getItem('subordinateSystemName');
//判断显示销售得分还是销售预测
this.showType = this.activateRoute.snapshot.paramMap.get('type');
if (this.showType === 'teamSalesScore') {
this.playerSalesActivityQuery()
}
if (this.showType === 'forecast') {
this.salesPerformanceForecastListQuery('m')
}
}
//获取成员销售活动量得分
playerSalesActivityQuery() {
this.myService.playerSalesActivityQuery({ practitionerId: this.practitionerId }).subscribe((res) => {
if (res['success']) {
this.playerSalesActivityInfo = res['data']['playerSalesActivityInfo']
}
})
}
salesPerformanceForecastListQuery(type) {
this.selectedSalseItem = type;
const param = {
practitionerId: this.practitionerId,
time: type
}
this.myService.salesPerformanceForecastListQuery(param).subscribe((res) => {
if (res['success']) {
this.salesPerformanceForecastInfos = res['data']['salesPerformanceForecastInfos']
}
})
}
}
<div class="wrapper">
<div #letter_src id="letter_src">
<div class="chinese">
亲爱的 <span style="font-weight: bold;">{{brokerInfo?.name}}</span>
<br /><br />
我谨代表股东,管理团队和员工,欢迎您来到上海银盾保险经纪有限公司!
<br /><br />今天是非常特殊的一天,因为这是您来银盾的第一天,也是我们有幸获得了与您合作的第一天。我们将在共同信任的基础上,度过您在公司工作的岁月。这种理解和信任是愉快奋斗的主轴与纽带。
<br /><br />
我们公司相信并尊重个人的成长和力量,同时也非常注重团队合作精神。我们鼓励您尽快结识您的新同事,尤其是您团队中的同事。您的团队负责人是<span
style="font-weight: bold;">{{brokerInfo?.subordinateLeader}}</span>。如果您有对您的工作以及与之相关的任何困惑或困难,建议您第一时间咨询您的团队长。
<br /><br />上海银盾保险经纪有限公司是一个员工在帮助我们各行各业的客户中得到认可,尊重和快乐的地方,同时也为自己能成为社会建设中的重要支柱而感到自豪。
<br /><br />
每个人都需要有一个正确的方向,向着这个正确的方向努力一定会达成目标!我很高兴您选择加入银盾这个“大家庭”,因为我们拥有共同的目标和热忱帮助每个人和每个家庭规划圆满富足的人生!我们公司也将尽最大努力帮助您建立和实现您的目标和梦想。
<br /><br />我们公司的文化是“海纳百川,赢家后盾”;我们的团队文化是“精诚合作,荣辱与共”;我们的个人文化是“持续学习,与优秀为伍”!
<br /><br />希望您也能与我们一起学习和成长,共同带领公司迈向新高度。<br /><br />(签名)<img style="max-width: 45%;margin-left: 5%;"
src="assets/images/sign.png" alt=""><br />
<br />
万双莲<br /><br />
银盾保险经纪董事长
<br />
<br />
</div>
<div class="english" style="letter-spacing: 1px;">
Dear <span style="font-weight: bold;">{{brokerInfo?.name}}</span>,<br /><br />
On behalf the shareholders, the management team and staff, I would like to personally
welcome you on board with Yin Dun Insurance Brokers Co Ltd!<br /><br />
Today is a very special day as it is your first day of work with us and we are honoured that you have entrusted us
with this co-operation opportunity. We are very much looking forward to the coming days and years that we will be
working together based on mutual understandings and trust, which will form the bridge and connections to our
future
happy endeavours!
<br />
<br />
Our company believes in nurturing of individual growth and strength with a great focus also on team spirit. We
would
encourage you to get to know your colleagues especially those in your team. The Head of your team is
<span style="font-weight: bold;">{{brokerInfo?.subordinateLeader}}</span> . You are advised to consult your
team leader in the first instance in matters of
any confusion or difficulty with your work and anything associated with it.
<br /><br />
Yin Dun Insurance Brokers Co Ltd is a place where employees find their passion
for helping our clients from various walks of life and find cherishing moments in being constructive pillars of
society.
<br /><br />
One always needs a right life direction and once chosen, perseverance will take you to your goals with hardworking
and diligence! I am very pleased that you have chosen to join the Yin Dun “big family” for our shared goals and
great love of helping individuals of society be happy and complete! We at Yin Dun Insurance Brokers Co Ltd shall
try
our best to help you realize and establish your goals and dreams to the fullest.
<br /><br />
Our company culture is “海纳百川,赢家后盾”;our team culture is“精诚合作,荣辱与共”;and our culture for each individual is
“持续学习,与优秀为伍”!<br /><br />
We hope you have a great learning and growth experience with us, and collectively lead the
company to greater heights.<br /><br />
With Regards<br /><br />
(Signature)<img style="max-width: 45%;margin-left: 5%;" src="assets/images/sign.png" alt=""><br /><br />
Sharon Wan <br /><br />
Chairman, Yindun Insurance Brokerage
</div>
<p class="closeBtn" (click)="close()">&times;</p>
</div>
<!-- <div id="letter"></div>
<img #inkwell1 id="inkwell1" src="inkwell1.gif" alt="inkwell1" />
<img id="inkwell2" src="inkwell2.gif" alt="inkwell2" /> -->
</div>
\ No newline at end of file
#inkwell1 {
bottom: 100px;
left: 140px;
position: fixed;
}
#inkwell2 {
bottom: 100px;
left: 140px;
position: fixed;
visibility: hidden;
}
#letter {
font-family: Comic Sans MS;
font-size: 18px;
font-weight: bold;
margin: 50px auto;
position: relative;
width: 75%;
}
#letter_src{
font-size: 16px;
margin: 0 auto;
position: relative;
width: 100%;
word-break:break-all;
background-color: #efefef;
background-image: linear-gradient(#e7e6e6 1px, transparent 0),
linear-gradient(90deg, #e7e6e6 1px, transparent 0);
background-size: 21px 21px, 21px 21px;
background-position: center;
padding: 15px 10px;
// padding-top: 60px;
letter-spacing: 2px;
}
// #letter_src div.chinese{
// font-family: 'kaiti';
// }
// #letter_src div.english{
// font-family: Comic Sans MS;
// }
// #letter_src:before,
// #letter_src:after{
// content: '';
// position: absolute;
// z-index: 0;
// left: 50%;
// transform: translateX(-50%);
// display: inline-block;
// background-color: #fff;
// height: 28px;
// box-shadow: 68px 0 0 0 #fff,
// calc(68px * 2) 0 0 0 #fff,
// calc(68px * 3) 0 0 0 #fff,
// calc(68px * 4) 0 0 0 #fff,
// calc(68px * 5) 0 0 0 #fff,
// -68px 0 0 0 #fff,
// calc(68px * -2) 0 0 0 #fff,
// calc(68px * -3) 0 0 0 #fff,
// calc(68px * -4) 0 0 0 #fff,
// calc(68px * -5) 0 0 0 #fff;
// }
// #letter_src:before {
// top: 0;
// width: 10px;
// }
// #letter_src:after {
// top: 26px;
// width: 28px;
// border-radius: 50%;
// }
.closeBtn{
font-size: 30px;
text-align: center;
width: 45px;
height: 45px;
line-height: 42px;
margin: 10px auto;
border-radius: 50%;
background: #0767bf;
color: #fff;
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ThanksComponent } from './thanks.component';
describe('ThanksComponent', () => {
let component: ThanksComponent;
let fixture: ComponentFixture<ThanksComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ThanksComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ThanksComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, ViewChild, AfterViewInit, ElementRef } from '@angular/core';
import { Router } from "@angular/router";
@Component({
selector: 'ydlife-thanks',
templateUrl: './thanks.component.html',
styleUrls: ['./thanks.component.scss']
})
export class ThanksComponent implements OnInit, AfterViewInit {
@ViewChild('inkwell1') inkwell1: ElementRef
@ViewChild('letter_src') letter_src: ElementRef
vLetter: any;
iSpeedInk: any;
sText: any;
iCurChar: any;
sChars: any;
iCurInk: any;
sCurCaret: any;
sCaret: any;
brokerInfo: any;
constructor(private router: Router) { }
ngOnInit() {
this.brokerInfo = JSON.parse(localStorage.getItem('lifeCustomerInfo'))['practitionerBasicInfo']
}
ngAfterViewInit() {
// this.vLetter = document.getElementById('letter');
// this.iSpeedInk = 5;
// this.sText = this.letter_src.nativeElement.innerHTML;
// this.iCurChar = 0;
// this.sChars = '<span>';
// this.iCurInk = 0;
// this.sCurCaret = '';
// this.sCaret = "&nbsp;<img src='pen.gif' style='position:absolute' />";
// this.doStep();
}
close() {
this.router.navigate(['/my']);
}
doStep() {
// current char
var sChar = this.sText.charAt(this.iCurChar);
// default char delay
var iDelay = 32;
if (sChar == '') {
this.sCurCaret = '';
} else if (sChar == '|') { // we use | symbol to emulate 'error' symbol
sChar = '';
this.sChars = this.sChars.substring(0, this.sChars.length - 1);
iDelay = 64;
} else if (sChar == '<') { // pass tags
var iPos = this.sText.indexOf('>', this.iCurChar);
sChar = this.sText.substring(this.iCurChar, iPos + 1);
this.iCurChar = iPos;
} else if (sChar == '&') { // pass html entities
var iPos = this.sText.indexOf(';', this.iCurChar);
sChar = this.sText.substring(this.iCurChar, iPos + 1);
this.iCurChar = iPos;
} else if (sChar == '.') { // custom delay in case of . symbol
iDelay = 300;
} else if (sChar == ',') { // custom delay in case of , symbol
iDelay = 100;
} else if (sChar == ' ') { // custom delay in case of space symbol
iDelay = 32;
} else if (this.iCurChar > 5) {
this.sCurCaret = this.sCaret;
}
// expenditure of ink
if (sChar == ' ') {
this.iCurInk += this.iSpeedInk;
sChar = '</span><span style="color:RGB(' + (this.iCurInk) + ',' + (this.iCurInk) + ',' + (this.iCurInk) + ')">' + sChar;
}
if (document.getElementById('inkwell2').style.visibility == 'visible') {
this.sCurCaret = this.sCaret;
document.getElementById('inkwell2').style.visibility = 'hidden';
sChar = '</span><span style="color:RGB(0,0,0)">' + sChar;
}
// refresh Ink
if (this.iCurInk > 160) {
this.iCurInk = 0;
document.getElementById('inkwell2').style.visibility = 'visible';
iDelay = 1000;
this.sCurCaret = '';
}
// add current char to chars
this.sChars += sChar;
// hide the caret at the end of the letter
if (this.iCurChar == this.sText.length - 1)
this.sCurCaret = '';
// update letter with new chars
this.vLetter.innerHTML = this.sChars + this.sCurCaret;
// goto next char
this.iCurChar++;
// next step
if (this.iCurChar < this.sText.length) {
setTimeout(this.doStep, 20 + iDelay);
}
this.doStep();
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { PageNotFoundComponent } from './page-not-found.component';
describe('PageNotFoundComponent', () => {
let component: PageNotFoundComponent;
let fixture: ComponentFixture<PageNotFoundComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ PageNotFoundComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(PageNotFoundComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'ydlife-page-not-found',
templateUrl: './page-not-found.component.html',
styleUrls: ['./page-not-found.component.scss']
})
export class PageNotFoundComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
import { SafeHtmlPipe } from './safe-html.pipe';
describe('SafeHtmlPipe', () => {
it('create an instance', () => {
const pipe = new SafeHtmlPipe();
expect(pipe).toBeTruthy();
});
});
import {Pipe, PipeTransform} from '@angular/core';
import {DomSanitizer} from '@angular/platform-browser';
@Pipe({
name: 'safeHtml'
})
export class SafeHtmlPipe implements PipeTransform {
constructor(private sanitized: DomSanitizer) {
}
transform(value: any, args?: any): any {
return this.sanitized.bypassSecurityTrustHtml(value);
}
}
.gearDate{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:10px;background-color:rgba(0,0,0,.2);display:block;position:fixed;top:0;left:0;width:100%;height:100%;z-index:9900;overflow:hidden;-webkit-animation-fill-mode:both;animation-fill-mode:both}.date_ctrl{vertical-align:middle;background-color:#d5d8df;color:#000;margin:0;height:auto;width:100%;position:absolute;left:0;bottom:0;z-index:9901;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slideInUp{-webkit-animation:slideInUp .3s;animation:slideInUp .3s}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.ym_roll,.date_roll,.datetime_roll,.time_roll{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:auto;overflow:hidden;background-color:transparent;-webkit-mask:-webkit-gradient(linear,0% 50%,0% 100%,from(#debb47),to(rgba(36,142,36,0)));-webkit-mask:-webkit-linear-gradient(top,#debb47 50%,rgba(36,142,36,0))}.ym_roll>div,.date_roll>div,.datetime_roll>div,.time_roll>div{font-size:2.3em;height:10em;float:left;background-color:transparent;position:relative;overflow:hidden;-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4}.ym_roll>div .gear,.date_roll>div .gear,.datetime_roll>div .gear,.time_roll>div .gear{width:100%;float:left;position:absolute;z-index:9902;margin-top:-4em}.date_roll_mask{-webkit-mask:-webkit-gradient(linear,0% 40%,0% 0%,from(#debb47),to(rgba(36,142,36,0)));-webkit-mask:-webkit-linear-gradient(bottom,#debb47 50%,rgba(36,142,36,0));padding:0}.date_roll>div:nth-child(2){-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2}.date_roll>div:nth-child(1),.datetime_roll>div:nth-child(1){-webkit-box-flex:4;-webkit-flex:4;-ms-flex:4;flex:4}.datetime_roll>div:first-child{-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6}.datetime_roll>div:last-child{-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6}.date_grid{position:relative;top:4em;width:100%;height:2em;margin:0;box-sizing:border-box;z-index:0;border-top:1px solid #abaeb5;border-bottom:1px solid #abaeb5}.date_grid>div{color:#000;position:absolute;right:0;top:0;font-size:.8em;line-height:2.5em}.date_roll>div:nth-child(3) .date_grid>div{left:42%}.datetime_roll>div .date_grid>div{right:0}.datetime_roll>div:first-child .date_grid>div{left:auto;right:0%}.datetime_roll>div:last-child .date_grid>div{left:50%}.time_roll>div:nth-child(1) .date_grid>div{right:1em}.ym_roll>div:nth-child(1) .date_grid>div{right:.1em}.ym_roll>div .date_grid>div,.time_roll>div .date_grid>div{right:5em}.date_btn{color:#0575f2;font-size:1.6em;line-height:1em;text-align:center;padding:.8em 1em}.date_btn_box:before,.date_btn_box:after{content:'';position:absolute;height:1px;width:100%;display:block;background-color:#96979b;z-index:15;-webkit-transform:scaleY(.33);transform:scaleY(.33)}.date_btn_box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background-color:#f1f2f4;position:relative}.date_btn_box:before{left:0;top:0;-webkit-transform-origin:50% 20%;transform-origin:50% 20%}.date_btn_box:after{left:0;bottom:0;-webkit-transform-origin:50% 70%;transform-origin:50% 70%}.date_roll>div:nth-child(1) .gear{text-indent:20%}.date_roll>div:nth-child(2) .gear{text-indent:-20%}.date_roll>div:nth-child(3) .gear{text-indent:-55%}.datetime_roll>div .gear{width:100%;text-indent:-25%}.datetime_roll>div:first-child .gear{text-indent:-10%}.datetime_roll>div:last-child .gear{text-indent:-50%}.ym_roll>div .gear,.time_roll>div .gear{width:100%;text-indent:-70%}.ym_roll>div:nth-child(1) .gear,.time_roll>div:nth-child(1) .gear{width:100%;text-indent:10%}.tooth{height:2em;line-height:2em;text-align:center}
\ No newline at end of file
/**
* Created by Sweet on 2020/3/11.
*/
window.LCalendar=(function(){var MobileCalendar=function(){this.gearDate;this.minY=1900;this.minM=1;this.minD=1;this.maxY=2099;this.maxM=12;this.maxD=31;}
MobileCalendar.prototype={init:function(params){this.type=params.type;this.trigger=document.querySelector(params.trigger);if(this.trigger.getAttribute("data-lcalendar")!=null){var arr=this.trigger.getAttribute("data-lcalendar").split(',');var minArr=arr[0].split('-');this.minY=~~minArr[0];this.minM=~~minArr[1];this.minD=~~minArr[2];var maxArr=arr[1].split('-');this.maxY=~~maxArr[0];this.maxM=~~maxArr[1];this.maxD=~~maxArr[2];}
if(params.minDate){var minArr=params.minDate.split('-');this.minY=~~minArr[0];this.minM=~~minArr[1];this.minD=~~minArr[2];}
if(params.maxDate){var maxArr=params.maxDate.split('-');this.maxY=~~maxArr[0];this.maxM=~~maxArr[1];this.maxD=~~maxArr[2];}
this.bindEvent(this.type);},bindEvent:function(type){var _self=this;function popupDate(e){_self.gearDate=document.createElement("div");_self.gearDate.className="gearDate";_self.gearDate.innerHTML='<div class="date_ctrl slideInUp">'+
'<div class="date_btn_box">'+
'<div class="date_btn lcalendar_cancel">取消</div>'+
'<div class="date_btn lcalendar_finish">确定</div>'+
'</div>'+
'<div class="date_roll_mask">'+
'<div class="date_roll">'+
'<div>'+
'<div class="gear date_yy" data-datetype="date_yy"></div>'+
'<div class="date_grid">'+
'<div>年</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear date_mm" data-datetype="date_mm"></div>'+
'<div class="date_grid">'+
'<div>月</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear date_dd" data-datetype="date_dd"></div>'+
'<div class="date_grid">'+
'<div>日</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>';document.body.appendChild(_self.gearDate);dateCtrlInit();var lcalendar_cancel=_self.gearDate.querySelector(".lcalendar_cancel");lcalendar_cancel.addEventListener('touchstart',closeMobileCalendar);var lcalendar_finish=_self.gearDate.querySelector(".lcalendar_finish");lcalendar_finish.addEventListener('touchstart',finishMobileDate);var date_yy=_self.gearDate.querySelector(".date_yy");var date_mm=_self.gearDate.querySelector(".date_mm");var date_dd=_self.gearDate.querySelector(".date_dd");date_yy.addEventListener('touchstart',gearTouchStart);date_mm.addEventListener('touchstart',gearTouchStart);date_dd.addEventListener('touchstart',gearTouchStart);date_yy.addEventListener('touchmove',gearTouchMove);date_mm.addEventListener('touchmove',gearTouchMove);date_dd.addEventListener('touchmove',gearTouchMove);date_yy.addEventListener('touchend',gearTouchEnd);date_mm.addEventListener('touchend',gearTouchEnd);date_dd.addEventListener('touchend',gearTouchEnd);}
function dateCtrlInit(){var date=new Date();var dateArr={yy:date.getFullYear(),mm:date.getMonth(),dd:date.getDate()-1};if(/^\d{4}-\d{1,2}-\d{1,2}$/.test(_self.trigger.value)){rs=_self.trigger.value.match(/(^|-)\d{1,4}/g);dateArr.yy=rs[0]-_self.minY;dateArr.mm=rs[1].replace(/-/g,"")-1;dateArr.dd=rs[2].replace(/-/g,"")-1;}else{dateArr.yy=dateArr.yy-_self.minY;}
_self.gearDate.querySelector(".date_yy").setAttribute("val",dateArr.yy);_self.gearDate.querySelector(".date_mm").setAttribute("val",dateArr.mm);_self.gearDate.querySelector(".date_dd").setAttribute("val",dateArr.dd);setDateGearTooth();}
function popupYM(e){_self.gearDate=document.createElement("div");_self.gearDate.className="gearDate";_self.gearDate.innerHTML='<div class="date_ctrl slideInUp">'+
'<div class="date_btn_box">'+
'<div class="date_btn lcalendar_cancel">取消</div>'+
'<div class="date_btn lcalendar_finish">确定</div>'+
'</div>'+
'<div class="date_roll_mask">'+
'<div class="ym_roll">'+
'<div>'+
'<div class="gear date_yy" data-datetype="date_yy"></div>'+
'<div class="date_grid">'+
'<div>年</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear date_mm" data-datetype="date_mm"></div>'+
'<div class="date_grid">'+
'<div>月</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>';document.body.appendChild(_self.gearDate);ymCtrlInit();var lcalendar_cancel=_self.gearDate.querySelector(".lcalendar_cancel");lcalendar_cancel.addEventListener('touchstart',closeMobileCalendar);var lcalendar_finish=_self.gearDate.querySelector(".lcalendar_finish");lcalendar_finish.addEventListener('touchstart',finishMobileYM);var date_yy=_self.gearDate.querySelector(".date_yy");var date_mm=_self.gearDate.querySelector(".date_mm");date_yy.addEventListener('touchstart',gearTouchStart);date_mm.addEventListener('touchstart',gearTouchStart);date_yy.addEventListener('touchmove',gearTouchMove);date_mm.addEventListener('touchmove',gearTouchMove);date_yy.addEventListener('touchend',gearTouchEnd);date_mm.addEventListener('touchend',gearTouchEnd);}
function ymCtrlInit(){var date=new Date();var dateArr={yy:date.getFullYear(),mm:date.getMonth()};if(/^\d{4}-\d{1,2}$/.test(_self.trigger.value)){rs=_self.trigger.value.match(/(^|-)\d{1,4}/g);dateArr.yy=rs[0]-_self.minY;dateArr.mm=rs[1].replace(/-/g,"")-1;}else{dateArr.yy=dateArr.yy-_self.minY;}
_self.gearDate.querySelector(".date_yy").setAttribute("val",dateArr.yy);_self.gearDate.querySelector(".date_mm").setAttribute("val",dateArr.mm);setDateGearTooth();}
function popupDateTime(e){_self.gearDate=document.createElement("div");_self.gearDate.className="gearDatetime";_self.gearDate.innerHTML='<div class="date_ctrl slideInUp">'+
'<div class="date_btn_box">'+
'<div class="date_btn lcalendar_cancel">取消</div>'+
'<div class="date_btn lcalendar_finish">确定</div>'+
'</div>'+
'<div class="date_roll_mask">'+
'<div class="datetime_roll">'+
'<div>'+
'<div class="gear date_yy" data-datetype="date_yy"></div>'+
'<div class="date_grid">'+
'<div>年</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear date_mm" data-datetype="date_mm"></div>'+
'<div class="date_grid">'+
'<div>月</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear date_dd" data-datetype="date_dd"></div>'+
'<div class="date_grid">'+
'<div>日</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear time_hh" data-datetype="time_hh"></div>'+
'<div class="date_grid">'+
'<div>时</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear time_mm" data-datetype="time_mm"></div>'+
'<div class="date_grid">'+
'<div>分</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>';document.body.appendChild(_self.gearDate);dateTimeCtrlInit();var lcalendar_cancel=_self.gearDate.querySelector(".lcalendar_cancel");lcalendar_cancel.addEventListener('touchstart',closeMobileCalendar);var lcalendar_finish=_self.gearDate.querySelector(".lcalendar_finish");lcalendar_finish.addEventListener('touchstart',finishMobileDateTime);var date_yy=_self.gearDate.querySelector(".date_yy");var date_mm=_self.gearDate.querySelector(".date_mm");var date_dd=_self.gearDate.querySelector(".date_dd");var time_hh=_self.gearDate.querySelector(".time_hh");var time_mm=_self.gearDate.querySelector(".time_mm");date_yy.addEventListener('touchstart',gearTouchStart);date_mm.addEventListener('touchstart',gearTouchStart);date_dd.addEventListener('touchstart',gearTouchStart);time_hh.addEventListener('touchstart',gearTouchStart);time_mm.addEventListener('touchstart',gearTouchStart);date_yy.addEventListener('touchmove',gearTouchMove);date_mm.addEventListener('touchmove',gearTouchMove);date_dd.addEventListener('touchmove',gearTouchMove);time_hh.addEventListener('touchmove',gearTouchMove);time_mm.addEventListener('touchmove',gearTouchMove);date_yy.addEventListener('touchend',gearTouchEnd);date_mm.addEventListener('touchend',gearTouchEnd);date_dd.addEventListener('touchend',gearTouchEnd);time_hh.addEventListener('touchend',gearTouchEnd);time_mm.addEventListener('touchend',gearTouchEnd);}
function dateTimeCtrlInit(){var date=new Date();var dateArr={yy:date.getFullYear(),mm:date.getMonth(),dd:date.getDate()-1,hh:date.getHours(),mi:date.getMinutes()};if(/^\d{4}-\d{1,2}-\d{1,2}\s\d{2}:\d{2}$/.test(_self.trigger.value)){rs=_self.trigger.value.match(/(^|-|\s|:)\d{1,4}/g);dateArr.yy=rs[0]-_self.minY;dateArr.mm=rs[1].replace(/-/g,"")-1;dateArr.dd=rs[2].replace(/-/g,"")-1;dateArr.hh=parseInt(rs[3].replace(/\s0?/g,""));dateArr.mi=parseInt(rs[4].replace(/:0?/g,""));}else{dateArr.yy=dateArr.yy-_self.minY;}
_self.gearDate.querySelector(".date_yy").setAttribute("val",dateArr.yy);_self.gearDate.querySelector(".date_mm").setAttribute("val",dateArr.mm);_self.gearDate.querySelector(".date_dd").setAttribute("val",dateArr.dd);setDateGearTooth();_self.gearDate.querySelector(".time_hh").setAttribute("val",dateArr.hh);_self.gearDate.querySelector(".time_mm").setAttribute("val",dateArr.mi);setTimeGearTooth();}
function popupTime(e){_self.gearDate=document.createElement("div");_self.gearDate.className="gearDate";_self.gearDate.innerHTML='<div class="date_ctrl slideInUp">'+
'<div class="date_btn_box">'+
'<div class="date_btn lcalendar_cancel">取消</div>'+
'<div class="date_btn lcalendar_finish">确定</div>'+
'</div>'+
'<div class="date_roll_mask">'+
'<div class="time_roll">'+
'<div>'+
'<div class="gear time_hh" data-datetype="time_hh"></div>'+
'<div class="date_grid">'+
'<div>时</div>'+
'</div>'+
'</div>'+
'<div>'+
'<div class="gear time_mm" data-datetype="time_mm"></div>'+
'<div class="date_grid">'+
'<div>分</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>'+
'</div>';document.body.appendChild(_self.gearDate);timeCtrlInit();var lcalendar_cancel=_self.gearDate.querySelector(".lcalendar_cancel");lcalendar_cancel.addEventListener('touchstart',closeMobileCalendar);var lcalendar_finish=_self.gearDate.querySelector(".lcalendar_finish");lcalendar_finish.addEventListener('touchstart',finishMobileTime);var time_hh=_self.gearDate.querySelector(".time_hh");var time_mm=_self.gearDate.querySelector(".time_mm");time_hh.addEventListener('touchstart',gearTouchStart);time_mm.addEventListener('touchstart',gearTouchStart);time_hh.addEventListener('touchmove',gearTouchMove);time_mm.addEventListener('touchmove',gearTouchMove);time_hh.addEventListener('touchend',gearTouchEnd);time_mm.addEventListener('touchend',gearTouchEnd);}
function timeCtrlInit(){var d=new Date();var e={hh:d.getHours(),mm:d.getMinutes()};if(/^\d{2}:\d{2}$/.test(_self.trigger.value)){rs=_self.trigger.value.match(/(^|:)\d{2}/g);e.hh=parseInt(rs[0].replace(/^0?/g,""));e.mm=parseInt(rs[1].replace(/:0?/g,""))}
_self.gearDate.querySelector(".time_hh").setAttribute("val",e.hh);_self.gearDate.querySelector(".time_mm").setAttribute("val",e.mm);setTimeGearTooth();}
function setDateGearTooth(){var passY=_self.maxY-_self.minY+1;var date_yy=_self.gearDate.querySelector(".date_yy");var itemStr="";if(date_yy&&date_yy.getAttribute("val")){var yyVal=parseInt(date_yy.getAttribute("val"));for(var p=0;p<=passY-1;p++){itemStr+="<div class='tooth'>"+(_self.minY+p)+"</div>";}
date_yy.innerHTML=itemStr;var top=Math.floor(parseFloat(date_yy.getAttribute('top')));if(!isNaN(top)){top%2==0?(top=top):(top=top+1);top>8&&(top=8);var minTop=8-(passY-1)*2;top<minTop&&(top=minTop);date_yy.style["-webkit-transform"]='translate3d(0,'+top+'em,0)';date_yy.setAttribute('top',top+'em');yyVal=Math.abs(top-8)/2;date_yy.setAttribute("val",yyVal);}else{date_yy.style["-webkit-transform"]='translate3d(0,'+(8-yyVal*2)+'em,0)';date_yy.setAttribute('top',8-yyVal*2+'em');}}else{return;}
var date_mm=_self.gearDate.querySelector(".date_mm");if(date_mm&&date_mm.getAttribute("val")){itemStr="";var mmVal=parseInt(date_mm.getAttribute("val"));var maxM=11;var minM=0;if(yyVal==passY-1){maxM=_self.maxM-1;}
if(yyVal==0){minM=_self.minM-1;}
for(var p=0;p<maxM-minM+1;p++){itemStr+="<div class='tooth'>"+(minM+p+1)+"</div>";}
date_mm.innerHTML=itemStr;if(mmVal>maxM){mmVal=maxM;date_mm.setAttribute("val",mmVal);}else if(mmVal<minM){mmVal=maxM;date_mm.setAttribute("val",mmVal);}
date_mm.style["-webkit-transform"]='translate3d(0,'+(8-(mmVal-minM)*2)+'em,0)';date_mm.setAttribute('top',8-(mmVal-minM)*2+'em');}else{return;}
var date_dd=_self.gearDate.querySelector(".date_dd");if(date_dd&&date_dd.getAttribute("val")){itemStr="";var ddVal=parseInt(date_dd.getAttribute("val"));var maxMonthDays=calcDays(yyVal,mmVal);var maxD=maxMonthDays-1;var minD=0;if(yyVal==passY-1&&_self.maxM==mmVal+1){maxD=_self.maxD-1;}
if(yyVal==0&&_self.minM==mmVal+1){minD=_self.minD-1;}
for(var p=0;p<maxD-minD+1;p++){itemStr+="<div class='tooth'>"+(minD+p+1)+"</div>";}
date_dd.innerHTML=itemStr;if(ddVal>maxD){ddVal=maxD;date_dd.setAttribute("val",ddVal);}else if(ddVal<minD){ddVal=minD;date_dd.setAttribute("val",ddVal);}
date_dd.style["-webkit-transform"]='translate3d(0,'+(8-(ddVal-minD)*2)+'em,0)';date_dd.setAttribute('top',8-(ddVal-minD)*2+'em');}else{return;}}
function setTimeGearTooth(){var time_hh=_self.gearDate.querySelector(".time_hh");if(time_hh&&time_hh.getAttribute("val")){var i="";var hhVal=parseInt(time_hh.getAttribute("val"));for(var g=0;g<=23;g++){i+="<div class='tooth'>"+g+"</div>";}
time_hh.innerHTML=i;time_hh.style["-webkit-transform"]='translate3d(0,'+(8-hhVal*2)+'em,0)';time_hh.setAttribute('top',8-hhVal*2+'em');}else{return}
var time_mm=_self.gearDate.querySelector(".time_mm");if(time_mm&&time_mm.getAttribute("val")){var i="";var mmVal=parseInt(time_mm.getAttribute("val"));for(var g=0;g<=59;g++){i+="<div class='tooth'>"+g+"</div>";}
time_mm.innerHTML=i;time_mm.style["-webkit-transform"]='translate3d(0,'+(8-mmVal*2)+'em,0)';time_mm.setAttribute('top',8-mmVal*2+'em');}else{return}}
function calcDays(year,month){if(month==1){year+=_self.minY;if((year%4==0&&year%100!=0)||(year%400==0&&year%4000!=0)){return 29;}else{return 28;}}else{if(month==3||month==5||month==8||month==10){return 30;}else{return 31;}}}
function gearTouchStart(e){e.preventDefault();var target=e.target;while(true){if(!target.classList.contains("gear")){target=target.parentElement;}else{break}}
clearInterval(target["int_"+target.id]);target["old_"+target.id]=e.targetTouches[0].screenY;target["o_t_"+target.id]=(new Date()).getTime();var top=target.getAttribute('top');if(top){target["o_d_"+target.id]=parseFloat(top.replace(/em/g,""));}else{target["o_d_"+target.id]=0;}
target.style.webkitTransitionDuration=target.style.transitionDuration='0ms';}
function gearTouchMove(e){e.preventDefault();var target=e.target;while(true){if(!target.classList.contains("gear")){target=target.parentElement;}else{break}}
target["new_"+target.id]=e.targetTouches[0].screenY;target["n_t_"+target.id]=(new Date()).getTime();var f=(target["new_"+target.id]-target["old_"+target.id])*30/window.innerHeight;target["pos_"+target.id]=target["o_d_"+target.id]+f;target.style["-webkit-transform"]='translate3d(0,'+target["pos_"+target.id]+'em,0)';target.setAttribute('top',target["pos_"+target.id]+'em');if(e.targetTouches[0].screenY<1){gearTouchEnd(e);};}
function gearTouchEnd(e){e.preventDefault();var target=e.target;while(true){if(!target.classList.contains("gear")){target=target.parentElement;}else{break;}}
var flag=(target["new_"+target.id]-target["old_"+target.id])/(target["n_t_"+target.id]-target["o_t_"+target.id]);if(Math.abs(flag)<=0.2){target["spd_"+target.id]=(flag<0?-0.08:0.08);}else{if(Math.abs(flag)<=0.5){target["spd_"+target.id]=(flag<0?-0.16:0.16);}else{target["spd_"+target.id]=flag/2;}}
if(!target["pos_"+target.id]){target["pos_"+target.id]=0;}
rollGear(target);}
function rollGear(target){var d=0;var stopGear=false;function setDuration(){target.style.webkitTransitionDuration=target.style.transitionDuration='200ms';stopGear=true;}
var passY=_self.maxY-_self.minY+1;clearInterval(target["int_"+target.id]);target["int_"+target.id]=setInterval(function(){var pos=target["pos_"+target.id];var speed=target["spd_"+target.id]*Math.exp(-0.03*d);pos+=speed;if(Math.abs(speed)>0.1){}else{var b=Math.round(pos/2)*2;pos=b;setDuration();}
if(pos>8){pos=8;setDuration();}
switch(target.dataset.datetype){case "date_yy":var minTop=8-(passY-1)*2;if(pos<minTop){pos=minTop;setDuration();}
if(stopGear){var gearVal=Math.abs(pos-8)/2;setGear(target,gearVal);clearInterval(target["int_"+target.id]);}
break;case "date_mm":var date_yy=_self.gearDate.querySelector(".date_yy");var yyVal=parseInt(date_yy.getAttribute("val"));var maxM=11;var minM=0;if(yyVal==passY-1){maxM=_self.maxM-1;}
if(yyVal==0){minM=_self.minM-1;}
var minTop=8-(maxM-minM)*2;if(pos<minTop){pos=minTop;setDuration();}
if(stopGear){var gearVal=Math.abs(pos-8)/2+minM;setGear(target,gearVal);clearInterval(target["int_"+target.id]);}
break;case "date_dd":var date_yy=_self.gearDate.querySelector(".date_yy");var date_mm=_self.gearDate.querySelector(".date_mm");var yyVal=parseInt(date_yy.getAttribute("val"));var mmVal=parseInt(date_mm.getAttribute("val"));var maxMonthDays=calcDays(yyVal,mmVal);var maxD=maxMonthDays-1;var minD=0;if(yyVal==passY-1&&_self.maxM==mmVal+1){maxD=_self.maxD-1;}
if(yyVal==0&&_self.minM==mmVal+1){minD=_self.minD-1;}
var minTop=8-(maxD-minD)*2;if(pos<minTop){pos=minTop;setDuration();}
if(stopGear){var gearVal=Math.abs(pos-8)/2+minD;setGear(target,gearVal);clearInterval(target["int_"+target.id]);}
break;case "time_hh":if(pos<-38){pos=-38;setDuration();}
if(stopGear){var gearVal=Math.abs(pos-8)/2;setGear(target,gearVal);clearInterval(target["int_"+target.id]);}
break;case "time_mm":if(pos<-110){pos=-110;setDuration();}
if(stopGear){var gearVal=Math.abs(pos-8)/2;setGear(target,gearVal);clearInterval(target["int_"+target.id]);}
break;default:}
target["pos_"+target.id]=pos;target.style["-webkit-transform"]='translate3d(0,'+pos+'em,0)';target.setAttribute('top',pos+'em');d++;},30);}
function setGear(target,val){val=Math.round(val);target.setAttribute("val",val);if(/date/.test(target.dataset.datetype)){setDateGearTooth();}else{setTimeGearTooth();}}
function closeMobileCalendar(e){e.preventDefault();var evt;try{evt=new CustomEvent('input');}catch(e){evt=document.createEvent('Event');evt.initEvent('input',true,true);}
_self.trigger.dispatchEvent(evt);document.body.removeChild(_self.gearDate);_self.gearDate=null;}
function finishMobileDate(e){var passY=_self.maxY-_self.minY+1;var date_yy=parseInt(Math.round(_self.gearDate.querySelector(".date_yy").getAttribute("val")));var date_mm=parseInt(Math.round(_self.gearDate.querySelector(".date_mm").getAttribute("val")))+1;date_mm=date_mm>9?date_mm:'0'+date_mm;var date_dd=parseInt(Math.round(_self.gearDate.querySelector(".date_dd").getAttribute("val")))+1;date_dd=date_dd>9?date_dd:'0'+date_dd;_self.trigger.value=(date_yy%passY+_self.minY)+"-"+date_mm+"-"+date_dd;closeMobileCalendar(e);}
function finishMobileYM(e){var passY=_self.maxY-_self.minY+1;var date_yy=parseInt(Math.round(_self.gearDate.querySelector(".date_yy").getAttribute("val")));var date_mm=parseInt(Math.round(_self.gearDate.querySelector(".date_mm").getAttribute("val")))+1;date_mm=date_mm>9?date_mm:'0'+date_mm;_self.trigger.value=(date_yy%passY+_self.minY)+"-"+date_mm;closeMobileCalendar(e);}
function finishMobileDateTime(e){var passY=_self.maxY-_self.minY+1;var date_yy=parseInt(Math.round(_self.gearDate.querySelector(".date_yy").getAttribute("val")));var date_mm=parseInt(Math.round(_self.gearDate.querySelector(".date_mm").getAttribute("val")))+1;date_mm=date_mm>9?date_mm:'0'+date_mm;var date_dd=parseInt(Math.round(_self.gearDate.querySelector(".date_dd").getAttribute("val")))+1;date_dd=date_dd>9?date_dd:'0'+date_dd;var time_hh=parseInt(Math.round(_self.gearDate.querySelector(".time_hh").getAttribute("val")));time_hh=time_hh>9?time_hh:'0'+time_hh;var time_mm=parseInt(Math.round(_self.gearDate.querySelector(".time_mm").getAttribute("val")));time_mm=time_mm>9?time_mm:'0'+time_mm;_self.trigger.value=(date_yy%passY+_self.minY)+"-"+date_mm+"-"+date_dd+" "+(time_hh.length<2?"0":"")+time_hh+(time_mm.length<2?":0":":")+time_mm;closeMobileCalendar(e);}
function finishMobileTime(e){var time_hh=parseInt(Math.round(_self.gearDate.querySelector(".time_hh").getAttribute("val")));time_hh=time_hh>9?time_hh:'0'+time_hh;var time_mm=parseInt(Math.round(_self.gearDate.querySelector(".time_mm").getAttribute("val")));time_mm=time_mm>9?time_mm:'0'+time_mm;_self.trigger.value=(time_hh.length<2?"0":"")+time_hh+(time_mm.length<2?":0":":")+time_mm;closeMobileCalendar(e);}
_self.trigger.addEventListener('click',{"ym":popupYM,"date":popupDate,"datetime":popupDateTime,"time":popupTime}[type]);}}
return MobileCalendar;})()
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
//
// Glyphicons for Bootstrap
//
// Since icons are fonts, they can be placed anywhere text is placed and are
// thus automatically sized to match the surrounding child. To use, create an
// inline element with the appropriate classes, like so:
//
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
// Import the fonts
@font-face {
font-family: 'Glyphicons Halflings';
src: url('@{icon-font-path}@{icon-font-name}.eot');
src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),
url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),
url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),
url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),
url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');
}
// Catchall baseclass
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings';
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Individual icons
.glyphicon-asterisk { &:before { content: "\002a"; } }
.glyphicon-plus { &:before { content: "\002b"; } }
.glyphicon-euro,
.glyphicon-eur { &:before { content: "\20ac"; } }
.glyphicon-minus { &:before { content: "\2212"; } }
.glyphicon-cloud { &:before { content: "\2601"; } }
.glyphicon-envelope { &:before { content: "\2709"; } }
.glyphicon-pencil { &:before { content: "\270f"; } }
.glyphicon-glass { &:before { content: "\e001"; } }
.glyphicon-music { &:before { content: "\e002"; } }
.glyphicon-search { &:before { content: "\e003"; } }
.glyphicon-heart { &:before { content: "\e005"; } }
.glyphicon-star { &:before { content: "\e006"; } }
.glyphicon-star-empty { &:before { content: "\e007"; } }
.glyphicon-user { &:before { content: "\e008"; } }
.glyphicon-film { &:before { content: "\e009"; } }
.glyphicon-th-large { &:before { content: "\e010"; } }
.glyphicon-th { &:before { content: "\e011"; } }
.glyphicon-th-list { &:before { content: "\e012"; } }
.glyphicon-ok { &:before { content: "\e013"; } }
.glyphicon-remove { &:before { content: "\e014"; } }
.glyphicon-zoom-in { &:before { content: "\e015"; } }
.glyphicon-zoom-out { &:before { content: "\e016"; } }
.glyphicon-off { &:before { content: "\e017"; } }
.glyphicon-signal { &:before { content: "\e018"; } }
.glyphicon-cog { &:before { content: "\e019"; } }
.glyphicon-trash { &:before { content: "\e020"; } }
.glyphicon-home { &:before { content: "\e021"; } }
.glyphicon-file { &:before { content: "\e022"; } }
.glyphicon-time { &:before { content: "\e023"; } }
.glyphicon-road { &:before { content: "\e024"; } }
.glyphicon-download-alt { &:before { content: "\e025"; } }
.glyphicon-download { &:before { content: "\e026"; } }
.glyphicon-upload { &:before { content: "\e027"; } }
.glyphicon-inbox { &:before { content: "\e028"; } }
.glyphicon-play-circle { &:before { content: "\e029"; } }
.glyphicon-repeat { &:before { content: "\e030"; } }
.glyphicon-refresh { &:before { content: "\e031"; } }
.glyphicon-list-alt { &:before { content: "\e032"; } }
.glyphicon-lock { &:before { content: "\e033"; } }
.glyphicon-flag { &:before { content: "\e034"; } }
.glyphicon-headphones { &:before { content: "\e035"; } }
.glyphicon-volume-off { &:before { content: "\e036"; } }
.glyphicon-volume-down { &:before { content: "\e037"; } }
.glyphicon-volume-up { &:before { content: "\e038"; } }
.glyphicon-qrcode { &:before { content: "\e039"; } }
.glyphicon-barcode { &:before { content: "\e040"; } }
.glyphicon-tag { &:before { content: "\e041"; } }
.glyphicon-tags { &:before { content: "\e042"; } }
.glyphicon-book { &:before { content: "\e043"; } }
.glyphicon-bookmark { &:before { content: "\e044"; } }
.glyphicon-print { &:before { content: "\e045"; } }
.glyphicon-camera { &:before { content: "\e046"; } }
.glyphicon-font { &:before { content: "\e047"; } }
.glyphicon-bold { &:before { content: "\e048"; } }
.glyphicon-italic { &:before { content: "\e049"; } }
.glyphicon-text-height { &:before { content: "\e050"; } }
.glyphicon-text-width { &:before { content: "\e051"; } }
.glyphicon-align-left { &:before { content: "\e052"; } }
.glyphicon-align-center { &:before { content: "\e053"; } }
.glyphicon-align-right { &:before { content: "\e054"; } }
.glyphicon-align-justify { &:before { content: "\e055"; } }
.glyphicon-list { &:before { content: "\e056"; } }
.glyphicon-indent-left { &:before { content: "\e057"; } }
.glyphicon-indent-right { &:before { content: "\e058"; } }
.glyphicon-facetime-video { &:before { content: "\e059"; } }
.glyphicon-picture { &:before { content: "\e060"; } }
.glyphicon-map-marker { &:before { content: "\e062"; } }
.glyphicon-adjust { &:before { content: "\e063"; } }
.glyphicon-tint { &:before { content: "\e064"; } }
.glyphicon-edit { &:before { content: "\e065"; } }
.glyphicon-share { &:before { content: "\e066"; } }
.glyphicon-check { &:before { content: "\e067"; } }
.glyphicon-move { &:before { content: "\e068"; } }
.glyphicon-step-backward { &:before { content: "\e069"; } }
.glyphicon-fast-backward { &:before { content: "\e070"; } }
.glyphicon-backward { &:before { content: "\e071"; } }
.glyphicon-play { &:before { content: "\e072"; } }
.glyphicon-pause { &:before { content: "\e073"; } }
.glyphicon-stop { &:before { content: "\e074"; } }
.glyphicon-forward { &:before { content: "\e075"; } }
.glyphicon-fast-forward { &:before { content: "\e076"; } }
.glyphicon-step-forward { &:before { content: "\e077"; } }
.glyphicon-eject { &:before { content: "\e078"; } }
.glyphicon-chevron-left { &:before { content: "\e079"; } }
.glyphicon-chevron-right { &:before { content: "\e080"; } }
.glyphicon-plus-sign { &:before { content: "\e081"; } }
.glyphicon-minus-sign { &:before { content: "\e082"; } }
.glyphicon-remove-sign { &:before { content: "\e083"; } }
.glyphicon-ok-sign { &:before { content: "\e084"; } }
.glyphicon-question-sign { &:before { content: "\e085"; } }
.glyphicon-info-sign { &:before { content: "\e086"; } }
.glyphicon-screenshot { &:before { content: "\e087"; } }
.glyphicon-remove-circle { &:before { content: "\e088"; } }
.glyphicon-ok-circle { &:before { content: "\e089"; } }
.glyphicon-ban-circle { &:before { content: "\e090"; } }
.glyphicon-arrow-left { &:before { content: "\e091"; } }
.glyphicon-arrow-right { &:before { content: "\e092"; } }
.glyphicon-arrow-up { &:before { content: "\e093"; } }
.glyphicon-arrow-down { &:before { content: "\e094"; } }
.glyphicon-share-alt { &:before { content: "\e095"; } }
.glyphicon-resize-full { &:before { content: "\e096"; } }
.glyphicon-resize-small { &:before { content: "\e097"; } }
.glyphicon-exclamation-sign { &:before { content: "\e101"; } }
.glyphicon-gift { &:before { content: "\e102"; } }
.glyphicon-leaf { &:before { content: "\e103"; } }
.glyphicon-fire { &:before { content: "\e104"; } }
.glyphicon-eye-open { &:before { content: "\e105"; } }
.glyphicon-eye-close { &:before { content: "\e106"; } }
.glyphicon-warning-sign { &:before { content: "\e107"; } }
.glyphicon-plane { &:before { content: "\e108"; } }
.glyphicon-calendar { &:before { content: "\e109"; } }
.glyphicon-random { &:before { content: "\e110"; } }
.glyphicon-comment { &:before { content: "\e111"; } }
.glyphicon-magnet { &:before { content: "\e112"; } }
.glyphicon-chevron-up { &:before { content: "\e113"; } }
.glyphicon-chevron-down { &:before { content: "\e114"; } }
.glyphicon-retweet { &:before { content: "\e115"; } }
.glyphicon-shopping-cart { &:before { content: "\e116"; } }
.glyphicon-folder-close { &:before { content: "\e117"; } }
.glyphicon-folder-open { &:before { content: "\e118"; } }
.glyphicon-resize-vertical { &:before { content: "\e119"; } }
.glyphicon-resize-horizontal { &:before { content: "\e120"; } }
.glyphicon-hdd { &:before { content: "\e121"; } }
.glyphicon-bullhorn { &:before { content: "\e122"; } }
.glyphicon-bell { &:before { content: "\e123"; } }
.glyphicon-certificate { &:before { content: "\e124"; } }
.glyphicon-thumbs-up { &:before { content: "\e125"; } }
.glyphicon-thumbs-down { &:before { content: "\e126"; } }
.glyphicon-hand-right { &:before { content: "\e127"; } }
.glyphicon-hand-left { &:before { content: "\e128"; } }
.glyphicon-hand-up { &:before { content: "\e129"; } }
.glyphicon-hand-down { &:before { content: "\e130"; } }
.glyphicon-circle-arrow-right { &:before { content: "\e131"; } }
.glyphicon-circle-arrow-left { &:before { content: "\e132"; } }
.glyphicon-circle-arrow-up { &:before { content: "\e133"; } }
.glyphicon-circle-arrow-down { &:before { content: "\e134"; } }
.glyphicon-globe { &:before { content: "\e135"; } }
.glyphicon-wrench { &:before { content: "\e136"; } }
.glyphicon-tasks { &:before { content: "\e137"; } }
.glyphicon-filter { &:before { content: "\e138"; } }
.glyphicon-briefcase { &:before { content: "\e139"; } }
.glyphicon-fullscreen { &:before { content: "\e140"; } }
.glyphicon-dashboard { &:before { content: "\e141"; } }
.glyphicon-paperclip { &:before { content: "\e142"; } }
.glyphicon-heart-empty { &:before { content: "\e143"; } }
.glyphicon-link { &:before { content: "\e144"; } }
.glyphicon-phone { &:before { content: "\e145"; } }
.glyphicon-pushpin { &:before { content: "\e146"; } }
.glyphicon-usd { &:before { content: "\e148"; } }
.glyphicon-gbp { &:before { content: "\e149"; } }
.glyphicon-sort { &:before { content: "\e150"; } }
.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } }
.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } }
.glyphicon-sort-by-order { &:before { content: "\e153"; } }
.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } }
.glyphicon-sort-by-attributes { &:before { content: "\e155"; } }
.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
.glyphicon-unchecked { &:before { content: "\e157"; } }
.glyphicon-expand { &:before { content: "\e158"; } }
.glyphicon-collapse-down { &:before { content: "\e159"; } }
.glyphicon-collapse-up { &:before { content: "\e160"; } }
.glyphicon-log-in { &:before { content: "\e161"; } }
.glyphicon-flash { &:before { content: "\e162"; } }
.glyphicon-log-out { &:before { content: "\e163"; } }
.glyphicon-new-window { &:before { content: "\e164"; } }
.glyphicon-record { &:before { content: "\e165"; } }
.glyphicon-save { &:before { content: "\e166"; } }
.glyphicon-open { &:before { content: "\e167"; } }
.glyphicon-saved { &:before { content: "\e168"; } }
.glyphicon-import { &:before { content: "\e169"; } }
.glyphicon-export { &:before { content: "\e170"; } }
.glyphicon-send { &:before { content: "\e171"; } }
.glyphicon-floppy-disk { &:before { content: "\e172"; } }
.glyphicon-floppy-saved { &:before { content: "\e173"; } }
.glyphicon-floppy-remove { &:before { content: "\e174"; } }
.glyphicon-floppy-save { &:before { content: "\e175"; } }
.glyphicon-floppy-open { &:before { content: "\e176"; } }
.glyphicon-credit-card { &:before { content: "\e177"; } }
.glyphicon-transfer { &:before { content: "\e178"; } }
.glyphicon-cutlery { &:before { content: "\e179"; } }
.glyphicon-header { &:before { content: "\e180"; } }
.glyphicon-compressed { &:before { content: "\e181"; } }
.glyphicon-earphone { &:before { content: "\e182"; } }
.glyphicon-phone-alt { &:before { content: "\e183"; } }
.glyphicon-tower { &:before { content: "\e184"; } }
.glyphicon-stats { &:before { content: "\e185"; } }
.glyphicon-sd-video { &:before { content: "\e186"; } }
.glyphicon-hd-video { &:before { content: "\e187"; } }
.glyphicon-subtitles { &:before { content: "\e188"; } }
.glyphicon-sound-stereo { &:before { content: "\e189"; } }
.glyphicon-sound-dolby { &:before { content: "\e190"; } }
.glyphicon-sound-5-1 { &:before { content: "\e191"; } }
.glyphicon-sound-6-1 { &:before { content: "\e192"; } }
.glyphicon-sound-7-1 { &:before { content: "\e193"; } }
.glyphicon-copyright-mark { &:before { content: "\e194"; } }
.glyphicon-registration-mark { &:before { content: "\e195"; } }
.glyphicon-cloud-download { &:before { content: "\e197"; } }
.glyphicon-cloud-upload { &:before { content: "\e198"; } }
.glyphicon-tree-conifer { &:before { content: "\e199"; } }
.glyphicon-tree-deciduous { &:before { content: "\e200"; } }
.glyphicon-cd { &:before { content: "\e201"; } }
.glyphicon-save-file { &:before { content: "\e202"; } }
.glyphicon-open-file { &:before { content: "\e203"; } }
.glyphicon-level-up { &:before { content: "\e204"; } }
.glyphicon-copy { &:before { content: "\e205"; } }
.glyphicon-paste { &:before { content: "\e206"; } }
// The following 2 Glyphicons are omitted for the time being because
// they currently use Unicode codepoints that are outside the
// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
// Notably, the bug affects some older versions of the Android Browser.
// More info: https://github.com/twbs/bootstrap/issues/10106
// .glyphicon-door { &:before { content: "\1f6aa"; } }
// .glyphicon-key { &:before { content: "\1f511"; } }
.glyphicon-alert { &:before { content: "\e209"; } }
.glyphicon-equalizer { &:before { content: "\e210"; } }
.glyphicon-king { &:before { content: "\e211"; } }
.glyphicon-queen { &:before { content: "\e212"; } }
.glyphicon-pawn { &:before { content: "\e213"; } }
.glyphicon-bishop { &:before { content: "\e214"; } }
.glyphicon-knight { &:before { content: "\e215"; } }
.glyphicon-baby-formula { &:before { content: "\e216"; } }
.glyphicon-tent { &:before { content: "\26fa"; } }
.glyphicon-blackboard { &:before { content: "\e218"; } }
.glyphicon-bed { &:before { content: "\e219"; } }
.glyphicon-apple { &:before { content: "\f8ff"; } }
.glyphicon-erase { &:before { content: "\e221"; } }
.glyphicon-hourglass { &:before { content: "\231b"; } }
.glyphicon-lamp { &:before { content: "\e223"; } }
.glyphicon-duplicate { &:before { content: "\e224"; } }
.glyphicon-piggy-bank { &:before { content: "\e225"; } }
.glyphicon-scissors { &:before { content: "\e226"; } }
.glyphicon-bitcoin { &:before { content: "\e227"; } }
.glyphicon-btc { &:before { content: "\e227"; } }
.glyphicon-xbt { &:before { content: "\e227"; } }
.glyphicon-yen { &:before { content: "\00a5"; } }
.glyphicon-jpy { &:before { content: "\00a5"; } }
.glyphicon-ruble { &:before { content: "\20bd"; } }
.glyphicon-rub { &:before { content: "\20bd"; } }
.glyphicon-scale { &:before { content: "\e230"; } }
.glyphicon-ice-lolly { &:before { content: "\e231"; } }
.glyphicon-ice-lolly-tasted { &:before { content: "\e232"; } }
.glyphicon-education { &:before { content: "\e233"; } }
.glyphicon-option-horizontal { &:before { content: "\e234"; } }
.glyphicon-option-vertical { &:before { content: "\e235"; } }
.glyphicon-menu-hamburger { &:before { content: "\e236"; } }
.glyphicon-modal-window { &:before { content: "\e237"; } }
.glyphicon-oil { &:before { content: "\e238"; } }
.glyphicon-grain { &:before { content: "\e239"; } }
.glyphicon-sunglasses { &:before { content: "\e240"; } }
.glyphicon-text-size { &:before { content: "\e241"; } }
.glyphicon-text-color { &:before { content: "\e242"; } }
.glyphicon-text-background { &:before { content: "\e243"; } }
.glyphicon-object-align-top { &:before { content: "\e244"; } }
.glyphicon-object-align-bottom { &:before { content: "\e245"; } }
.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
.glyphicon-object-align-left { &:before { content: "\e247"; } }
.glyphicon-object-align-vertical { &:before { content: "\e248"; } }
.glyphicon-object-align-right { &:before { content: "\e249"; } }
.glyphicon-triangle-right { &:before { content: "\e250"; } }
.glyphicon-triangle-left { &:before { content: "\e251"; } }
.glyphicon-triangle-bottom { &:before { content: "\e252"; } }
.glyphicon-triangle-top { &:before { content: "\e253"; } }
.glyphicon-console { &:before { content: "\e254"; } }
.glyphicon-superscript { &:before { content: "\e255"; } }
.glyphicon-subscript { &:before { content: "\e256"; } }
.glyphicon-menu-left { &:before { content: "\e257"; } }
.glyphicon-menu-right { &:before { content: "\e258"; } }
.glyphicon-menu-down { &:before { content: "\e259"; } }
.glyphicon-menu-up { &:before { content: "\e260"; } }
/* 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 source diff could not be displayed because it is too large. You can view the blob instead.
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1594367530928'); /* IE9 */
src: url('iconfont.eot?t=1594367530928#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAIGAAAsAAAAA4jQAAIEtAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCXSAqDixyCszQBNgIkA4UgC4JSAAQgBYRtB5EWGzC0JdNtniCPA4DJDTYyEGwcCCDi4eS4DhsHDib4cvb/ZyQdYzioxpD0aT5LIkClFyab6m5V6DUKrZy4JehXwUw8mSTDiJxMQphJLIeOTHYbRg5N5SNRLr1hG5Y76L3ghbb3P/+1SfPZec50N09fPEoQg/ji0Nb/c9bxvMBGt/26K4xbeKFjR54E8HnVV/KSnl5AmhXxIZ8AnQRkP2f5XAI2OeRy/XrOB3au7J9jeU/MiBmxIHEwumWoCrf9734AwP/Hfbvd8/fxNvAvWGABRWmA22btQoEXYMBhQMsbnp9b7/91wRgsqdoGLQw2YCPHiJZRJdGKOqJMUsEExAK9A20wsO8EFePORFHv9ApF78y7Ez/U9Rb9HcPIT9LIvF57EQMMXep0yREXRX3tde0NvZt95D6TOx9BKietP3eBX/idyUQq720JROpLnYSK79Zg5PRblCLdiDB7BGMcUuLk50XpkZv9Qwtt4kgMsXPgxGR2B3LK8cQsbeiffSlarcQkMpsOPO6vE3QZCJswh74g4Z+6BaIJhRu2K7KTUXgC5TXvd9p10YPIwXsfUigWTB2C6by8ZerAdntH4v90ljPvupmX7oMgYcHC5aoAQGvLPt71HQdBjdRKrdhLuRjlY6jCNUTA//9O7f8cQ/vePrKdvGdbbtMZbtNphwAknUAh4XXvEHb8I/2e80uSnMQFSzIU702cwgCA4RFYtKavE6FKnogOCmh02QaUrq0D0jQ7G4T/01m2kh2wg6sjdtCXcFEDl8Ufe0GzWpBW997ZqyVfUOuAdDgOcYdcApYpR/bB+HB8qA3KRygHvekYiiYlNU2aMl3pvZA3XdKXqdpgKadSAJstJ/9/qlotKW+QvZd0ezHxQpeKZnO9XYn/B5Q5MyApDOkwIB0Ain4CKe1pQDkA1IZMeWOsLubXa0B5VyCdQNm3pjZejOVVu1elVDTXVO3BkDnR42FomZNUn52O/Z/lLieoQQhhhDFfd4yhQ0xDEK977wwI8rf1n7G9zwF9br8B9Y5dC3vd1u9BNrVQ33atGd6oodn/I9v6Dr5yHmKPMAeILOot4K+cCEXV1FzUv//TX0ku0c0vQrRs5CDJE12yYvZIXiRHLDapow6l8vHaM+JkfO+jb9Q2wkosDepWaXTh1zb5+LnvHkYYwh7Tw8ZGrl4S6wwCmiMhECfPip9ROMLNo1KUeq0n8U2M9NEFFaJk23E0s56NdNBFL0McYITvOM5ZLpBRUFHTsvC7yFK9GtW4iEJFiuW1TZOa64I+naP+CGid8Lrh57myd3MSen4pXXqAkRHenzA5nMXvLZ4oeRASfHLdlZdevt1Wmx1cZ741rj2w1mIbLLBvmVV2uuHiOc5fdnylXXt3zzXDatPMcsVEE2wy3hhLzTba/nFuHGmUwYbqq4+LLjnUq723bp7eHm7uDo5SG1u7Sk0seJ21BCKxZODM9QPcdKr9ssF+GlmF6Gier1qOKlwjJ3L+9zwWnUlR0g7FFFdCEdMVVQerQE4wRWKI1LlF9hw5OlWH5VrbB5mkdJF5YjW6L1zVhrFhhIrVhovU9Nk81mSFyqywxUD9bdMODBiKWUfDsP/DBf8JTHjwiSD8KRi/CIEfhMRPQuFlQuNFwuB5wuJd4fAU4XEPEfAEEfGHSHhHZDxJFDxAVDxDNNxLdLwlBh4mJh4jFl4lNv4WB9/JCHeSMb4WFz/KBB+Lh0fJFK/JDG+Kj9clwF0kxK0kwuMkxk2S4HYyx8+ywBWyxGWywnNkjUtkg/Nki4fIDneQPc6RA96WIy6SE/6RM86QFGdJhmMkxwlywQFyxX5yw7dyx/fywHvyxF6QF96XN/bRsrcqHzxJvni8FMB2kB+2gvyxDaTEGpAKa0EB2AAKxApQEFaC1FgF0uBpCsZyUAiWgEIxGxSGzxWOuaAIzANpsQAUiYUgHRaBovCbovGFYvCXYnGY4vCv4vGZErAJlIjdoCT8rmQcpBQsBS3HMlAqTpIeW0BpWAxKx4OUgVmgTNxHWZgBysZMUA6mg3LvpDxgGij/UAEwBVSIiaAiTAatwDgqxlgqwStUilFUhtFUjjFUgRFUiVuoCiOpGvNBNRhOtRhGKzGUVmEQ1eE6rcZgqsdxasYQWoevtB7300a8oY7HqwsP9QI3aAibQQdwG41gHeg7rAYdx1E6i6t0HuNBU3iELuBuuoKBdBVzQD/gS13HN3qAX/US60G/YBLoH3ykjzhNVF+kUJEverFR8sV5GC754vyJ0FWYmugaTE/0KOYkeg8zFn2OmYy+xxQiE1MGOXiSVjBb0N+AgZIvn0B/yVeJyyVtc2/eRIJ24OYD0ej9PkOV9O6TJKMe0L06RYvt0zh0JopIxX04r6gCQTrrn0oEOQXyUqpfgUSiqJzk8QqmNHgeKZg6fiRRHlOJXLu4nEgV93iVZR5CMT7iKTAfjwzgLq+qYZDN81jKz7B4zEHDgCQSPEyQyzk/quCkeGYCezxCZjHKjwmPTfAgJw+LQglnJZM/rVEL+SoYFI3MpPiZllkXHkgA5ZduLPWzUZanSRRNoa4+UgdIbkCkFr29uqdaDnq9bmDhRfkhl2CT2ORAHkc7YyBA4bAK8M8fxnDhIeu/O/Byeriyy45dzGMFtsVKdMKcA3r5SER8YKhRNCc6Kpspq+qkS9DSUayiVWismxV/ZlYS4yRJnL9lst6wt7DI1rdcU31y63SGW9xYZjJingxaXRLVC2vGWi8quA6JgppDieKgnjtHq7XPnXgvKc1jAiY97aQVUUJtLqR/z9v40/GruthUkS1jUrEC2pzRrlfv06waBDYmHx77dTNersOE4mg2qX06GAwXqQI1QFkr09VDlr5X7G223aaXpqZYLJ93MFZAvG/yZF5fC6Z1Qz8WMK/f0ykLy5aJXLkIGAKxudyZWLPbx1G6qHKYl9ot5nU8Bb0EQYw7eaWMtustrDPosqYtY1uiLXCCu6EDONV2VsdzEC7cTFP3lOanrbTuIzG1+57Ny5e7hZvzbaAM14dTEAXBB9m/Qk832nTapFVAQCXAfa9DPV0/pG6uNUCBG4pYcSdYXL5E5CQgTSLAu8JlesVHVGvM5deP7339HmF64ViLTdzV3XKegb+sxxIxH688Af8yeFpJGOp2kKgmtrxBW2qos3FzAHQUaWBLQaqq/90WvwcQ3b9yvJKmZXLUe5q9Ao+q1LlWE5q9xNYqymGKLiNzp+w5G2nvaB5Eho/0Wh3ztTH/CvdD3+I6r4hUnrPRcAjBlgSnDm2SFkoEbGe8EP73eoMZ/vA3wZCjHKYa2tKCOZs61jfMKA17LM0FigRiXULkgnWeySub966eJC051WEeMlMOSLtyqAfIyTwYT2MOFTeF2xciXmNIFVgzlKDoQtnLbbDXGldHWGtYMc718iCewO9jTdHeBiUFSzzGvhDncmK4tIyLTBwzXZmWDB02VF4RM/yCAyCH13oP+wVwD1/VQyO0nHxcGz8+Iexpn0gJn5cNt3liIAKuoxW+jtz4Rem5M88lP4/y4/fgWEq11r+gijVX69M2BoXKSlNZGNd4yCUgiAiGkdsYiBFpC/d4WZSdHs6+XDwf91xQ1WqOK0ayHOgFFO9mTzmZCMaw8mjpfUTvDxWZb1j+hFtIpiwnDNVrhY0D0Q6Gzt5UebZ8fsum9aP4W+02ZGeRX5N9klTO5yL/1Q38tneoPhsXnaefVZ8zgqdv3+vGonOl8I2MGz9b4IPatT/k2qG8qFhZkya92kNblhhfuFqzNMdzVy45XaWJ+p+RMOOX6a+MRLkmSECK/VJiwtXxHgWYSE+bpG421SejDweWo4AgTWgjaKKBahZ7KAy9ETpGGReZlX5cCpb0aNKwsX7vhXuQJS6OzC/N/7+doKnXrPTLri8vWqa18/s3YZUDY7JLVzXvl3S9YAtzSeZfiDLeNazjP/erpFeBfxrUItu4iZ+XfJj2vMF8kXIDN5dEMu2FfeGDocKrGukcD3C+7GpGKtjiXkxpXRGOqBIK5KgiWCKPz1FdEibN36Flf8pCYDRgX10Z7HsEyiTnSaXhY2qJ8IO8tCYULnvQqBvoCQltwmmUHXI/KEv6WsqHOW3Uo3vpg/j+T810cakJ1fgpHCbVNYuGKDdcO+JJre8AEuBxS6TyR2AY7UfVMjhUJH0h9kwfrkoDUH8648fwWtOD9WMBPSIpTlsZrWf8nFdP3M2WvNY8v3FgkM6RT1IG9jDIFDLSNiCC15LnCsDqD1vkQ37QbumEC2dTtFutTqc7xdgsWzQ+vv++dt1Tyidt2f07aNR3zv32+yezHmD1CwYQNKYv/fXzB6fuH2flWTQfa6rZJ55rAQ+fV3ioxA+INg+Qw3yeU3a+LOhOx9iXxDTscd2gdsJQe4cPSy1RfohVqAK2f/cV75UI8pl4bpCseFkAN0RIDwA0FCrDke2xf9j6YRszfoxRTjxkjU2s5u/bqxlrN5oiSbp1NR2jhCWSgF0z/OsH8xrQXEo7QlkA27GFPLPdLgWp4s8SBcVUlgNeo+C5LZ1KzavwlDHt8l36wlysBfdsixspPYcUe5ciEB48UuBKWgsVtyWjsGJlEGm/7hxFahvOgrW3RbUUrk2IvVOSBw9RlHh8KzBfZP1P2pLJeUAuZapdiVWoACUrfrTkvn1KydhAq8KRkn8OE0R2L9Pn8EOI3THgQ3Fe8qg3yFMeh/sc3PthpNfZ5tB3zwAJCy4t7jfXzEhYKgoA3wE+A+MCkdmWw6VWN4/YRKPxJMcAOKVzBqR0Hirflkz1ccnURhQLBIC90K8XIUGSggwq9CIyTK9zQG0FtCHhFeOagVx3fluQsqtWV0rbLe3RcV6TmOiV55MdnsgAXxjnldK8ryP+kqPxpv5L5J7zsnaWz+Qn9xLgCj7HFTtIHRgDIvAY6iiTTipNM7WnuGNvp7R81V16ASNhCwKWzXV8H3Uexa2Cl7RL7Qp19lGRxxeA+dG8Rc2fPDdIF+GYVIzB1a/FIRsnIupvjNqI8CAKNrBipOsyThLWWz45pZZmjfX6w6kSHrvU55emHfZ7YPHAvOiWKMBSMAS7LwosKIqat2e3AMB61Ih9yZ79h5u1yL/tEv3RlwlwvSUIPrAOlCV+6gmJNXLu0+ZKdaN6CRgRPVmoQupbRazQ64jXSB+Vi1+hlIK0ajWpI2LhW62mSYpO1+g2JbKA8ObKMWVBasU3Gec3pFfNt4xyS3DQUSY37K1h8mmBU5HJZz32U57IIMIF5JKBVFC9pV3n702vW3xGWEgk5aTkSsZYOwPp8VCIrDLRDg1KUOjMDnikKHvqV9mAOpVPch0eM/qz3u5NfoazQqN5MdIMI2MXcDeJH3xfkBQz+a9Gs171QL3xfOF4/ul8Nwkh7oHTBYFPosjOeuEB6TsQh5xV0bMTGEtlb9sSLLkdW72e9hfB8sPl1jDSJNFPgLCiGol246Zzu2R1eRECa4mMC+VyTmbD8AATaiKdJgrMan6dCxl34t4tXeArDy7wYcuHLcCgfJxY2VrDL0Sx+U5BmxXLm1pv91b5hvV3lafnOr1VK82QaUcZ9nhn62mkPQu6hx+PPfijf0al/Z/mV/V8PF3IMESn3b+8CIhwNmxo6a1jLQirzjXBBUjhFGkwQlpYDllKySBdcFqFyayT8ydmYN3UCRsaeZegoGRjmhQ8wOH8+tKCSKXc2ABdmfaekOvW/Po/gPlZ2n7MWfADf3kxisy0BMtHfD8slV4B59+HLhg2PgK2eHfEdSNxp/Em798eeNWxQG55Iv+ycjyU97Fw1htd3NAEr27EY6gFWfsN6U1lberBnfTWvXPj1cBROdo5bTdGkFojmFk+y/c34uhuYvQ0HDHAQru6pmRcXwEL5QFvp7Cs7vcfzz/YzDRWmSGEbl3N1iJN+JLYp4Es4QfSNwZifySbbDxQYbxox0o/nB8MVHsL+0RhGemKn4LJIPN5OGc6TGfnhdm0NwhQAyenf9lW4KdNcUmyXOAofJ+Gz5TmvfvaTdKAfaUcv7mWe9YFfvq4DuVpvXL6WylECW67JWzciAUKYk1stIncQBsIwzwtx570qEahRgZplesDhoNLnq4SOmHNmBD2eMqUEFu0wSE51J4uQPjGlBd+NO8Ze3FvgMcS2pOYGSqbRyXEAgBPksfCFiHSwjKyda35wPVVvrXIeHYhInngNxyYWRXC7FBJX6CHtn//3GfoGOp22xPzSvNOBrVW6wAoX0TQew9N+fZtQ97s/b/vp4z1vrTX0K/n2e4X06K9C2Uhk2eJxFn4f0htocr3vpwRGXf67p8s9Nv/alZmvdMP/uFfbSHt1ZhQ0XisxfT3SRplxYoZlzzPb1NgqDR6ujR7VzLn2tKuRuQoYM3thopKETNNdmK+91H+4p9cp8BmZIMrXQjI9ZPWwsA2rk9wLfUEIpGAjvl/CP9F4v/V+r/zhlqOw/UnY/TDdw0TXSA4rEnBcsAGkUeCZqkF4Xh5ZcCUcr5yiTIGHAgLrCNDjVu+p9W9ITQ1SeFUNmZnJBRJRdVRWgNn9wI9ylv43eg1AkUoTA23XazZKV5BGGhTDSpSgfX0t7Gu4j22TGX8txLPP5toHr5IDZxzXrKXWChxfkuBHcU95vLdQ+2qLb+wET+CeGMw8ufGngQaEbtxFT34aH0YYbgC5ZK9ZqRRF9Yh11cj4OR0GFWpB+LtKIhsbYLu6gNFARFjqQB2Lv8GQTC/o4790oktK/eq4qzCn2Gm2mkTqDK6cZDhL1u4toKPaWMJaXTPKlseuDnL9LPKDPOwZIYW1jTtEzCasvPpgTotxCXcCrE4QXp03AY3GkZrv0X9JNkp5zRJdrLDNA5qIfxNmt9LIL2Sb/F9hw2EWr2heSxAPFWKBIEBeyaVCYxUBgJMUMfgXl6DjV17qkgONcwwXAb4QQQIW9UuKbJC9Z7W2OewpXDQ/10FOuLE4CcvjptDoLGt2k/IGWH8wCiWlPSteoz0zMAKMPQE94BHeZrfYmLAufRC3H6mipUg3tNyTEZ6rT2bqhoi7JL7/J7ypOEhLyuii7gpl9u+HovM1pVc/gU53WlBJoXUWtlNrZNvODzt1VU05LkkVI3zU0KojTEDfbRC1btoGtQIXHIUYPFUNOTOikcYIeU/oyP8/oWQMctqllJae0ShyIWgsBtdhdSsfnHS6o0c58vidYs4Q7szHAB6CaEHRy51kUsxpxnjXJ+RjOlQzzhgwTSZJJAms9G4HNToAqbkcIZ7SAzseolgz2rMe/+YAunry0449TzlgSHHd9v627zlPORYnmZLynQKnBtKUieccSc35lGogiBRSTpNuCuxZw7O8vWiKCvotiE3w/Ww9PN3NXSh5bFqdhtwqawq0Hk6k6ocZ9lo/8iYseS8byhTpj2mc06qd8kglzZsYAiDgusYBLuvSKFdhwsAidteoARKSQopxtjgpsTRBW6JrJ2tcOgVYE4xkZi8NQ1WPoOZHhm4yCWfd951CiqdIFgnHkPWm9JkC7DLbl0Ptgmuz6uLbeklXmzK6adWiyfo0OBPP643K2jml6VdVwqZUpZcczyl4YQQ40DLmRqKpj3HJGOWCtUIHuXhFseUfjQRza6mgfnmRgV4JGXPr4FR4OwPrgxO+ETdikqlRraO8lxIef2pcfAMq/BYbfA64GxgsqkSuN8fB7Hww/PWnlAZRrGZE/221IGVJxlyy6kcO10dFKlyPXm0NionIucax+OXtg5C8ywbH0YxFVQnjKlu8mi9kd57xE+fEEOFeZPGk9aLO+7Ype5plqveMIldqYcDZtrFJcHhnyvJvSSJSv4wTXGY9BEgsnsfYMBkgENsSqyqYaHFZWz1DBSX2TZdxFWVSXMwIwisBEmbkM19ho/G/UpSS+CnLeKo7MuAkHJDIIYRCCibzStuwMazGSJNsEMUOy8xgEBFqOGObiAWFgcb4wLrOxX2DoUueMSRaWCgIsAY/iKhfEkNj5m3lYqmxrR2pBnrZ3P7/Ak3F0/ua+hinpQ2RpnnI9G2o4KCbo21y5fUcYnPBovCOkZB8N9XTCrmJYDHxrSmzbJf5bI0NDRUHuEbjbOCpamiAgSriJ6EPTThT+hcI9lfgaL4cQCMXb7qGCk6lYo/PaWxKRQ26NH2A6joKjgibEPhFz3MpOJ0QRhkIZAIOUbGdq+vQEXnUj1OKxyPORrAadd0ZoFISdoVhjTIFXBJkZiUM+tSawUZoHZMKBL5uizuJVh08h0EJJrkegEEUXDpeAUsP+6QEo+KB+tJX0Js3oZ2+KDC9awpyuRWbrVDrxAWIdUFFb8vck6EYmWH0i1BAJAsIQECNdfHlCDCmTSJDSaMEVqwaGrmjxPDD1dAmBIXwbpwypUskm1rOFPGsYO276bHYI9pXsc7vYJiq0uGRG4q2q4cKuNkyXjpMs3syyDBT0yoaIMmo7QLXYqd9pvatILW12TM8j5GHYODAjTTfgo54diFO3412fp0wrQ14jrhstOaha4oNr5szQjkfQy57eicuxMJeRMjIGHjtTIa7QWdwc7ElLSB6lF29AjcHjhZ+JwLJ1/wbGeyof5Lwo5qyP86HOP/tF6If9uJqhOLdEJdvwHrwXlRHlX59elUs9GkPb81XPDendIb5znSbBkA5bgwpmFTs7iZ0K6KKFQVTGlaYcIAsq68uVH0br0Vi/LVmzxYajz+Y58Q5IFZ+48PKLuShxVYvxh8AJjQu5vTAnD99OpLnYJmZQFb9vzpHwzB3VQFTEHGTMp9vvZMXT5tB2lRJuc7IObQdhT+UlkGuCZXa/pzOCLaiepaGaIXuxI1xrUpXlSJ9cOYxP6mdQV+AtalF9eck5d1uYCKPVEihQozFlopRawhMaDYTzuqsNjR94FQXZpHgcubsqEScV6FhHWkMQ8QCR9S7DHuzR7lvq3DqBF7+NzfO2fcyguxT7u7DUk1AL1jQNKG2+dmKiuC/OtVycxS1QCSNQrI87OrnMJVSbMIbWlwbFJdaJNwzeidjWJ9nWssQnjoffWTU8se62u2B2vGy6j2Y6HlIjU1PBerutNezyjGpvQMehpsbuawnvKjiUY20hrJoK4yknTNPrenQ3ebm6ohts0v/FDPAiYK1Dzcp0db2Kwx28R77i4f5TdD3WcVeiCrJyM3RF7Ji1ymral86qYZAgPGnplkYuW48580IdqRS37UAXkbuVcsnhPCylmOEXDzjC1fRIblNa9wQxUL0NU3fM2aAr5Dv7Se312Wn54zWYWvYBfLJ+UiR9CXWnvt3y0z9yIU/UURu1Y2Ys7BfZi/IJ1FzdiCoARm5h5TgyoLzQOFTp1J2IYdrsYaAu4LmF20ZCs7aKjEM5WrRnIWRMVhurcDc5XX1zbj4kRD63JWOGPDIsk4+I4THksU4vA54ZH/PxliNAT/dzzw87N9cweV+zSnkHCqBBSwnkV6ysYeQ6tJX8qZPh6xurBTZbTakNn6+iIAE1mD/0UvPAbnJI2ywGCmUDY9ZS4M74M4iR/4JOL7Tj1QdN9Bove+9/1OHL0Q/gWDP1JPe2WyNpB7Mu9CDzWFQriW8sfAvveTqCH5/iXKHJD+gfiStb/gsOzetmP1j9AreMs9jH/EYahTnyroNhstvcChgjThKeLiAJNUOYsp/i68q8l1xYwkQgdoQFbYjX+81C4uLYihc7dckqpl0JOmq3LWdwDXSkUgyI5MrWYWMS/rEi5KIocVpnj9PSJ85cLWpwSBjTf+j6bO9ZiJmxIe+E+Vwufcvj3DS4mk85PDnb0ENLr8dKVXgB5uBwdpKbCuBv72WDyvFB/vXTtWmdrVVsOR62U4phvGUE/YZQrc7mm3C2It7kWGl9K5c+Lovd/R1sOsqowqDDJByuXrIoUEEKq9+hVHVbmqu0t7aaeEd1CKQdq18a/Kel8flZTpGHIK0R5KLkS7xi0BU+RITS6vElziBiLFVLRMsPdYX8SVFp1eqqsIrfCmlHBLJOqU6WVslriyFnwhCmBObfRFIGH56TQiW1bOO4MSaiNVMb4rENx9FRJ+yLWESbGlZoljHMe68AqhAya8t/lkli1kkqBnc0shcLtlNyJY40TzkOrBEsoU8XqUCBQ9wplwqVtCanBhKw8C3NjWJVIvZrssP8PfDolCl8Mm9Iy+h57aYel1iMRCHNoi3FnYzG3mOMp1JT96Qjx+QfIfOT8UqCFqhJm0VTOtZFDM5XiJJx1ktsSHiwsij1gu8LKpWd1fbUnVZtEJnzdloaYSEU3ooziCApGoIvY9FG7J1J2Ll14qij1aWrBpiqTt1zmFedAYyurwinoipvx5K30HZlwkS8J9f50rnKE+tl6RZDuTwCaZ0LUIP2FdOykkBlyUSYxWRRdtqndzbLAQ4XZF8KZLQG9/DKedwAb+jZzE+dchjwf7X6yfkqut6aWuztgzf2DVPMq2Fz0+8Rua0mfKemruxJ211liT5/phrno/F8blp6/lI5Nn0+dq0DgjHndGPEeF5IRFwxI+WI2hZWW74kP7tlJCO1qxDnksvt8uCeTERccqKkxrI+SUNabJik3NDcB1Ydq++wyFtgzQ3hC6al1bPeu5x731Q3n6Wm0rn+qIo/ukc8JcOChplNr6L7jC+7/DedZnqbAJrdIq7RRW2o9azeL9OGmXllv504ApNAhcz3/FfEgZEtHEiqm8kXFQWoVrcd/dArqU79O9UrnCKHx9xOLXuzdU9bvIj0hS6L6Vc/WV0QbkTP0hSVplexWKu4QvXBhMmJJxp1czWnuhmb+Xrr7k2I1xwxIKhX9P5rtB5hrpcRIx1ujkecqE5hWCvNPYrQmCLfV9wfvy2LemPYZWCDYiryEm1hNIBjjl/T0m+NiZiVlil2Y+2q9g+B/cdgasRoMUUafKdAWaCl0TBjNlNamAsFAaBEW9SYeHcgK4Nm69DyaaNcVavVMb1A+gbdjm89L6ddKgntNIaZoxx6cuN9+wXLVCIMpgpQoM28YHGycoDVrL1bSbiI2M6z02zXEVOqIx1SaVkeA7aAkorxT2OZPamYATZKTBGTkKqTK+emd5QPMTc/xmrxwvX0mmKvMwu32C7PLbTl/T5MPN3dqVO0p3JWcslnoO8vRceWayFLSfufaEIAfIxfQigoxryLXkbqSDydUk5Y5f7axlI4NruHKnuvCvvt0bQJC277md3Hnd92vYQL9aDGiZQUUuDlK0aO3YQSMLF0cvx9U4Yc7UWCEQAEm4TaYqO6xLKwo5250ym1SqQ2t/vRSKc659KwO9KcQgba22p1b6eu68KuRXeKrn2h0DP92OwvXWgo7YgJr225WFfvxx528da4fcwPVMo+/0BZMbl1dgqpAGLq4ZPRt1P3Lo25XN0TOts84bdjcuFUE6znLGFcReUHSAv4rwgeIAx4f5N7p22jc85L6CsCoW+FGRXabBF84/pfCCasjRAS/jAvqAYCEfvfdQHhdSxIkx6hayvEj+cZ9jUYdS27aqn8hFzDhzDQrHiBO5FcZv8dh8A2s0eswlU+edOczGz+nCX1W9tqi7oKOmVR+8iM1m2XwZGtSWFMHpCyNahuvq/65bRUWxz+mRZ+NVEvbBiUWHzVP71KOhOWk9JOJFtSvDhPRGcfS2hq3WzWRL6HgOkWKHCxJwxauQ1XGy1yoUjsRFs83ddRZWUVZW6frxi0C1QKMJLhl1YS2HT90tXxJ1Q66lR68KYstMPmvXAthxg0hbIN+FTilXEZWD/LeorDwXcqQdOpEcv64cLZks95VLQYYtLe+6XD2twn0945w/dmyJZ//yqeZ9fAIZSevyuozToevzVMrVBwUm5TYzfm3NXrYXRJGcKnnVzQN0lDycVvPP0LIEf3rpIz4cJgpY3UjpKM+BJA37Z8nmhn5tIIns0KELnWFW484HFJN4CfbaCasSEZFHDOXnYuMikSVextoNrLLQHdtLQZk+agHTndttBNeQoHvSntKYSDgxneSIoyTQ9VttE/5ZzmBSCnNj2mTtEq6dtrUTz3kO6yj4rZql6WNGu2iniBIjx9eEidP1fJLgaipc5Wmdjd4R9AFRiFJzf0DThddfqyyQ620MJ9CqBJAlypIDukAe4BSIbaiYEbttJNvsgz0zwDA1AYiJufVJY7lhvpXzXmM8mh9bGPP28XP6IDAgVee7YUh0jqlBAimeNgKbkr6XFGWVVVaNcOsM71owpyE91mMUOtSWuuChZZNFnahACTgP3DYFvu1rKEzsXApdu7WjSdvojFlo4rGSsBcEeKMoQNbhjN/WhS8BL9v3OdTez22u2XbiUr+emGyv8TJnMb8gmgXYcii47lxJ1/Pj7Zz1MWvJUa+oHpAHvSqIlD7HUkcYQQLcLIp0q2QJqGjz6Uh6lQZbWgkBxyO1hiZRfyuTE+UmqxPgSdRN6M5Nl64hV3AIT7kp3j12eUHIazZE1NdqP1V8sdQe6PJxP20VRZ0Iib4Q4AQvS7XbZ13lJTXveKhAzGNX2gvpqyR0g2sL202IdwxbtNvhawq8EjwRtlEApSB9zfkshs1kAj3QHukP03hW4nm0vtr61p3wLbMha2pzo/Odh5ECcXOUe7VpapxGelGf2nBwTvnVHGdnXnv91VeHZRyUqMLV2S8eqcIwFf+y80W2zM8SQhXFNmZ66M8EbGDRnRkESO1Hamv+nKHyVzEOPaSdP7Y/GYCZex9kij6+d8G52/5rJvAu9VfsbDgpM+0Y/8DxxjJ2ODBH0LQ2ahWsMm6+VyETq+AxmclbZ00/pqGqF4vtiZBhae9jg4J/XugxOgkHe+zeNTh+/R5P3CAgM8VLfaAnK0w1lvBwE8voPfZGNTQBftVMbZKqO335KzADptrz0EP6iEhDw0IUeJyKlELiUpr8m1mAn2E3qaucVbOcfoF5QuTPy1gz9KaLWEsf7WZqKmSC9D4UIIcbqBuogMMksIFSYD5YohbhMJeGXYP55qS3Z9ieroVHYYpM5sJoSXVhyVpcDjLmG47pfeclV9nLvKyKpmMMOF45aj6+XL8/0AXxvFmLbtw6twFFW+Lp8x1h4zej9cPSpKRM26cu/PFppoT8RVWcEDKspKl1tpZ+MRcFmzNHoDwLm+HC519D2kjB4sze2/M5QpyUDpPkrkgttYt3o+VFY/Rg7u23NtyZ88vso00mSZvMcgdGXhytvgrbUrbVmZrWGCwhKfFu93uerGyf9+JtdZdrtrTn5KGq9MbZ2tnjb96FqwdKdMCItP+D6drjXCdTXP/D2LGOMOwIcLhNEFVWHd7YNtevU8vX71vhYKdlXVjRJFpaPhG7O6MtBZtCQQD6JkMKw8QpNuuGv+RKKGc+CTKtAzdaWL1LY1O/RQEtDFfPXW23V2eWO3HqViawQcjV7lU/rEvkDFz5F5pfHoyFcWhNja2eqexsCVL6if1+7dyl34vVKexpX+etmW7yUWdNvt+hUJgN5x0BrmzUqIv12O3hdk34S/fPalpLs19oNiXbySUpmxFxj7hf2Gj37R0FfpaFvk7NJ/VIf3F3Dtyzb7fmNOFs0l9WDgO7VNqHqnP+Cu6a/vAjE/7MsxtHxWnbDuJnJd6cshyHWmhaf0kjJMeZEL7X7ZymeYPrZxQ7OjDukbA0TmzuIbbQgzVxJslRXSDPpLhnV7xoECXmXmwb6xSEHlV4WpdKtCWFefKtdgM80BdopKDe6v7b+mcIWPOqMjP4QFBkDLWq/lp+j1w10TO9VlEDKr0LG6xe3+Eez3/zxyoaNXdtpCUZdhSn/91r01axIEidczynyT6f74+aH5DKKveTpj59HA891WjPTA9D2Po2MrFWTlzCg7krvXTKSbTQZLMlOb7MG+lK6IuLo8C0g7oDIjxvebSH/fEZQZzY9FL4F28qooNzZkkA4SctKWTWphZheHJp/HzWdQRY53qzz1H6YQ+2dx/nH8Vu60CRKUmgeUN4CSwLvlmSc7/9bjXb99avXZ8QzL306cOn1McJOXtL0nBhELjf28jg1WFD4YBa9u4c07naGJf/GbUvi8/h3nheb+xcNCqC4jPREkrIegbjcaiVw2O6ArudWu8FBfbtIo/P3CGDTf0hpXmSfvmSDXviQ1OFW9urpv46/k+Qmc5W2FP/ezqrnTeO/zGY+/dyJNBWxiOtfYx4scZ84doItvSQWNDoshpDJmp14/E0KYl6zU4nNXF99jlQOjiqTUO1tjRIKbKNolX0MToIAQMW8ohiSGGqBQNfUu2o9H+aU1aax04K0NjkbhVWPf7tZ6u1lfxTejUrCsjrbququNnNxhX9/WbgXpM0kMe/NEbomAqfU6g73+lemmtrzdFfQt1L1rktbAwu5Qt+54wmobZ2+3VoruYl3C3Grz3DeuIC0/nRuWv/8rx38/Gay1F3K4CA21SnKzAkvqAGsUiIZEqRBYU757sVRmkZm0pL3E+P+9lIMakqRz5smBu8Oyr98XXEd9BmZlWMRLyveJwP40KOXthu1MVb/1FlUjm9mlrVjdVTY6Qqiq2GMigpeQTlbxr8zijAIFW0mi+KTU6jcWat+yjSMfbcnRGFovh6REDPjnrZo/KOqVj6ZONRDL1lrI8g33cAYWL4BSwJwHK5i74CoDMbhpKHDJytNeCik/PtJWH50L4p0ZnU4xTEoYU7giBEsyM+HKNM8jEla8bLnQ3rUzXREicLRD+2nfRaB4ap8acjryloKd5JVliF5A91jXXZE47I7AaNnPbMPgq1YyYTVjZWQ6Z1Na0x5XI6n/bMJIOUpGm57vuKJwkrO5tHgyAfkhIUjoIZh2jaDCZGbWVcoz+SZ+5Lq01YSrB0v5nDb4si9zWQcwZiIqpMTPGTkGwA8XlZGbDeNhzmwwisdR/DqU5fmADb1dv7HFVj58qo8cidcFNu/GxOUs7dI/zoriUDTgo0zwD2tHpD8RiL3PPXlX3s7ZMeGSzcm86lQIWfQewIf3/gNMWHeqdErnDoaWWzoua9xTSpiBPUhQXrfeUS2WN2LsfC1UC00V+qfEjQrVWCbnZmbIkn0jm10t6uxTrPnkGvg9qXu6TA2SokbcRgWDgZti6VsCRtgXwLAv9jSFKQqgABpm8H/A0hbNMWugqImpOUHWCmtkSina8qyVWoTtsjKBzkkHSnGgsztuuLuJ3BEhgsN3LDWQu/iSR6Dm5Re9mThQ3pkJp2sY9NzZgPCHLmfL7el5pJvJEMTPmHww0MqV43I+1igvk4vcGdyPYy4BKHe8jEa7DkhrbEZZVAgT0fu9HCSpInBm6Tw+haWQZDWNJawh8OzsvmFetndTX9sDck3HODCQQWT3yu9PLmkSUi+1RhT7huvg2Okum+RtNukFkWF8edqkQ27X3gYVS5nUe704X1m39IMMwQBFVHdVmWyNiW5TiqAlYjhe4GBp73xK/YkpbGIBkgeUb2UioTKBr20L3PTcg95KMgmrPwBWRZeVYNObAVlNMP3buXcPySxmVaBsc5B2Sd56g9i9lVcWKVT0I5o/lfd0koMfly4O8Xa1N1B9qyOnTxLYLfrvWTAK23e/cn5EsdhfRzOOdhmp6/hCFocFgReUnLMbbaiqcv+GxWgKYeh2sNVVEOM2lN+QFdLd+UFswVB75k8iuUr7OWfVTthrzPrHOp+D7my92mXG+1/xUOH4cMtSX0hEgyonLcnPxku9Mdb9iUZfpEYm0XmpM9b7DdeFCSbmO/sLbx85/tb1AsviB88IfN4EdDEGqrI8TjQpDJ1qNrYxRLUzFONLfVNE17BZSfJgiuTAGNGwdJBrzcnrrJQYCPHkGjeG39lkzLKDiOIwYDBSx3EUt6DOjmgjW3tuIn57rkaH3DJQroyQ5Lm8BjaPazUHffVC7jao3Sqq5ikKaiaB7tAHxoJJaAi0WGQJZxnBDFIuPy2oF8pvAW4AM0o7tKE3qghlVca6T3TGT+XWmkbDxLi4ovuwxf/oX9pLGXmkM/BvUXxPYbDUjqC06yk2wp4an4V5vnrhv8GO0Yy19wHr6aFHlURWWJkwWffCtm6YB2yVYVIY4MOuqvuSuVQ3OqgLOsj4pFhqDYWN8LApFAtJNrVvb7bAoAglDn4yp2nel1DxHXO6DHHixa4JhKq/Vivb9jpksyI0AVkVd4tdyWXlYh1QWIOAqVmf779AnWyHsXA87/w+iHISCuQyL47Q0Ld4jMUX0mwxUPZdqt50gPh0ayowvxstczvUFWaaRq9IY+lMUa1HF44pEz125evhEAyOWZSa4REKXxM7VHiuWVc0xUFccvk/ajDETdEmszVJJiz6oBArWTFVWEs8fDv2EbWD/C0yTlBrqA4LT4Fy7WEOCXO4q3rDJ5KCCGOqtcCInbX8HKOVdFbiYI8JxMoY/NoH2kNmp3rr6gxrRvtabhOHuy4/MXFGaVy2tSrp9fH8S2UkiHPUKOtsdsVrFqSj6m9v5UJREzfXFOiCEplr9iRgScWS+7uZsmIjikPoTILGBARoTTOKRhe4gDiQVj8KSdPipPUIs37Q0rZqfcqjJbDL7UVtg0Y2KtyXfGSBYaKnNvOr1yhpS5VRZNk5EKG9quSDaZZNmokCW86SVDypUKC7Pw4q7dwjb8GIWn/SpLqgXlbapSqDLLZ7OJPBbCErJbUtY5+24Bip4JjGBRsDvjxGtbZrbJ1A53qBqpXmlhOr6miayOhzsMO9tn/n+JNTZ1PtT9NLbpSA/lRD3HvJrNahzXjbM7blF8LxAo5DF+Pi0oyMfSyzbRYazr85wAjtbNp7nc8QglnRtTdJ7v00yDePm89OD38FCz+CyvNWQnU1fjmjNzdljjATVU6yd3U3T3Cy/twUm0vCXX1BLvgO3r6QGplzPUDr7zHzrv7gERbK76l95wliKn5eR/dh1KeuZ7+zJzkU//lgI/8BUninKzA97p1k2L/kLvFFvpq67vZsSLttOoKWJQP8xpKawJbLlRP2k9FAZ8zGoOI8Klt8Q3pcGnRV7zw3AkDUHVQJA8150H11SnDb1QyM61E3ADCS5eFLpoucFovkb79a/oWlCSj6zz1I6qmOxQfIUebUtOc+Zfq9HswvEoGkERq4LQpbSVVa4cX7uwHDudv8SAQwtfQDSV8MsesKZJsrebXPIISr3b27uVa9/eIpTxQaDZVSADVz5eTK2shpLQ9d2FN/zcxpqIZxgj2GGjzIAOABkqTOqBwtLsvTUKjRUfDVs4f3TFG31qp3Wyagj9J8yAsGLsPMTDO3on4Wzg9E8YcbgtoAPpOK7dt3IYhG7wJ1gosRfof39+dwoHHRemZFLWp32IDeYxJfwvfPrj44Ue5cGJX0gHfki5I7CzbwN4kQy9lWF2sCxoesYHwnROVT2tH8bOivr1XiT0C41Vz52QX/5uW+arhJzndwZUWlYfp789PPh79OE/Hx/6A/wkRv0W12MWveEnlcDp0bIGqL4Ou5s1ZDJkhzo0FcgSZmACUNn4bJR3cAM1xcQFz8b7YMtWqwmcLpqfH63aXoXCyCJU6N3zg/z8fotEZaOgorx9CQLvEEiTxCsbQqx4OMAeeBX4f+Wqk9lmq6Lg1Xpx+RFQie89aXy2lgEhKhV78DBCFEMloAYfAYTTIIpIDRAhEEi1YsAaYtSeWUfCmodv0/T6NzBVTX6G+G5/K2Zor8vcJ4QIMYYiIMcQ0ruYEydIgS1SgUwHYUGEGfYZPGLPw4d7KCMGgBN/hj1DgHtHn7baqkSRa4EWrti2rUJkGAAVaF8YKlG79cGn17/B+rUGPeRg58F6OJW9SwXLBgzH8G/x2F2XVoeQa7pRhfeYKAjMu5TMYgBd5z7xAJ3WWJ8GqVq/imX7GsUjs2Om0E0uxXIS/mRGUy0jgnJsNWYX9Ienws5ArujRqykJVuBcqLsXY+RevmP6OuURXIyExERSkQIBUlWLQqM02dk6KBxakQuFYXAmsrsJdNKtGNyYzzPnjILuXximtaGNeRIlfpceLGXX8M3UpaVqocfMyFNwcGJNTSKcBJtLKNFTnjITo1ablZSaqQUhUfin7Kd4tUt9Vla9S0dAF+ZSrya8Yb0hRHn/DqmSkgOACiQnK+6A5CQVFAAlJYHjv9KHnaQzcT8bvhp+jttIp2F6t6zHKaHhQYvdebnH6KtRz+WdsQ9KQ0JRf0myi1tqYUBbS2Kh8nIo1qGIWHkhvHkzXAgAihvYDtwwndadCZY9mn1dWHa+dIV0xauP++4bXzvRr+0ixxSbZu754yWIBUkudVQor36Cce5mIYDdUZ9D+iqwdHKgJD9pH2hW2/Uye0GAue4O/o7O1WULc0uQnf8xbH339MA1KfgMag2nYeJvnN+IET6Uk1GYk15YH22+eFobbcklVwYOdr2K1cJBviM+aFXa3REvpXfgyF29G9t3JNAXjiD+wer3drKJAMsMxU4oLIfeTnOkMXP2cznABihnI9nw1J46CKv7WHqy1rg9M5GKJqx5tSnvPECBOOg38deXj5Uf///nI/DlCE61piymqBVp6mUsm4GE8tQopNqQgyiFy6febl/Rh0AxRP3briDbREUWrncxDRlyRkQTggTk118ztbi9uE/c8YEGDMiHAsFDJHiAFAqQDzPWrz+MI//8E0l5fCA08HXs/EBSx34MLTuilJw3nDQX9Er9HOV8Skohy+bJ8zIKmYIk+VuEJ4VWoucaxQXhDUBdJEEmT4BKoqb16vFJ4fTh73jcM4cPTwsnvzt8Jr9ZS2sVq6q1NYeV09pSzapuEVMuzwyuPxlzjpRMlh89pE6i0BYkAx50tGMaR/nJ4yqlHqFSCRokw2+TP44nN5hrG+bbyWUeJ4jkmR34OdaTgiAnpYrBUCmFzioV3I1LdmG+zafdp9+nz/YS4WjHE9YcfodwEU94lJHb5xu05g3J4x+T3w5LGgTSR0Y9+aoH5SfcdGKQk0qFQKiUzs5KFZ2hUkkvzPcN90W7TxtVtuEi/jGO/O7P0kO4u5AiJtYPalCA2DhIcRd3qPRP8jvc4+OOveS/sKOl0+eJIxcaLowQz0+XjmLjD/lBsbEAsl/JfsSAAVgBH0NTozyT0ampER5vFEiNFS/53/FfKm7IY0dxmHUY3GisfEbWP/O2Gn4mdOwX/08HK9+yM4wttjODjJX/2NgFWtL+j7WwSjJLjHNKZnpEEpb79fw4dZP/aNhvgf++SWbGOZklWiXFWvxPVVoOOPxjrGQGbf9DOduT/20nN1C1E4e6xCJdQuF2qgK5O7/l9zjQqN8T+MTvqMY0GRUs7T4O/7HZf/XmfGzdH5s2wp+s3tXQ1UqvHIe6RTXEVswcSq3WarMZRTxgyaMd/L4qoDA/LqUy33v5zcJ/AtqaX5kSlx9Q+DarxUaEYPwukdNqt6wR2U1IdgQS16SVd6kp1E4s5KIAl4nyO7rPy7k1JKFauHX/Y5qN+93dpS2ktzYvxKXVq+VYJFiyKYA6OuBCuGCRC4hhBuBCkHeSoKpqKBFKKj0JAhhORAnoGDe/tJRdFVHff/hqJ9d6p0vM/a4rxxwFFFGha8Ku/83/3x3vWiSiOKbuejDY/VCXXWTF3flicbHuq/KsLzctbn5pLh8WfvdxiNVO1+MfdXT0FRW5xu+270pwLWTTcJGwm9b1SJdVZF3o9V5AlVBZdknUR2MW0y952lkzre08t5TgSU5dUQmXEva2xPcGW1mwuRhr22MXuxhdl44mYPBEppVFb2ivJq9t6Gh3Y9aAgVTaddHTHmPsPXtL8564nh5rfqgwhoghYa3sjl7aRV08Fo/FkcLmW/bPbeeLiWHmURX4nvQU34xedPSlmMvoZtnpXfM4XkFp7xx5FbdBq90QB7re+qq+l26c3yhVjvnorDO2gTR4/eSpDQiHgt0LkJ65bcw299RX86+nc2GXTSJdhqd3lKnavZfY7V4H7xuGV6m6by9QFNxrG66DUuC6GAwKyVaIrV1hUE4OHGapnNwwCMHcASwHuPmPVljQkChqTOWJXgb7q/GFVUyorp2zH/QsBoQqlx2AYo72QQ4J2QJ/irBVQcDyLUWPvpOJx+hTmwDxRMlPjn7+TuSLUE/3XoFFELR8OQikmEEr5aKZ3WDupyukqWzeQTriAOugdT8SydpK7kMTep3F018b8TgStHblm1QvocxP4Yya7/eXAyt3TXXrXqO6lnTWU4GPnKb8XNa7hzHF5jukKmokSqeGGH759/vp2BZnOVqF+lXnD37N6pfsJFBLv918d5HVwKIroJvfaKUmG+XtlR79NLi/fmDNbsNuFqse7t9OGygwDCHSKpCBcHvbm2xZgnmor3ohnoNUeKjqUXjLprylv9lcnM/xv0M9nlhFtseZtkDfBItsWfs7qIUUnFL9IpkCzAAlrP8hbzJR6w/4gdJ0j2l/e2Blh16hp2uQVYYCOO0xULWysHKd0JwG7dGfSCWYlA33FtOS+2jV4mrabnqOOId+LLEWP97Hq8pH5pyFxjGS9PowrQy06FqojwUNbGZ4SVE4vbSMcarSbAVnNXQWvraXebfknZzeU8zUNc6MZNO+Py390x+7uPjMFIpp9+cFYdbkqEGITNsvkr/fNAQFKiQzCqzWWzWP90PJhGjarl3+Sika7/dW7q3ww95grFhZhK5Cg80+Gy7LhI56W2+3Zmgtyage9JtpoAw9pM5naYJK63MuLK2dFlJn6IMhX6iQHSoxjGPH28X24db8HJny5Pm7GQr5huN3pnJPmafSUxUqX7xRaFysyZhz+H5K5aHyVAuZAlKEQTEgwxts/p4SEA0vS3RQYNowv+l/K5qkfECAd3stydDnXtKBjmQaT7foDkohP8031GE4NhcKeFm2zX172csAUBMbnBdLq8j0fQVl+lXAsVCcpLJEg4BKgpolcVtFwbYHoBDbJpccKBaueLkJ/FKfE+RKQLJEQ3jKekpIVPzQ0OfYma3LnrP7R7YMekLVU59Al3ChwZ0rZU7fgr5t2KifWtosCwJeiUQK9Sn8zYlyRH+U4vQN+Og2nVM8Ru5DPlZQ9iH2Au4YJR6sA/GUJGGjaaDCiI9ecweKqF1CcfqMKArQvR/kgrPUlYwAkEc7qTiHyKjWHJk1mj2iGZo3msdnqHbMi7EiwMzVjN/meAFjOM/xmW23x9VCnmsmzin+ZHkxZr7pzzkdZLsOqUENrRPk0D4EHFAsAK4v9U8WFQrKEw4WGDhVYwDYJVAUCkisIWXP3pvNJt2Dw2NF/BTNhEaKJ+GWxIbMWjhEwrfUZWw12lJD/3ELZ8vuVfvK3ltt3b1yjwJ0LXzvc+Tdnob/EiCG3wPp9htPH/8gERIn7HaDwZup1R//sqFh3pyBnrpdDfVO5/lk4/4ocY6dmdlqtJUcsc4lf+Byff5YFkFsnwWz7cSI3YIJDjEAA0jMnh9lRMAFxEGDuFDDZRmJakIlSUHABICXO8HmDZGCyPUbLYTmG9ZDhx5s2GCO2MCsJFVTlJhmfv987nw/vxljXme5zYU99YcsOPabM0LXvjrefnPHnmXvUtzbJXJXcUbvD10WjoLwV8aPFER9OuSxT75v/b4/uWDCfwJw/zR5qfLhbuT6ql6alLHo+xJ9Al4UGVN27aLIKTt3UgYfEUamfKZGCAmsD09SWbd74dslR59B8qZdFJyj6r38/WdHwhv2GwLSJfqErpw4WqwijyOOWK474RJ93BRM+8/oQqaBD/0rvn9srB8PKR+tZS+VJEuAaURAgBPeiRkI8ANqiU3glAM/BIi9dX9EiQjdTQJQ/rG6SSKyKfszVHG04o8iH1GhCmCseaxzOfJuXmoq09Okv76ddUyxqWgeCBCGZGjVGmg5lFKAeFSTAi0nUmqUUFI85O+jEuNVoDkR/ZipQ6JjLNEsXxBCuO8diHfJcInS2RaXodDSBWcjFwSi6NTrRi5XKsXjoixyg/I0uVcgSHqEIfyfRiMjKli+rI9WMSjmuL0LPtD7vokdCoEqK7YdFhedQiDlxs4LUsDP0PfB0yfhdeIyaWnKn+8r5OJigsyEdTvp9SDTyAm3AXdkD2OUOiiSVSx18DtnmeBhs1YAr9jbvQZeDe/r3jWS8B5kQ6ybPvllR+dgLkqK9jd9SN/QFOa9pT0viR8JbzfXJdWsa01+Ue1Q5VIFPuVTyTQT2ix1Vuik30OFXDQ+9P7WP66e7ZEv8PODIDu500HtnP2c3byw3TazU6MkG9LoFM0LyHroNfRZajXdRvgWyHXEjiTvaPn4c0h9UX5E5N8kC+SqTL0MLLVRYJ1SQ1UzQmoIwd4nnFdIKsSByXCtn77MuoRfrDhtQvRYlpRnW8DURrIKbPOSvN2TB8LD8YTwsMFBPKsJNzw8IrEQJuBDgYOY620cCIrF88+WgJl7/U/0z3PMss0EKiGPme3HE3BDQwdH3gaMZJpVm/mZVgtZ5HmAy0uDcP/cSuEZ4cq5/clVeF6T2jPgR8EFsAO+QJn8n8fecN4QW4gyNfZdMyHUB74vbquTvVLcZI3XondBTJV4XNaTF/Xjr0F2lrcevG4vbHF+y6puKwqHa6tNCRc9LhJMZ2eIpJl7nDf2mgZkkWFLS+WM7QxKxUJQiCSwGO/P2J4BAsRKJPjwARJQKG7g59vkCVx1cM9KuAba2wtXWhtF+HYfLKV+YHsFz/Pmgx0k6eGeYG8fZBtkt6Y8ZnmzFTFZQq12z4HTjwXykEzOr/XCBHf8DG6lBltWERJtHL9Zguee2ZboylmIQHWcLWM73+o8phf/1O32r+4UBsh0T3LynlCd6dVQNFRNR0t6HW1Gvuk+fhT7M24EL3lHcD9jR5/+24Qfxd3BjeIdBWZ3EuOYr0ntfbnxCZl4gWxVJLVa4vRW8xYgAydmSkufxz6ny5mHD+M5tD56rKPUMRaqMa+hx4rpEkcFxVwqAQpzWkLG0tuA6o4LtfIDKWvGn9I337PYRimktC2OzIOeICD3z/vp58zazEL4aY99Ottups14rDZFz7zfmXpwmsyXcJ/UP6ufbzcDS8+gwo6ZFvTRB8GihQoLoEiH4tVCinRoYx0xHZdR2J9qxCk/tLkSroJlBdjleqOCflwGKW396gxIEQkVdAYkIlcrpnbeN34dDtPDSLQxOilM1mcswvUlJrZ19Cck9uHo3D7g0rCZzfZHT7KvspNiPbNY9ANs9kv0kj614m1hXVqq+UxJZU486g1wLg+3SIMM9bD+5Nmz4U5mBvQlLD/iwsIGxnYGqsUAU7idZ77eZp57WvtVMW07wzyXQV92B4YHKIEA9QA+8wvjpHnUbRENNf9g/Lj5PB0xgXogFBynu+z3jZ5bHhfjFtWm6Pd0ybhUIkbfMQVsLh9jE095/aHEvanYM3sbPcS+jL7lvMU+Pf6BH9pH0ipkWhgT3XYKSXCkJAA5PSnLNi0eZobZF3nohRIho1XSKp+UQGc0iez2+0ZywmzuPjRyJWWxL49NfbMvY0b0u+jXrqgQh4XZpLh+jI8t8S0KOI4xsoETENE1ZwZQBIy8xTtq2i462vTAs7oil9Rek2qvvFnmszFeoWeOV8HG8veznnm86l7gkV2/Yo1taJh1ovyf2JiQ05zzfmMOU37na91yjObJrlTwdh+EAIrQIRVtgOcyNbjSs9YCBbefONmOaEGcOIpsRSnom2gBNjbRQzZUBa0Zj4LL+vpLYU9s7d3MtYewpMbg9XSUX3ej512KGkJCwenpwVAQlLYcqUYg6Aj8gv4ZgUxGTbgUIlD6BUYS3xCh4fNfdtgN2sQMDv0u3KLn4E7CW7n2wuJqeeH51VVI8mNG6VFaUA82etYGZ/ToJFOEN0RVhGd3oIcNRx1KWOL+is1sdol/axzk4R7YaGMS6rLyLwHxObL6Wsp5VjmXFz1mwl6Vfct/WVXcJhyRleuq9j+f8mxcAb4RQVbQrHdEe0Hs7AaNqvfzfwd0s6wWB6+ohnz8XyJD178/btdE26g0MepwpTO4/6/brmr3XbgC49DcMrWozfUlIl7atDwdQQkJtcu9jTgZw3tDejOFmnpDtE+Ukd5wv5FGNAWeK7nXJz2ECf2iBPfWTJ+2zET3LHewlHIdSSIhKV8fCFfhNouH07V182lXkaVslw+bth+ozHR47lCednC9vQJtFOQqCi5oBxOAfxOP12S2bcqGgwJzmP7UZYr/LwNQrheVgKoMBVwpqH8WBMHFCJoLobMTBbRAPji0bmpphyMtktYRF2ndLoUucUsCmCKZnWkkgGbEokgzE5kYWaK2vj7AQ/DGy7ckMqpKM6otNEEaSWhJFNtUMRJuoqWtSqwJCraAI2gxXaZvQ/tg2jDLrMUH3SYzM3XnAwsuGIxcXoJxwWLlhyhtdFHRmBIXOcbX3IZxMXfRo+MEpkR+tWGxzLsOFUPxAzWpEt2GfpCZz485FeOd8aC8KAxp+orjQHSJPH50QzTl3NtWyNbJjF/5t2JufVh2uhnHlvCEssei2r432+Y63VD92F2R3pDFiwXzg04Of9EHGOi86HfGFrVR9G/0JjWTI+CYPm30hTIvDnMP9P8FdrT87fwp5iDuIjUOR4/rt6hasr0yStrSdO+0aVvPlYfCc7/3nuDun38qmLv2nX90xHU2or6NsBRYE/GIu/6qMU1kyvtMfPx+nvr4OZg1koQQSbwvpj9eKbdc+s/E7NovEo0pz/rqpMc9klqmI/5i/OOPbNsvFr/iTe4jQUMRhuH28SLqy11JHSTyLr+0d9V3v5bCrrAFfde1KctHn0+QK74ODoTIVeZ4BvZ253/WbBITa8CkXDYjH4corE92ckCyWWlYMRVJoLNkJKw/lUwhzHawOFQJhbr8PR5JJu1Dp1IJVuhDWDfg+Xz0+/3/xQozDkOIJfUSAv9LhsbGfiou4DUaGW+ThamIxmTZwHGWr488Za+xyfgF7xo6DNykXQbMZGW8zk2XMFlhwMz3k+dA9wXSnc3e9t6EzS3oniP3f3LxLXAqUBTE6eOKFcVOxb4JVbM58ecTzqcvHMAhA76xrfl7w82GG9/VN1vdee9eWvEqeMYDJ3edtOe1AR/6VvftqjPXuWevy7erQ8BWmt5i7PdPR4K444G/fz4Imr7v7hqzlC1BLt+yPad7+/r47ZovKhpB83PcVOy40dQCPOO/ZDUW/ncoKBRfhW+6bEoxRnbrgQEyjQyson+Dd0m9IQYLsDGGgVxHmK+iBlXGKgKK9EIEYsRKGwPbDdXxpHNjqn7wtaUFgNiw2BoEyt/ZlrMMRaRagMY3HX/TaZU062aqs925tR6LdGC9dl106pfF0otfy8UnCWYxq+IJNsYrIKd5KGzrqAeS7jS1JbvcYfc23ABOC4e1nbMiP4lUsjJMtD04K/t+oZO8mQUpU3AomE1Id7Zl26N4NHNaY5wHATQDm+ZfcfoM23N6DQha9CixObdnajiFZm8TxMbLLCBlmDEKjXCKq079KlDP4+kW1S7RNEggnaVmoTBSlwbLlKy61TJ/C5ydMSPUh5vC3pIBpTfbcLurrzdh8C5xMpkAVV7tP4C6EPnJK+qdrdMxmhhCTLByWDpWVWqVhc4qzmoz3IWURq2phVSqpiB9gaVNAQlXb2eN4ZQvP8uG6DDqOqbDBmvzsQDRGBiKZaBgIrbTzhhtmfFjlY2zjXXJ2B0r4GGwOeccdpr/bUFzAa1ZKIxKK+2U83yUzAco70e0fAonoxg3b73osbldp8e9Rze6IGm9cH+MqRvNksZqVez5ZBfQWH294ko+r2p6kVBCZN5dl4cHqxVfswQIUVyWFs9oZdfMMmhISICmrWMqMvzYQCEgY1Ai2JpbECa2CKjCiGurxbb+uruCKQsyAo2OY04dwJBtieIaXA5ha4Z5hoXOOpeqQSrRyFw2gubsj/IwVp3EcyvxpVF7JdFWUVZZpWPQ70VOnCok0hlaXaf+mWJE5xkjuDCY8pMCyZr8MhiMpfmDIFWlj0+YXL6P0Lwbk/3zc9RRJBrznI3hrTLlJW+MjGxAoWPloWCv3/ssU5CY5sKOnXwmCeFvSRi6fuO4h+HksObxo0ReI61o91lGfGBOuXRqiGSXPpQRKnCRppluTigYlY4UJG7mpVeqeL+Zyav8CPdMI1vkpr/NSnyxvKMZWBn3twFn7j2uXwexMo7w+pJxsy5685Agy+TcgD471SIPZEflWSUFs80vtU6YBUaYBTRreFY2QaaVu1VrpqpUm0YZReRsF2cIMI20jMxoTxvPaNNoy4qijjM4eqc+BMG+4FbQq40rpoiFDyczaVvWjkrT//JdFRbblej95kZgc8Dh8+t9/0uXjm5uoWVmTWTWkabW7DsbmL1QZe9h2VW57ZHVYO7WyUP3UUl3RQoXfZky/fmrYMXZkcLXw1d33z8ZuifSVh9uOdgrFPZNrPSvnejzPzDS7r9u5IAQAAHC9hhycTGhfGwgNHDi8GzsXEjcP7GV3Y6xLMTO7IBq9aOfNRZSp6aqIYe6FKQmOIFHiPMTNoHzOvFcWpuhvr7wAMkXIO8jH/D5O4pkPrwJt+u6Zdufe6F2/8uDToXVpqOlAOm0z9G23zZv1LZVg7gAwxeQnoRgZKpCEFlexTzbKACtvYSUxifJcwK07y6QrqhIB0VCK4ry5jY3XKJlwGxUwJ5/2wIGLpodRPx67HXbll7z0nkU3Ym4YyYO9nY4/kul8PPtM9Zht2KvcOPPPQ61+RdlSYrM3/XvsWMafihCBAEgvZO3e+AaVyZVcu+J7xFdxr22e+CN3VO7N3Wrr5v8Bla7qWBZUFA2lJzEGSx5TAHiKyJEAiRIssCUR1igqYqXl8dTmQZuV2gtL9dppts9I01zc0fl5ql4jLBzigrHxCTH8nrHisTEn0n15Y5JifCVKE9KwgyKv+wYbRY6GnjcOWHRX+alhQjezy4KDXco6urqdJx6bjVitAI6FEsQbx2+YrBtdBy8LO6hxaI2aZLTxRtLRNcVyx+upqdPG8eZTNbUHaBg0vc+e3aGW8MFXvOzhNbR8/7W9CoscUFU0jyzsGMQjuqZaDEIN25eGTbS6m81eoa4HrkpQD2RzC45aRB5Qv27tMrx6IG3YP9lXyyHSov0zpaMIRUC9C2I2dCVZrDwyfx7CNkhq/ZOg2hWPt99BMfPjJEbEEXwxFtwcvHt9ffwCnLjsREhLZQeuqgUqKjCHx8j15tP+3mp47T5dub0Qz5VJVAu1tVQVXxbaAhFJVC90ozl8oGYmGixcjc/Rhy9WxnD37nZxY/9fMOwgtcygijFTTImcYjaod21cC1i9xCZuDP0SRwoax4tfA1p0tI1IoH0dE2TjkxYDaWlOQbhJpunZ9FCAB2J/7Q2Merg0pJgzabG7y1rnzw6MdHwUVvccMci+tvdUxa4UQwCjcBO4qLg4mIoul9uLBQev5LLQKBh3ChuO8cKbfcuK9a+anjtWh6xo/BwCCepForoVD5wVOmKKICbwAG3PSG3neKcJunwTJyj092OHONebFUHHtieU4LvvAGwWES27XDd0Ma0p1bTttCrqHfHtREEF5RmX8f8LbTcJEI7doeeA6146pVKLcVVp/bRBHpOsBWct25jDpwL1ygoD8p3kQvbac0ItE1dbUSI2AbajdsS/o6CikuhGAeoUTDqmbLlC/4b8Shpgf2/Uoj/j/YeIy4glogywzfW/5woik+gANqxGf4hJ9GftMBcOvcRBNnmOebV5lVG5CXyt1R4kriciT/U2HuBG/TGQ3gt2EyNUUdEreMJGCctCWyNfmXWNT7b62u+RiHh5pMbyw452OYE8sWVhwIDVeqVztaZelQBqrM/Xk7CXgERiz9hSSij/k5UgR+ICCWvBEHBKidxjv2ofKXTeekht8fritCDByMJtU5aQz/h7b4nHd+Y3zpwPnzqCWFpkIQn+G94ylfc6RuqUAaqM9rN5+b7Vf3ziSuItPPfzI7tZNxN7VzHLuZTNIB2DiLu30cMIQYFD4aIEQBrpBEMZ0veMy/HSjZ0AMAcsR5hAtqcxhncpJB1DRFxy+AAOMIIQBSq8uIgdBPq0fPdoZwySL0tJHS4S6d8F40AxHUAkgCvYI0XEFMBxoohL03WDYcCEePiBg/RODLQXbobKTk0flYBgvXBkuKBObYdT0vav0zlOe3NKN1/qctFO4n4+jU5g5ws/UEE800G2TS057lFlK+zVzj1aFE/8Ux/RhqoivwJXpmaAs/Io6Wl0R6q8tKlXDZGb87CRhseGaKxCfgZ1gw+gTmqjX9zaPj/7At+E+90nWVHmCF4E7dbUuIrirOZVaWlNRTX7WPehGlCeueKH2bOQRvlch/c+vkWgFexcnLLD71ODm3K4jQyo9mGexB/pUewp9aUapz5Rcs1DZRjyxfZmDqviyTVLdeAez8wDMu29+0oadTWG29qMd3E/4HK/nYY/1HczMgxWUKleGcQ5weJ8VSQMUrq51JyzOW77rXPDvX63gCuzjeQvc+vjCAOIl5cQfSCyIgOjTSERjhHpT+IcWcKRxDPr27YITSvr3gLwAIo8cvAxhP3KW2DDUCNqP/hUC+8Bb52CFFv0ddGRckgSyTEJBsBSBB3ZTWBss/c9iecUrOMIt27VXHGrq6p0BaiNya6K0phW1GPTiFtKZfU+zX9lkOLs5PSkL8ziPecfvsPOMZ7FfvywbJOotHaYD0gkR5hsUa1mlRga6dOY4Q18tamgpUaIwxWCgfUqpJAMlijioFIi0QiAsZa1IW1YqxSW2LhjdhnGTooyxXKlJsOikqQI1wpezjdeY6dEdXN+UPPr3XXew+FKOFzZ72T+Y9o3VkOZVSFYutp/0igd6VR7TiRQAcyXAHklD2oihps1oFsV0jEXkJ7MlypNHwPcgb/SDWrTjd7xOnKd9yc69jl/SiVX5POf0TvynfYnOvQ5ZWPNzmfHtCAPGk0ID5KNasZ0mciFF0o7Tm5fOTfD/W9ks3+4HRlOQYCjsMYcdF8kTgmJg9sFgljGHTkPIVqQ5V8GL7lHwYVupjjocdp/JV6/mMIx766DW4TYUwY6CYnMo48v8eSRv65PIvbIadhuDR00yJurpUObenJRDT+L3Gp6Zim1FlJ0glLpDpCpcFI/+wy3YgLY7qFH/QXOsyhka5WVHDxcjqKS/nUPWy58Ir6UwkY3IK4xGzQvV6oI+ucseIJcUZp37xO8jQSoXjtBP7boiXgTX9K1YRP/tGCo94VEymSSnmlqLLEraRcVC4vf/gF/z8y58r85XvVyG+K6l8+/QLXjP2djTvLOmvI7khWxDnte7IBGB02O4x/SyQT3+LJBLITDpkdMgYGv6fGZCMAaBmY9qaWdTfEN8ATwbOBgVo5HBq8Y9++H50PSoC1AR1sWhpiikbn9KXBpknb2cGyiR3AFTWEyoIVlEzJOta5t2vShogA9+veXFIaitKikAQkhY2GI2vWHmlMaW7NaihLy4qjUwgMHZvLoLU5XOYELiKiqYlQQOAPEKD0uEnaJC539jSeRTg9e3fqNAHJ87dG4qQDd8ekXBbXeeyaI3YESxvbs4dIKxmJZW17TBhVSRgaGqhMNPulK0Edwaa3Y0donWxPw+U6DWmW9ELp2dnV0THVqan61BjKJCUmL4+STjh6dCBdHYIdKdnRL9sO7Ih+RAWSkiHV5r2kCgQwAgIRIO9Ic/PMLI3eNHfPRGgrIIa2BboE7rRBs+C+xRsc6+Beh4Ypc3FMmCCYX15mFiwIG1HoGcvLg/lhghFPsNyyM17Z5NqjLnJzXZuClfYrj0S/frzqyIRAma+gRmb3ytqO/PIog12bxm86syZtpm1mbM5ImFLWJkzChQgi+qf4/rrmV7KBB21GdKXxttmFocLkMyesTkjBhUO3Z80ar4i2dPXv5oln3f+tZB6fSDsuEjwFGHfxLG93/3+iW2iQPpFm7WQtiXSA/uMwX3izpSsApM2aKgu6Us66QOZIdBUo4Y0eId/a9WYBiKNSiv8qSnv+1TyIpdpx/NS2DWY2SLc8x2erfja9ioRjnhtcmW0YOXZqB0sV9NX8eVpR8V/FR8QXAeNJN+LyZQTk7oHQwF7cKXBVlaXOro/1bzHtJTZGRqCT/H8Zuwl2xltMVFZuC942EbpWjKqRsNETpM2VlTleN72jq6qyvQOrPCOlNxjVFtWCG4Ici5x/j1Hl5FxEAHIUEYPIpWTyWaRc+gI4IpiDc30q3gr10mipFNaKZE+pOEycKEusnzvjGf2cofFjZEaaOAliOE6XErkKpxgjYWSUkUAQYRQDh6vEB909PLBnWZN4DxfcDPPMUt6uhGnGNN5d3jGNuK5Md8uw9jgmoGA8j8iHmE7CxXMCpuTaSZyLR623LDsjYyo5ttcYSczYV+wQxXJ5Mb1q2ZF6WYHXEWQTGUbHZ7vCIuEs0LOyFloWdKiAVUpo3JcMPARuizKKhCrnq8jB5L75Qv4I/yRZxldSu5fdwGKRbNKMJyRaxGBGjnLf6aRR3MXL27DRmuXMHzsmNquhCbC01r0olP+zZB1iI9T2/4P/7wPP50F4wu1topzUYTqFvkcrzhcHGubfza48EIPjPNapPiHwVrFWOEL5lqsXnz826jgDth/HdHcv01JmqdplnOgoRNG8kCcylfKcZcBVn2YinvDWIcRTCEJjcI87kPTF0Rc6NGG8lhe9rHj+8XxqGC82D8/ABlRXjDGP0f7JtDBJxHSv3Vw7cJBoakNXwvRdhG8l3zhL1bcrmR2aZQarNYYBjH78iALFbWC7xj3O7WYGBIfHpclybuFW5i8j4XcYmeRyynpIXIBxD4jS2ecFnl0Z8Uwil2KdmdAPd9JqSfrai9A0U2ox67SdrnA6fXHNqvNwb0zd5gvJbofWW8fFQk+KVkdWroXu89z+zrr1vEgd7Xh835UDUXDID26PHTIuRg5FmG+IfJ8LiU/9Gw5yYi+a2Nsk/uNRt8Fo2SY07HbBP2HIzXVT/dMPPLJCGqhbV28VYQWWHoZDudlQqIN2h0NhXGZAwGovhsKCqVZbOrtFEBcvIphkyki2zlRrO6+uTtv6egjFijTCCUX4uDIHKWBFxZmtAOGaYpi9Doi6q7Ywehm5dHcT9fIxmyKHAo0U26u0aVYqIxhZFum0+GJGCcUS7bd2pJsSvq+MpgWtRqFCgAasQ60Ppjk4vtL666nuEwiMBJZfSXQIum+fbONLm5tR3uZZ1Ge932wfYh9CgVAA7VePH+pwI34xVz4bYffGiBNMstclsnRKYvdguVQPZ+SqU+V7Ywp4WbYFe/e9WgT8u4Zt8KuTtl2BVhGyEF26GqJmU+mkvy/a5h+vL4cqoGP1dvkXESQ6iKGSx3utdJ9/3Z/ur/n+qjXVzxWLS4+o1le/D8P59Rz/XXPxH6cVmGALi7BMq4hAu65XJ4F/1Orc1S7Pi1fN5lJM7jL7OWd1Trm5GrBkhvco1mIoyhNVJPYoFHjm2pV1HNnIpoIjsOcBKNj7JfASQqoUayfILd0iNMRaj3IWxP9z0CA1LjKWGf9jLMb+UgnNy/iy+VYnWZRT0wHAUipZEU7yNGbIATCv5Cvnw+flZCUF/hv5BExMnQbbeQfDQhjSkQcH25pGiNuoB80Oxm+MQhaWxiCiSoqiQDS84vSUMdZMfUBjWgJktJ1uCGSQSGQDnAtxGzTiILMo1M1GwE6ee6xjMDdTXr04jAttye0huFjZGGdAclwIIcnSUWbOXc40t/bmroBkQnMHDwvssfzmQvxuRqw1y48Fqco/XD5ZPHSg8KhfXvFOMhRTgcN4TVtBfn5Ual4KMnrsc1pBC9E/o5xY3BnBDOMMHuPvOkzXxdstU3EVdmZcCRRuYxrKoBsLeTZU2NEOd68mNGcv0YXjyc0ALrgQk9Az8NkcXxle9xplHGIuCysg2i2T48cJ+/JGh+UcJ4yyiQKuZwKfHIwwWeKwoo3pA2OE8UYr9FJNbzK+Fp/cu+Fn4FkaTaKSAanGbP0SLHsdv3X2HQnigql3pcHBRus41ErXuy3FAUTIYf/9xw+ezD3BRnf899+7i4vvzj6ojwbnL/yBe0oIJzzF+eFvEmDEBj1fCqMgJz8nCBVOW/CP5xS25vt3xycOn/T3vfnoieWT+3PAGzrKVzrvU5xD8wO+o8dL1i1H7PnzzP4/dq9JU4uD03ir+f3kVSvGxVk920eOiDXWCqsB0NGURoVoMDnCJOA6PkyrnjHxc6w5vISQGIStrEzwAx14X/jcNOeOHwiHGAOb63xc3+ghaIQ3cugQqHF9eDxmg5MTMn2DYh+AXjJLBoSP3RMChYzZoEvoho5yhzpV6QSFS21IjOuvEpmncRq+4djO7TYwFLs5rge4+2tsBxuPbMrjnzFXSn/6focD7A2j1Dskg0pnpsjqFr3DhYo0p7EBbX0uDelrlBtYK3fXuzWs/yK4CDHQKyQxXY1HsQK7IdIu7zHPSfJO780PbYAlr42VgJZgTqMOo9UYCfoUm5fMiofK2rWgyrmfQoFGcyI1hYAkpFCxGcIU7m4mL0EkueRuDGPS4GWYhmOu6Cn6n0y88XN4FOFJx3cDN3Ao/NyBjzA0Yj5qDs8XE5iWHATUQJ98UNeHknbE05tFrTRhq6j5yPJmETpUn6wGQWwZILS8eAHFob+H44KRwZTuxEyDUi0MWZGJiPNzLuLUeri+Bf/NU6M4ZhwULcg20sGxIH8rYmPpnWZwqiGVgbfNMiU6LG/8sWtsuI1EFO2sKvMDaQvkMKTMpNh0I4MzbIscpoFhc8awMaPDtMTY1x1lm/a39d9p9jZmf1q3UEmRCSvaHewZtGUD7nFQdB1SA1y62gF13+jIi5IYxJ/iasJh4hLxILpHivqrjW0739Qer2lp3tLUlpbc3BpeTVw0WsKDRL2/zwROcp64lDFBSQnhzV069R0RcBZ8vSDAc4LvqAsw/s0Agyp4A29BLAioggXEFviNzUwwlJEOBTsUinUonUGPIxGGhkeERYT7ODwsHMjS3xwn4pH+iLhoyhikSIpVQUaO2CaiH0GR3IR1MlJBSbGQYgwToC0sE+II9zzxbzjf8FGE/wkfCuNN4b9d4CBIDPWOLbAXdH9h+zFQUFZqKLRxkPuxU5Ghxpj+/KY7sL9KUCGwcoXvXC7F4Tgl9LMuBoASq6xFHsAb/pgSuNi9Obb2Ive+lP4giRbf+asZybvwiJJGCVoRpUGqsSlZkEawM5x16crg/5wEMd90IUEOqC9HWqIHldCwWGzDGcmu4Jy78C8aIkDP39E/xnw0woFOkHSn6/KfR4+m/4+9NP7l6GzALTAS/mXzP7hosJcfLhiaN6+w0/YEmW7hhYJYsF8SJkm4Nzy8/uilPesD7fogTYhZANN5BXMno0iqYpqFwJo+nn424Og947tIGdG7xZUalXuRRM0itvFKncPDqOpm6LvSCNwLL7k8O+hi0AWhAaCZQoIl5AXkVOlTSAbiC9Kur2Evcqp3/3jH1RzAbtu1e9euNjYo8QO3RTdS37P5Pq6Y2z//rN1YPNXfj5ieRpjUNz0jIWZmKP0z031dBvjgQViktQdHJHhkxFPDyEFwZsEn/NBqOKMwLjRWk+kPvUV1GaJqw2oVa4HC/xBxFCemjf0j4b8vQuSzNupccjZBkM+BJLwcHg1vPnXUAUjJCZJ5FF7B6FC2VZY8N9/0V/3gZZ8K/r5fWDW1IfLuX3K68svnn+vY1AefXex3YM5vCl5P1oXCRkNGaGG5lCKeSZqmkCQPXStpKA5Fnf77cvX/Pyu0VpdUxptIEI/6cPLqXZQPDwTEUh6GjJ/T7OtxKiWg3W5xX083vjKqnAjzXpvZodydjyRLqyku/Jdo50BpXMinfqudkApMBs5psyRlmoHAtJOlReEnqbh65OtA3X19A3iAFCyijgF9yt5Izwew8U+rEBakbWRpse/V+ZK0cHYseFi7hZDHijziwyOB6/glwR/aX09LAmlur6nL9jqBDM9KrHGcPIDqLAdhNF6EfGV+VOkv1E7sPrd/Xhf5sZ8aQWuGcgjiE2DLir8K/zJnlDLq90sSWSdPzHYYxhXsGHMo3hMnTZungtJVlkwlvDUHSrCPnbj35HXh63JKGQU8vn6S30420hiR23c54UNvhLdnnC5RKszIWRQE9W8qg0/Kcsis/PsWczvD8gTzkaJI8UhicYKxPuW4hhOd1imOMWm10ZqYdOAmai39IYWFnS8UKNYiz/z738NIP1Anydiv/rX55Jt8vvt85h4P2oYQ85xOyCEmg4cYcjRlc+404X8fqiz//nvUmTozOjoj6hNOb9xUUDgtahPOtK2bAbGhVrpXOpimuhV7ofK3NYPmCktCi47pfvnDTkHB0RNnKoTCy5jqajY7F2/imZdvu5+YRtzvVVhpELlbff2vhmCfPFTsp/CgGXZuGAcbgesdxKyHp8dsYVFhTt6jPBDseGVAhr+Cl7nJTGzGx6WybJm4NRuTvB18hEKhzMxYCsnMkqCsLEpoVmZI4LuoKDN+hhbnQ3yzu+JOYCt7pp8hKypLhyrfanAswF3lHu0eszV3/4UyeP2Eonhfy+KUx+jNSJiKXI4bR4xxElQWAR+f34EqkHXGGcx/nJAD75aj715aH95pF3TQxwhHl/hjec8IF9AdBuu7W53n1sfiCb1GRj1TxT+itEc5HEUgga58wiKk59Rtjx/8R/03AdG9wj7dCLp954p5Wqd5HAH2i8eM9QwvrzotIez70OQsIiVda2kMBu0P0ksoaHrJ09uwTuEHQRs82dZSO2+DzS+P2MFvTgmiF7Z9+/wkru//AJRsjU7DB1Eq5yivcI/mheWBV/8nzO6/Pb8907Al2SPQLeilQ29+RIhbS3lUue53kkf57s+piIcHfHT2oifT0ddTr7GDF8yCrpfbemovjuFcj77+vogw6x9SFF55OGNN1Pqkv/6fbnitXVuWJSj9pF3T0GZe/yqy2ZmChk9+a8r4R0s/KVY0ZAnK5J+K4oafrddtv7y9J4fZEugauSzSS5Pgq7C8VyQLC6LX0H7rTzpwQOF+3bo16lWCj0ekp9abDVTrBRpeE3MDIIRzlgNBR+uTJ62O4ZH28zHcCte3sjcqj8Sele60bWGQPMuoX66i6tPMD7DRJ5c/JgU4BkH6p6gjfGZpo4PR9uRjmeHeVysmakMSHB9eghSmj0Jt7Ymtwm8tUiePQIDnEUESpsm4ZTpeoWw0DvBd2nCCwY5hVO/P15CWCqS/WZCCWoolmXL2Nbz9aKtA2SMMXX5kP7UvhEAjFEqQERhAFahUCCMT0bhvDYqmATKgoWkhidjRRX5xHxv3N521MhKB6kXjEXQUcBEbLtpKujlu9t4I2RNaIEP7dom5iiA/3bF+hNvy1x9cUaESeSiq8HlnvTuiqhmV2d6SDatAips8wihYHlvoR+WtNT6HS7Z6HCYMo9CEgaUyWwcCMIFjdOfJWX52ymC7gUioNAcX0UnV4xQpkU3Q5HZ6LGCEu7zwWopceT/Rw0E52QO6ti4MYjQV7potRaTfIlUlGGtaSOfTkaXzu8MYTWHrrkFuFaQwy2BQTLQEzFwBo8kGObWa6pJzpyaMl5L7IsdcsHoM4cFoEtQgscWkkOnqQejt7Ovbn5URyt5uH4l9HucC3I4aFpcceWnxxx/M+G8/zVcvq1nW7l1902vx3Rfhtn9UMi6W+qPnC69NFhmVYlTuWPylMsKfaJgTi77mGrD8fEbaHa8TS4OAjerSmtyW+sS/6zJaqTB3G2a1w2W8fzT9lNJxqEmGpoanfd7A1YlGWQT1sETToTg9veaPNI/09b+7JJj+VgXjyI0TZQ/gK0xtqUV4xtFNE5V/ueOCIoUPCzMgNpdoxiva92FL3LwZUWc11rRRZ1nFrGrFbB19nrg6MDY46ns3VVl4cN5an/Tx/bt/D7eJCwS23YYZyrd1+9jJGXuPN2CNUjbsHPXzvNMlam2ISl2zt0I/9GX5Qb08TB5utRzFFt2Y7rfYLNYci/TzCSjGIwo94OlQq+7wrSrgL3sPCQ04eVtKfJvWkzo/7jsKgRc7TaAhwjaN7MFnqr+0xd9OidmrYE12QYrDIBMLV85uxsZkpkAgEonJ3j5Rlb8FH48bwXnvsB4jxCMqYtydBRhkzCxHq4zYyHaeK82tB+cujN90vDl+4ZzTuRiuhZxzditbnvqqbJjB2hgRTY6O2GhLNRRVqri69rOpwoKXO24+kRJLqlLHcZ4KK/f095aRtuMeNY0PpD/ede+eE5swedxXUbRhk/rebpT5FQXrbOjfr/TzcpCU+dlzJptCwLnlPkPKjfWmd8YcL7qssM18XEHwkLesd1B3/KcJ5r6nAU9+5bqvMV0/GS1+2bRM3wjc3K6Wx1UlYt5GuO/22bW8c48qrcuzQ0sJwf3ucbvlh9t/m7rrUeLSdwR0TlckjGMNPvd+azHR9lftbtvVj1MCpGuYqktri+01iAo0UqJ+0Xp9jeLQ6jD3UIueHzKuARYlVDyXgstYt9Y9n8MLMg78soqCK6W6JFUtO4fnuziuYebeQ8WHZezWiu+fsmSjKvzu6R14u3cazzakp1cAsQhEZzhumo3UmXqZ8jizm6Z0OpIXieSJD0QkhPc798GTiD5fXg6jBvoCVwtyqgJz9DL0Z7RMnxOIzTZ8/+j38ESgoIB+HTw83FmF86Wmjz16dE1QgALOP4KHY4Zs48B0vRT9pb2jPtAo1t1cmyaohj+PNHDpIeB9Z6B8xcvfV5SfcVZ3ycOZ7z/0mmWnPFKvVx3qq/5UxwqHaH8r40ztdu8ODMzLmr2ZmSl1pYZU86/93xc/WvpvzEOjhwGjNZG/7Ayda3l06SNDrzAqeXnYyAKoY2LUwH7+R3TYBSOBS7ULg0DXewi2W7RqyMzh4NqwwMAQAIbW7iFMsybxe/CTrOn1WxH9TMDsRwQSclkIgWiVHuhV6MDG5SKsG9qTgpaXVJTI0Sl7CGdYZwgVSfLJnZQeYoWePDSCQhht1UCH6XlBY76Dq3YWu0pIpnKps8L/aNoq7KzWJxeCX741AzS7GyPSZGFYvoVtNAJovNPCoQio/AQ0CNtoC34YNk2GMG52B/Ky0KYOIiooSCEIwXBC+NrAIJT9QJNgDs42/bLfSDRDJfp1+BOoM5DRVpxpNn0Bt0M46T8JwsPBnG7ykGgURDjqqHL0VVQ2WUR2OeCiq+GZwDZx+W8WBNH+c+GxiSCk2ftAyJiFvujGYlpCCER16TZfgfG0Zbml2iK5wA9G0tbNqyEkOBh9mOrrB9RAwc19qGka/O2qtZWUujpN7RANMqDhW5vDw1RUVUSEKy5AyErmsvij3gGQR1Bl5cRELDP79ERVFdmayFN4AzKQwRSPSN4HPN/52qoVUqlyCm8kPbsxyX2iSXkbX6+8Nz6LJpJdezLLRc8ZxGUNag7dtjF6eVM3rECj6vvyceiWo1bIa5Y2c/Y9Qch0RXqkFvv8bpO40a9pwl1lhOdrVHnmpLk2z7t8fM8sEVWvdDrTdJ8ZiiYtdDPvz9373mJoTvRj5iUUUm6Gp7r7wxtL4BxsgRLpgqtXSgKYjNkbfY1kJ1O8OUUf5iIngKYfmvyaxJYQEnfEXaXHeognr1tYPxD6+qFyVahmFO5CI86yyahC2RS3HRmFxKBS8AF4uvTGyBMxVfagtrho1CtVTf6nZR0+OGrN6UZzcpcqj+Hf8GGOEidOeUFK4kVFdhK1pg4OLT1zL7ZWovJ3M9nEymSrQ4r9k6MXwVLPN3/iR5gj+PQO4P7YjkyQ9sxeRWKxSMpXB0IDo7EUwc0A+vbIgUAxq2jftQaFgR8lW5X3J1tvGer4FYFLSfDOJUbby7KSqq+UuBoxbaJtSX0t/dx+Kq/NtiU3qopYHkikTdXv+4qNsC+0aghSpcTjU8htVbQKC3Fggs9DWj3Zd43OI8NSHBAq/cFu9ECAe3iupZ+EVoEvCCTTyG2xAbxWo2zqzxakttY2UoLaw0bn3pTl2tSxiqzPKA79g45NLlfz0nSguAJ4PFyT+zlxtVOt0tUrxIwq6IwqocVC2ldHovhKWLFrAz0lhxAbUeQMoxQveOVqpL7kRsKOhVM+MUYHrhpZRe9TDy1yIZs06N5I5Ia0oxjvZE/Ve6QAOSDX4RQhxKD3NUcV19541DLyXpk00WgqE+1UDD2IiYs/i//PONfBv3qMF3hxHOElMCktE5Tz4dXhZUHkcV7QxXGcPLRkP1zGv9SoUakyPd13JMr4HC5zi2Akba6pRCAytLmAqzmmQy/TlCpOEwinliLd2REEhWNr/Ao5mZpePunUpjxRizWh0PEW1RjXM/Bmwgl1TB5sqiJuGu7AZBCqa/iBhZaIoL+MP7xZq736H52kgE8SPMzyfoxwEFbnRUnTLS64Vjz6+O5pAe4l5XlkMPU/bKTR9YCQtNslxDisPy7TdrrrLGjJW6xbFJfVnXZibNX4qlMf6z7tRc9blb8KyAdO9+1Ty9d7jK9zD5L9NvGA49/EXXM0MTwPzmpuzoIz4ZZmKAvKbGnJTPtFcwuQDT4S5O9dUwKKoX31/OzPqb7Lv/Dz960uhkqgvfWC7C/LfVM/tw/LbL77MWUrF8JtblLGO+Pu49B+eP/gCs41ssxUaaoylZOwXffUTn+x1cwmlV/bzuwFtVC12Emv7Vd5laYy020AuM9e4R4x9zd78KsFl88Q4qpjqnHCq8TOGIvmPTAz9z8i2PJA9kC6IWMmcRmZFnDLva8zd2j4tdeSQRtTElSO3eyjCcqBTQM5jjEAikyNU40ffg+vP396E7wZLjfwenexe/Mixe9txdp1a/tEGTvgvdrEC5FaIknxBaKa8rRasCTuRFy5gqDcaQBLD3zpEtzTH+vKpU646heLx6GPLdLPhp5Nd75x52uLbK7iTx4rZ6ySwk4yqtLsfBQenSD8yY1RVe6c4xwchP/UYYkNJ7cIGrEEA9ZTYlER4QRLwdLy+ekhMIzYeOR9s/OTAIVjXYDh6aG8fLAo48sWNXBM3PaorCNtmvCIiKrGgKBqbSQd9l+J6NRINDR3gEIy+yz6mEgkJNEMGeRI1gjyFNpH6kQaAwGjYKdMysBUOkUAfaTBMJBHGR42UeWsgLcDRoLOXa/3lFj32w6tCxrSowlSpdSwdYJP/G5Auv/Tn6CHc2l8h6TSPUuSlWb5al7bcUT+yGGpM9oSsuKX94you8/j2IPwirV1sFmckzTOUup/riS/hD3Uecc3hBJo5pE1SzAeJLgtj5FYaIzDf+BGLyRqxpnnS3nZ96/n6IfW25EP5QcL+387052IhIXFT8+DLhrtSzANDlqfSUP0dfKpzzmiC3sQV4Cbc+CJLL3CrYUCKDI7yGGIcix7jHuIT0lzdRUP+qU4NQ5voaBQyTlkQFZY4PE76pI9X698DVZdu6yiSJg5uGt10H+TAlOOOyHiREuzcd6nF/Fyw1+OHLa+9fPJVNFomPnWs1Q1dumXNcyYKH6ZNb6czXEkddNjOxc8mlD4ppZSnAomcObvAcBeaylZFyM5Ko8xvpe2Gqx+a1MKFwlk3pmHIuXXzFyS6brB9YJNDnrZs4O/0gNiYoj5+eQEjLAkwG3UPpCakAaiQOEtE2nHyIAIz3PhAYUfdQT4+QGea3olWueqsxRWtLNKxdAzmHJmYik358Io2N+xFKWZjIxlOAeoEN5PVPW2j0QzgYjviJAJjWQRnxtIgf+8KyayhxMX+dNH95JQ15QecsSXDFiPqDQ2hvQey7fo7blTw9hW5y0P7j8Ml62clfi5wMwj0R4dP8QR+87FTg74CXEwLfLEGtco75cZzkd70pyM1TBAQ6gXEHYYNCTeFSM6MXgR7pIaELIvEUg4MJBxP9c7ZlyoH0PnDcK/HZIGJInzXBL9scvnfUXhZkYwUfnSE2JzDrSl0t5RTecvTsnCNy5LfYaoAoJtzNWVLWmKhwHfVCci2/xD1lxNYXrm3SlfIaJ6dhynZuxxKCr4qjASSaKcENfwuM0xghJtWbzPLguDY1iDlYMa0iU/5dMCmxLRmvGS2oeNoiFA8bTRZyt0QCBx9xoQlqMwWjD1dXEM1/4KqlJTgsxFlmiQd+9Gmi+cUUKbPvtzz2n233y9YF28CO5phFdCvCfmZ9a3nAjOqxg5NNliuQWY5BYi/FIalvu73w5qk4RK3ALrw3bHf4GiVqyIgqoCuheKqoZ06rVRrYHyE0gBiK8r9PZ+um2JuaAQqitCR3KLyvvw4eg8MwXLkRW8yfpa4Du7dznQ6qn06m92IPA2r9xVf6zeCrCzaW1iPW/5a7LMRMYT8cQ1ndQypbroWACUkgIFHAvo2QKgY4FQcm5z8Ed5HscKXcySDyhyFXDJ990NcCV0qJqd+pxSCnevg3JEm2YnCtmh0fZZv3FKoO41cKpDeVQCFUBb1yBSkV6JZR/JYhMxT0oQA11QCDfZAKKhwk0dBVA+JCy4EESnGIK5a4QDs3D7XwFd6YAFosioswJViMa3dEtKjYYQTx8h9vuY10QHkBRopLNq2LJegzj0x8LY4DztF0Ud7hrqlwuz2VB7G5QjJPzpEqpFo0pRdvRAEbpy2zabEgiBQKUhN/YwuBERg3hIharDX1VwwXcESl0YAiGsvhvtJt7EOnYb3splqEBCAlABVdRyJQTCnNwQGmQtt9YXRU8uxxkxNJBeD/FKGn028D2/1qBN4NyhsflwJe6uI4bWzobRj1C2KJkHGdZfT9ZBpkOLA6LfnPkaP8O4gS/yBmMGl3QaN8Mc2mk8jNAkB2/AgQPw/16WBtU1QNnRGCdVIFKB5FSnO44LKYiCs+sa0iFgHgVyikCcrkaHUHaRDfhsVaAW25mLKAXyHXnzDgn8nDnP0NTfTiQR33KWkHTiNyr6GQcA4D6AYlL9/SEzSFupzi5PfwFmgJltZiprQbtfgAqJxBQ/Z6RkP5co39kj6diZa2YWqZuf1enMTFeAGjNWg3JkZFT+8ge6mliNTgxl6aFMHO1+hTmQtDnaooBvVe2CAvP/GuOpseWVybqexp6mBdbCBGU9VNhBFpDOkgQ8PJIouAE+B6h2IosoGBOS0LjHr7FIMjeRRRB8pJBhkjsJ5slSAFsU9d562A9K8vVXqyehIE1glPBehhun3dN5vcIxDcXymfX1zDfRlWTFUHqM8gtUKkIa7eLgYzw6zEbhHp9mWfMxlj8nGw4FutycYER4YTZCCyJy8wHGOCJ0NmpCIm5xB6lOEcNdg4Nb2UtlTZZeX8NaZLem6vtFrWbv+av1+m3bVBHIa51fzw2f+3P4T7XAv/aUiey8Kvv/ec9n9XWHvLr/+YEXFDrEP0u22xH0SjKDfzDI/31hGw5p4NUM2X4DxHONt/xLdHrcryXb6wnLnWEIcPAriSLH8Kc9IMYcNKKe2H2FZT5RiyXZWii7pYHSGQjX+7kP6i1HrSUszLUj49Ag2YB5i/UxMm2BwkdfcgIfSe5GZ1itJNvlBelU8AAe8LUlCnfk8MJ1kVlZDnJzLfKvkjX7l1Wu/XuiJXp4RC5Y4b/T4/4nwroCUYUZPGBNLNuHYSKEQo87s8l/1KFz5/xYmvSv/4/YOY99+psGYKnym1U85SkCSL73Yvj8dk0MjZIdO5+6W7KfjGJLVm/JWmq0C6icL1oWfCHs9DcXOWMQxcEnXCZQegh85Lg5QvDWVMzpbfEHK4OjBu8Swj1oXKTNkjp8hSN6GQ1TbA3fySU6pF94DFQL5WLu9AgCg5zSPEHZzoegS5ZkT6nzJFwPPzu2CVuD9tWe00z5QGHNDraBcMR4whdbUakaMudJWgLj22aaWO86W32VGrf5dmiuqL1ypoWMe1pqM+8xTwhQQngMOAbFQ9/wn04X+b2yRUNwXOSRVFxyndeOvxLCNGvGNroaRda6TKthmActaBz3Q8mRH+3GLV3kvN+UrlymDMOVE4ydV3FMTwbTQ65CPxRCw2CPtses2XvBeXwt6EVwDr5sBd7GaM9COuvz6d/MIx561LpxLeVhrFnjL1SjAtsumP2QmhS9ZTXrdE1fSEYtn689f1cy2+GB4v9eFmoHwtTwvfogyuez3nZq4txrCDpkb9TAILumd0j77fZVybzMYnqZm9A0CDNq1x5wmEztzEyHZIc0XybaBfZ64bLDV7RU7YyQkt+/P1nI23OVK68b+K7L+FQVnpbhskZqxqdibb0HW59nXPbbP5lEGqYG++3CDTv9+X9efnd+/ULbnEXx/i1PSATvnOfbJA7Jlq8vD8JxkRefVY/4D5f78yD7Z3ruvWlUb27nlk/Oz1/p5GhH0s9J5exPZHcm5mVbTtx9UfZ5RQncJ/sHDyJ9Xm6nLSZ313gbtwQPKl1j+8Z2nsznLK1Be9+++S/nTTtXOPlyuySJwl26Uc+0c4UKenM1K0Xx4Yk/rAfxMKc3l9ktws2nm9s1RYyi/QEy0O0r6/2WLlZg+0TyibmeixWokQvy6meT85vnUsW0z+Xk9coV1cygExdTzhpnoqQUTe13uUhpd+ViJT2aC0p7OZuc/14uVdF3uZzSESJX1MSI8QKKaRjlVcoxQkC7r+OejHAjHNaHh/6BTjsYD6bje/7BcaID+7Jl68VrvkXGUSNhunVVCM2+GaXff+PODrtO9sMoLZpw6UMYPrxoVUiNcWmkT9b6GSEQIGtvrjj7xMUMwZrHD9ZLf/w/IEd1wLjiJnc/8R9oNKFvfa+Nllozst9yZt2klfBat5zKOi8b+4k/Ev1RcWCQqOvbYm8V3a+FjODSIoE/+KCVP1ohl1/mL/ZXqdy572a74Te/ciCVphum9WXpqbbjej6NzmCyfs/799fImGvCMzXjC4QiscTcwtLK2sbWzt7B0clZKpO7uLq5e3h6eS/z8VUAIPT9xVEUwwnyHRQO83qLxwufQnJl5XvGPN34WlBhf2/WH5rnB2EUJ2mWF2VVN23XD+M0L+u2H+d1P+/3gxCMoBhOkBTNsBwviJKsqP4Jys+h6QajyWyx2uwOp8vt8fr8IZPyi1fgluB8RH413VamhniyTpXPxAtZ4DyKLgXYbSY/exaR2IO8OAA5BZ6OFIwvWqqRtTQuABWWgLtJ2S3ena+4RxRGhni/Jeg80hkPPBAfNAtJ0yrdi3gJOLsjn2MZde7kKdvEGmB30aOFLm8BJg5AmUNqtNcsCrsl3bzCl+3qHc+bqSrl/Ui2SHglgx43XpUuRJbMF9quLQfNPVANUpTp2bu7eGxmL35DZ5DNmUBej3oPUmC3eIpYsuA8SIaRX+S4p5++38HyLHCkKIB8r0FeC3eUESzo+mAJDdZ2JRbljKZ7BEX0ktTS+QS3mAYl4zV7D4sRjbcAldWSJOq6DmyEJ+1CloUY3HTxtG2cAm1I0XZINWHmhJ3jkEeU3hFpIlwWFzerSrlWk+30GrwTRGuQEuWG2GV2H1083QMakQHAHeVL42HP1zQy854adCDgR/m0mZsar0SyATeNOi0nL/yAhdZkrj12w/UwZ6y0WsI7tcr7fP3Xl8WAJLqpw3qMlCTc1kiT50m4lYwQm5jPCY7cawkCsaOQHUifW09e21EJreYNVkHEb2mAXelueFdxHjoZUbq+aMSqiNQw74O7SGxBaKKBiLwstQdsdN0LYyz6ZpU05ATOYSzGC5DspR1Qg9YivX4kjkHYDfb6mGHwBTOx2169oswiqXXRVA+goroCU8F2NfDdhcmTUwdlmNtxZ0Q2oDG02EZuPHoYO6ctZtsR1gTSi8s4QYl+/4EF6iozgGRq8qwvag1A95zorMAzsVeasMielMwS8HKiy503ebqQZoPyQN7a4U5fv0xrhTl5UFR29ZbvjxV2Flqqqe0UGBwzbjUrTp56kDQjdU2Z8bB4kHMnWj5cvBosLNzVLJDqinmLsuN6fYZj5+aINBOb1Fz6rnxXDcuZaRivpZtTt//kmRNdGa+VOscmHsA4yrEYyflQ1BKC9Pdev6ss8JbdQIx1WVS2wu6uRfHMAMPkMXnzM0yHP1nGA3bpnweibeRfYjvp2AjwjAeQWjeL3pAaD+yK7UzqgLy5mBFHV3cxPNOIvI0gkj8oinb0IPF6CFQnTtilk8fF01nohl2FtwI9M6diKejKgiVgr7DpNdp6Y6EnnVCYs0YtBy2C6EAgZw+yOuLP9yA7Jiyx0H1vqCNz0ahBZk3W+FkIto5aAN0BPCtwZTft1Tb17l69NyqdDosrdw/K2WCbzbDoxh5Zr6qUcZYe+Nsevg0djpN2t8shF16PQLuOdFYsXFvwpuayAjoaIKYaJ21702uZ8R5JDZAFPq+VN74+V9V28sgNchjmWV9WZ5e+Vd9EyGv18DIBAAA=') format('woff2'),
url('iconfont.woff?t=1594367530928') format('woff'),
url('iconfont.ttf?t=1594367530928') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1594367530928#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-zhuanjia:before {
content: "\e72f";
}
.icon-ren4:before {
content: "\e6c5";
}
.icon-ren1:before {
content: "\e67b";
}
.icon-ren111:before {
content: "\e67d";
}
.icon-ren2:before {
content: "\e685";
}
.icon-xinzidan:before {
content: "\e67a";
}
.icon-youxiang:before {
content: "\e679";
}
.icon-shangyinhao:before {
content: "\e678";
}
.icon-kaiguanswitch-jibenzhuangtai-dianliangzhuangtai:before {
content: "\e674";
}
.icon-kaiguanswitch-jibenzhuangtai-dianliangzhuangtai-copy:before {
content: "\e676";
}
.icon-jingxuanchanpinku:before {
content: "\e671";
}
.icon-tuandui:before {
content: "\e672";
}
.icon-tuanduiguanlisvg:before {
content: "\e673";
}
.icon-xianshi:before {
content: "\e66f";
}
.icon-yincang:before {
content: "\e66e";
}
.icon-medal:before {
content: "\e6bf";
}
.icon-jiangpai:before {
content: "\e796";
}
.icon-geifumu:before {
content: "\e66c";
}
.icon-yongjin:before {
content: "\e6e4";
}
.icon-paihangbang:before {
content: "\e66d";
}
.icon-xiansuo1:before {
content: "\e66b";
}
.icon-yidonghulianwang2:before {
content: "\e700";
}
.icon-zidian:before {
content: "\e669";
}
.icon-zidian1:before {
content: "\e66a";
}
.icon-ziliaoku:before {
content: "\e667";
}
.icon-ziliaoku1:before {
content: "\e668";
}
.icon-haibao-1:before {
content: "\e665";
}
.icon-haibao:before {
content: "\e666";
}
.icon-zhensuozhongxin:before {
content: "\e663";
}
.icon-xiaozhensuo:before {
content: "\e64c";
}
.icon-yidonghulianwang:before {
content: "\e6c6";
}
.icon-zhiyezhenghao:before {
content: "\e73a";
}
.icon-xiansuo:before {
content: "\e64e";
}
.icon-zhiye:before {
content: "\e64f";
}
.icon-AI:before {
content: "\e677";
}
.icon-baodanyangben:before {
content: "\e650";
}
.icon-fenxiangwenzhang:before {
content: "\e651";
}
.icon-zhaoziliao:before {
content: "\e652";
}
.icon-haibaozujian:before {
content: "\e661";
}
.icon-jiahao:before {
content: "\e64b";
}
.icon-shangji:before {
content: "\e65d";
}
.icon-save:before {
content: "\e65e";
}
.icon-tuichu:before {
content: "\e64a";
}
.icon-wenjian:before {
content: "\e646";
}
.icon-xiazai1:before {
content: "\e647";
}
.icon-jiaoyu:before {
content: "\e648";
}
.icon-btnconsult:before {
content: "\e6ae";
}
.icon-zaixian:before {
content: "\e643";
}
.icon-zhiwen:before {
content: "\e644";
}
.icon-ai:before {
content: "\e6aa";
}
.icon-zhiyeleibie:before {
content: "\e6e3";
}
.icon-gonggao:before {
content: "\e645";
}
.icon-yiliaoweisheng-:before {
content: "\ed53";
}
.icon-qian1:before {
content: "\e659";
}
.icon-huangguan1:before {
content: "\e6a2";
}
.icon-toubaoshenqing:before {
content: "\e660";
}
.icon-dingzhi:before {
content: "\e641";
}
.icon-airengongzhineng:before {
content: "\e642";
}
.icon-mn_shangchuantupian:before {
content: "\e640";
}
.icon-zhifupingtai-yinlian:before {
content: "\e63e";
}
.icon-yusuan:before {
content: "\e63d";
}
.icon-haizi:before {
content: "\e63f";
}
.icon-ic_help_px:before {
content: "\e65a";
}
.icon-jianjie:before {
content: "\e73c";
}
.icon-banliETC-peiou:before {
content: "\e63a";
}
.icon-haizimingzi:before {
content: "\e63c";
}
.icon-zhuyishixiang:before {
content: "\e636";
}
.icon-baozhangx:before {
content: "\e635";
}
.icon-qian:before {
content: "\e65c";
}
.icon-jiatingqingkuang:before {
content: "\e858";
}
.icon-shujujiedu:before {
content: "\e656";
}
.icon-fengxian:before {
content: "\e7dd";
}
.icon-fangan:before {
content: "\e6b5";
}
.icon-iconfontexplore:before {
content: "\e633";
}
.icon-shouye2:before {
content: "\e681";
}
.icon-faxian:before {
content: "\e634";
}
.icon-shouye:before {
content: "\e65f";
}
.icon-yindaojiantou:before {
content: "\e72e";
}
.icon-zaixiankefu:before {
content: "\e6f6";
}
.icon-money-more:before {
content: "\e631";
}
.icon-tixian:before {
content: "\e632";
}
.icon-ar-r:before {
content: "\e62d";
}
.icon-icon3:before {
content: "\e62a";
}
.icon-zhichujizhang:before {
content: "\e76e";
}
.icon-ertongpiao:before {
content: "\e62f";
}
.icon-wujiaoxing:before {
content: "\e629";
}
.icon-wujiaoxing-1:before {
content: "\e627";
}
.icon-yuangou:before {
content: "\e626";
}
.icon-yiliao:before {
content: "\e6bd";
}
.icon-zhuanfaxian:before {
content: "\e777";
}
.icon-jiaotongshigu:before {
content: "\e67c";
}
.icon-shangyexian:before {
content: "\e695";
}
.icon-rencaishenbao-:before {
content: "\e623";
}
.icon-cheliang:before {
content: "\e675";
}
.icon-kefu:before {
content: "\e621";
}
.icon-liebiaomoshi:before {
content: "\e6a8";
}
.icon-tuijian:before {
content: "\e624";
}
.icon-dailishangshenqing:before {
content: "\e62c";
}
.icon-butai:before {
content: "\e618";
}
.icon-gouxuanxinhuise-:before {
content: "\e620";
}
.icon-gouxuan:before {
content: "\e6c1";
}
.icon-dianzan:before {
content: "\e60a";
}
.icon-zuanshi:before {
content: "\e611";
}
.icon-shuji:before {
content: "\e77f";
}
.icon-tianping:before {
content: "\e664";
}
.icon-53:before {
content: "\e68b";
}
.icon-bianji:before {
content: "\e60f";
}
.icon-tubiao27:before {
content: "\e662";
}
.icon-zhongdajibing:before {
content: "\e62b";
}
.icon-guanaifumu:before {
content: "\e613";
}
.icon-xueshimao:before {
content: "\e6c0";
}
.icon-guanbi:before {
content: "\e79a";
}
.icon-chazhao:before {
content: "\e61c";
}
.icon-gou1:before {
content: "\e614";
}
.icon-zhuce-dagoudaikuang:before {
content: "\e622";
}
.icon-kaiguan_:before {
content: "\e60b";
}
.icon-kaiguankai:before {
content: "\e60e";
}
.icon-weixinzhifu:before {
content: "\e609";
}
.icon-818282:before {
content: "\e649";
}
.icon-shanchu1:before {
content: "\e610";
}
.icon-xiangxia:before {
content: "\e727";
}
.icon-gou:before {
content: "\e628";
}
.icon-huangguan:before {
content: "\e607";
}
.icon-xiazai:before {
content: "\e7bb";
}
.icon-arrow-right-bottom:before {
content: "\e606";
}
.icon-582danxianqixing:before {
content: "\e9be";
}
.icon-yundong:before {
content: "\e605";
}
.icon-dengshanhuodong:before {
content: "\e670";
}
.icon-MaskSnorkel:before {
content: "\e615";
}
.icon-Skiing:before {
content: "\e61d";
}
.icon-Windsurfing:before {
content: "\e61f";
}
.icon-paobu:before {
content: "\e68d";
}
.icon-zuqiuchang-:before {
content: "\e61e";
}
.icon-xiugaiziliao:before {
content: "\e612";
}
.icon-shanchu:before {
content: "\e62e";
}
.icon-lianxiren:before {
content: "\e60d";
}
.icon-yaoqingyouli:before {
content: "\e608";
}
.icon-yaoqingmatianchong:before {
content: "\e639";
}
.icon-shezhi:before {
content: "\e63b";
}
.icon-jia:before {
content: "\e690";
}
.icon-jian:before {
content: "\e692";
}
.icon-zhongguoditu:before {
content: "\e6f4";
}
.icon-dadianhua:before {
content: "\e61b";
}
.icon-muyingqinzi:before {
content: "\e600";
}
.icon-leixingmorentu-toupiao:before {
content: "\e755";
}
.icon-ren:before {
content: "\e658";
}
.icon-weichengnianrentedingzhongdajibingguanaibaoxianjin:before {
content: "\e64d";
}
.icon-tianshudangqianxuanzhong:before {
content: "\e654";
}
.icon-mudedi:before {
content: "\e6c8";
}
.icon-09caifuzhongxin:before {
content: "\e68a";
}
.icon-caifuzhongxin:before {
content: "\e619";
}
.icon-pdf:before {
content: "\e6ca";
}
.icon-phonemenu02:before {
content: "\e637";
}
.icon-nanren:before {
content: "\e617";
}
.icon-iconfontnvtouxiang:before {
content: "\e638";
}
.icon-lvhang:before {
content: "\e603";
}
.icon-huwai:before {
content: "\e61a";
}
.icon-liuxue-shixin:before {
content: "\e604";
}
.icon-icon-alipay:before {
content: "\e625";
}
.icon-weixin:before {
content: "\e602";
}
.icon-yonghu1:before {
content: "\e6d8";
}
.icon-dianhua:before {
content: "\e653";
}
.icon-caidan:before {
content: "\e65b";
}
.icon-icon:before {
content: "\e60c";
}
.icon-tubiao02:before {
content: "\e601";
}
.icon-shenfenzheng:before {
content: "\e655";
}
.icon-yinhang:before {
content: "\e616";
}
.icon-yonghu:before {
content: "\e630";
}
.icon-yanzhengma3:before {
content: "\e657";
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"id": "356495",
"name": "no name",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "9622768",
"name": "专家",
"font_class": "zhuanjia",
"unicode": "e72f",
"unicode_decimal": 59183
},
{
"icon_id": "4303877",
"name": "人",
"font_class": "ren4",
"unicode": "e6c5",
"unicode_decimal": 59077
},
{
"icon_id": "649696",
"name": "人",
"font_class": "ren1",
"unicode": "e67b",
"unicode_decimal": 59003
},
{
"icon_id": "1120975",
"name": "人",
"font_class": "ren111",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "6539430",
"name": "人",
"font_class": "ren2",
"unicode": "e685",
"unicode_decimal": 59013
},
{
"icon_id": "4908034",
"name": "薪资单",
"font_class": "xinzidan",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "9592761",
"name": "邮箱",
"font_class": "youxiang",
"unicode": "e679",
"unicode_decimal": 59001
},
{
"icon_id": "816614",
"name": "上引号",
"font_class": "shangyinhao",
"unicode": "e678",
"unicode_decimal": 59000
},
{
"icon_id": "8897231",
"name": "开关 switch-基本状态-关闭状态",
"font_class": "kaiguanswitch-jibenzhuangtai-dianliangzhuangtai",
"unicode": "e674",
"unicode_decimal": 58996
},
{
"icon_id": "12636275",
"name": "开关 switch-基本状态-点亮状态",
"font_class": "kaiguanswitch-jibenzhuangtai-dianliangzhuangtai-copy",
"unicode": "e676",
"unicode_decimal": 58998
},
{
"icon_id": "4989831",
"name": "精选产品库",
"font_class": "jingxuanchanpinku",
"unicode": "e671",
"unicode_decimal": 58993
},
{
"icon_id": "8533810",
"name": "团队",
"font_class": "tuandui",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "13513743",
"name": "团队管理",
"font_class": "tuanduiguanlisvg",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "5485672",
"name": "显示",
"font_class": "xianshi",
"unicode": "e66f",
"unicode_decimal": 58991
},
{
"icon_id": "1112302",
"name": "隐藏",
"font_class": "yincang",
"unicode": "e66e",
"unicode_decimal": 58990
},
{
"icon_id": "5801171",
"name": "奖牌",
"font_class": "medal",
"unicode": "e6bf",
"unicode_decimal": 59071
},
{
"icon_id": "11640918",
"name": "奖牌",
"font_class": "jiangpai",
"unicode": "e796",
"unicode_decimal": 59286
},
{
"icon_id": "1793415",
"name": "给父母",
"font_class": "geifumu",
"unicode": "e66c",
"unicode_decimal": 58988
},
{
"icon_id": "9874550",
"name": "KHCFDC_佣金",
"font_class": "yongjin",
"unicode": "e6e4",
"unicode_decimal": 59108
},
{
"icon_id": "13547746",
"name": "排行榜",
"font_class": "paihangbang",
"unicode": "e66d",
"unicode_decimal": 58989
},
{
"icon_id": "12239969",
"name": "线索",
"font_class": "xiansuo1",
"unicode": "e66b",
"unicode_decimal": 58987
},
{
"icon_id": "7927930",
"name": "移动互联网",
"font_class": "yidonghulianwang2",
"unicode": "e700",
"unicode_decimal": 59136
},
{
"icon_id": "3584630",
"name": "字典",
"font_class": "zidian",
"unicode": "e669",
"unicode_decimal": 58985
},
{
"icon_id": "12084324",
"name": "字典",
"font_class": "zidian1",
"unicode": "e66a",
"unicode_decimal": 58986
},
{
"icon_id": "10795268",
"name": "资料库",
"font_class": "ziliaoku",
"unicode": "e667",
"unicode_decimal": 58983
},
{
"icon_id": "10796984",
"name": "资料库",
"font_class": "ziliaoku1",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "9345059",
"name": "海报",
"font_class": "haibao-1",
"unicode": "e665",
"unicode_decimal": 58981
},
{
"icon_id": "12513277",
"name": "海报",
"font_class": "haibao",
"unicode": "e666",
"unicode_decimal": 58982
},
{
"icon_id": "11864398",
"name": "诊所中心",
"font_class": "zhensuozhongxin",
"unicode": "e663",
"unicode_decimal": 58979
},
{
"icon_id": "508266",
"name": "小诊所",
"font_class": "xiaozhensuo",
"unicode": "e64c",
"unicode_decimal": 58956
},
{
"icon_id": "1288111",
"name": "移动互联网",
"font_class": "yidonghulianwang",
"unicode": "e6c6",
"unicode_decimal": 59078
},
{
"icon_id": "3563994",
"name": "执业证号",
"font_class": "zhiyezhenghao",
"unicode": "e73a",
"unicode_decimal": 59194
},
{
"icon_id": "4293900",
"name": "线索",
"font_class": "xiansuo",
"unicode": "e64e",
"unicode_decimal": 58958
},
{
"icon_id": "6134151",
"name": "职业",
"font_class": "zhiye",
"unicode": "e64f",
"unicode_decimal": 58959
},
{
"icon_id": "9855968",
"name": "AI",
"font_class": "AI",
"unicode": "e677",
"unicode_decimal": 58999
},
{
"icon_id": "11170142",
"name": "保单样本",
"font_class": "baodanyangben",
"unicode": "e650",
"unicode_decimal": 58960
},
{
"icon_id": "11772167",
"name": "分享文章",
"font_class": "fenxiangwenzhang",
"unicode": "e651",
"unicode_decimal": 58961
},
{
"icon_id": "11776596",
"name": "找资料",
"font_class": "zhaoziliao",
"unicode": "e652",
"unicode_decimal": 58962
},
{
"icon_id": "13547739",
"name": "海报组件",
"font_class": "haibaozujian",
"unicode": "e661",
"unicode_decimal": 58977
},
{
"icon_id": "6691793",
"name": "加号",
"font_class": "jiahao",
"unicode": "e64b",
"unicode_decimal": 58955
},
{
"icon_id": "2560648",
"name": "商机",
"font_class": "shangji",
"unicode": "e65d",
"unicode_decimal": 58973
},
{
"icon_id": "5086601",
"name": "保存",
"font_class": "save",
"unicode": "e65e",
"unicode_decimal": 58974
},
{
"icon_id": "4706230",
"name": "退出 (1)",
"font_class": "tuichu",
"unicode": "e64a",
"unicode_decimal": 58954
},
{
"icon_id": "1178820",
"name": "文件",
"font_class": "wenjian",
"unicode": "e646",
"unicode_decimal": 58950
},
{
"icon_id": "5268142",
"name": "下载",
"font_class": "xiazai1",
"unicode": "e647",
"unicode_decimal": 58951
},
{
"icon_id": "7516558",
"name": "教育",
"font_class": "jiaoyu",
"unicode": "e648",
"unicode_decimal": 58952
},
{
"icon_id": "835381",
"name": "咨询",
"font_class": "btnconsult",
"unicode": "e6ae",
"unicode_decimal": 59054
},
{
"icon_id": "3039718",
"name": "在线",
"font_class": "zaixian",
"unicode": "e643",
"unicode_decimal": 58947
},
{
"icon_id": "4584207",
"name": "分销 - 指纹",
"font_class": "zhiwen",
"unicode": "e644",
"unicode_decimal": 58948
},
{
"icon_id": "7534910",
"name": "ai",
"font_class": "ai",
"unicode": "e6aa",
"unicode_decimal": 59050
},
{
"icon_id": "7940516",
"name": "职业类别",
"font_class": "zhiyeleibie",
"unicode": "e6e3",
"unicode_decimal": 59107
},
{
"icon_id": "11209327",
"name": "公告",
"font_class": "gonggao",
"unicode": "e645",
"unicode_decimal": 58949
},
{
"icon_id": "5738506",
"name": "医疗卫生-14",
"font_class": "yiliaoweisheng-",
"unicode": "ed53",
"unicode_decimal": 60755
},
{
"icon_id": "845798",
"name": "券",
"font_class": "qian1",
"unicode": "e659",
"unicode_decimal": 58969
},
{
"icon_id": "5240462",
"name": "皇冠 (1)",
"font_class": "huangguan1",
"unicode": "e6a2",
"unicode_decimal": 59042
},
{
"icon_id": "303353",
"name": "投保申请",
"font_class": "toubaoshenqing",
"unicode": "e660",
"unicode_decimal": 58976
},
{
"icon_id": "7663876",
"name": "定制",
"font_class": "dingzhi",
"unicode": "e641",
"unicode_decimal": 58945
},
{
"icon_id": "8449193",
"name": "ai人工智能",
"font_class": "airengongzhineng",
"unicode": "e642",
"unicode_decimal": 58946
},
{
"icon_id": "4182385",
"name": "AK-MN上传图片",
"font_class": "mn_shangchuantupian",
"unicode": "e640",
"unicode_decimal": 58944
},
{
"icon_id": "6360092",
"name": "支付平台-银联",
"font_class": "zhifupingtai-yinlian",
"unicode": "e63e",
"unicode_decimal": 58942
},
{
"icon_id": "8325406",
"name": "预算",
"font_class": "yusuan",
"unicode": "e63d",
"unicode_decimal": 58941
},
{
"icon_id": "383487",
"name": "孩子",
"font_class": "haizi",
"unicode": "e63f",
"unicode_decimal": 58943
},
{
"icon_id": "2206897",
"name": "material,疑惑,问号",
"font_class": "ic_help_px",
"unicode": "e65a",
"unicode_decimal": 58970
},
{
"icon_id": "6053399",
"name": "简介",
"font_class": "jianjie",
"unicode": "e73c",
"unicode_decimal": 59196
},
{
"icon_id": "7160279",
"name": "办理ETC-配偶",
"font_class": "banliETC-peiou",
"unicode": "e63a",
"unicode_decimal": 58938
},
{
"icon_id": "7770091",
"name": "孩子名字",
"font_class": "haizimingzi",
"unicode": "e63c",
"unicode_decimal": 58940
},
{
"icon_id": "948453",
"name": "注意事项",
"font_class": "zhuyishixiang",
"unicode": "e636",
"unicode_decimal": 58934
},
{
"icon_id": "3563843",
"name": "保障 @1x",
"font_class": "baozhangx",
"unicode": "e635",
"unicode_decimal": 58933
},
{
"icon_id": "4955499",
"name": "钱",
"font_class": "qian",
"unicode": "e65c",
"unicode_decimal": 58972
},
{
"icon_id": "6050789",
"name": "家庭情况",
"font_class": "jiatingqingkuang",
"unicode": "e858",
"unicode_decimal": 59480
},
{
"icon_id": "6920980",
"name": "数据解读",
"font_class": "shujujiedu",
"unicode": "e656",
"unicode_decimal": 58966
},
{
"icon_id": "6924584",
"name": "风险",
"font_class": "fengxian",
"unicode": "e7dd",
"unicode_decimal": 59357
},
{
"icon_id": "8210458",
"name": "方案",
"font_class": "fangan",
"unicode": "e6b5",
"unicode_decimal": 59061
},
{
"icon_id": "70242",
"name": "发现",
"font_class": "iconfontexplore",
"unicode": "e633",
"unicode_decimal": 58931
},
{
"icon_id": "915709",
"name": "首页 (2)",
"font_class": "shouye2",
"unicode": "e681",
"unicode_decimal": 59009
},
{
"icon_id": "4404407",
"name": "发现",
"font_class": "faxian",
"unicode": "e634",
"unicode_decimal": 58932
},
{
"icon_id": "4954951",
"name": "首页",
"font_class": "shouye",
"unicode": "e65f",
"unicode_decimal": 58975
},
{
"icon_id": "5393413",
"name": "引导箭头",
"font_class": "yindaojiantou",
"unicode": "e72e",
"unicode_decimal": 59182
},
{
"icon_id": "1764102",
"name": "在线客服",
"font_class": "zaixiankefu",
"unicode": "e6f6",
"unicode_decimal": 59126
},
{
"icon_id": "1588569",
"name": "钱",
"font_class": "money-more",
"unicode": "e631",
"unicode_decimal": 58929
},
{
"icon_id": "2306471",
"name": "提现",
"font_class": "tixian",
"unicode": "e632",
"unicode_decimal": 58930
},
{
"icon_id": "3610899",
"name": "箭头",
"font_class": "ar-r",
"unicode": "e62d",
"unicode_decimal": 58925
},
{
"icon_id": "4977255",
"name": "收益金额高",
"font_class": "icon3",
"unicode": "e62a",
"unicode_decimal": 58922
},
{
"icon_id": "6009709",
"name": "支出记账",
"font_class": "zhichujizhang",
"unicode": "e76e",
"unicode_decimal": 59246
},
{
"icon_id": "95923",
"name": "儿童票",
"font_class": "ertongpiao",
"unicode": "e62f",
"unicode_decimal": 58927
},
{
"icon_id": "922128",
"name": "五角星",
"font_class": "wujiaoxing",
"unicode": "e629",
"unicode_decimal": 58921
},
{
"icon_id": "4051277",
"name": "五角星",
"font_class": "wujiaoxing-1",
"unicode": "e627",
"unicode_decimal": 58919
},
{
"icon_id": "1675302",
"name": "圆钩",
"font_class": "yuangou",
"unicode": "e626",
"unicode_decimal": 58918
},
{
"icon_id": "5041721",
"name": "医疗4",
"font_class": "yiliao",
"unicode": "e6bd",
"unicode_decimal": 59069
},
{
"icon_id": "3221054",
"name": "转发14 线",
"font_class": "zhuanfaxian",
"unicode": "e777",
"unicode_decimal": 59255
},
{
"icon_id": "904011",
"name": "交通事故",
"font_class": "jiaotongshigu",
"unicode": "e67c",
"unicode_decimal": 59004
},
{
"icon_id": "1383520",
"name": "商业险",
"font_class": "shangyexian",
"unicode": "e695",
"unicode_decimal": 59029
},
{
"icon_id": "3791139",
"name": "人才申报-01",
"font_class": "rencaishenbao-",
"unicode": "e623",
"unicode_decimal": 58915
},
{
"icon_id": "4873542",
"name": "车辆",
"font_class": "cheliang",
"unicode": "e675",
"unicode_decimal": 58997
},
{
"icon_id": "1480833",
"name": "客服",
"font_class": "kefu",
"unicode": "e621",
"unicode_decimal": 58913
},
{
"icon_id": "789864",
"name": "列表模式",
"font_class": "liebiaomoshi",
"unicode": "e6a8",
"unicode_decimal": 59048
},
{
"icon_id": "3183131",
"name": "推荐 (1)",
"font_class": "tuijian",
"unicode": "e624",
"unicode_decimal": 58916
},
{
"icon_id": "6054445",
"name": "代理商申请",
"font_class": "dailishangshenqing",
"unicode": "e62c",
"unicode_decimal": 58924
},
{
"icon_id": "2255525",
"name": "补胎",
"font_class": "butai",
"unicode": "e618",
"unicode_decimal": 58904
},
{
"icon_id": "3279605",
"name": "勾选—新—灰色-04",
"font_class": "gouxuanxinhuise-",
"unicode": "e620",
"unicode_decimal": 58912
},
{
"icon_id": "5909837",
"name": "勾选",
"font_class": "gouxuan",
"unicode": "e6c1",
"unicode_decimal": 59073
},
{
"icon_id": "811080",
"name": "点赞",
"font_class": "dianzan",
"unicode": "e60a",
"unicode_decimal": 58890
},
{
"icon_id": "3722144",
"name": "钻石",
"font_class": "zuanshi",
"unicode": "e611",
"unicode_decimal": 58897
},
{
"icon_id": "5330402",
"name": "书籍",
"font_class": "shuji",
"unicode": "e77f",
"unicode_decimal": 59263
},
{
"icon_id": "5345169",
"name": "天平",
"font_class": "tianping",
"unicode": "e664",
"unicode_decimal": 58980
},
{
"icon_id": "1391976",
"name": "父母",
"font_class": "53",
"unicode": "e68b",
"unicode_decimal": 59019
},
{
"icon_id": "1581130",
"name": "编辑",
"font_class": "bianji",
"unicode": "e60f",
"unicode_decimal": 58895
},
{
"icon_id": "985402",
"name": "医疗",
"font_class": "tubiao27",
"unicode": "e662",
"unicode_decimal": 58978
},
{
"icon_id": "2279720",
"name": "重大疾病2",
"font_class": "zhongdajibing",
"unicode": "e62b",
"unicode_decimal": 58923
},
{
"icon_id": "5492943",
"name": "关爱父母",
"font_class": "guanaifumu",
"unicode": "e613",
"unicode_decimal": 58899
},
{
"icon_id": "2130690",
"name": "学士帽",
"font_class": "xueshimao",
"unicode": "e6c0",
"unicode_decimal": 59072
},
{
"icon_id": "815743",
"name": "关闭",
"font_class": "guanbi",
"unicode": "e79a",
"unicode_decimal": 59290
},
{
"icon_id": "2377317",
"name": "查找",
"font_class": "chazhao",
"unicode": "e61c",
"unicode_decimal": 58908
},
{
"icon_id": "139963",
"name": "钩",
"font_class": "gou1",
"unicode": "e614",
"unicode_decimal": 58900
},
{
"icon_id": "4194875",
"name": "注册-打钩带框",
"font_class": "zhuce-dagoudaikuang",
"unicode": "e622",
"unicode_decimal": 58914
},
{
"icon_id": "3996538",
"name": "开关_2",
"font_class": "kaiguan_",
"unicode": "e60b",
"unicode_decimal": 58891
},
{
"icon_id": "4338483",
"name": "开关 开",
"font_class": "kaiguankai",
"unicode": "e60e",
"unicode_decimal": 58894
},
{
"icon_id": "1683199",
"name": "微信支付",
"font_class": "weixinzhifu",
"unicode": "e609",
"unicode_decimal": 58889
},
{
"icon_id": "69245",
"name": "礼物",
"font_class": "818282",
"unicode": "e649",
"unicode_decimal": 58953
},
{
"icon_id": "3599685",
"name": "删 除",
"font_class": "shanchu1",
"unicode": "e610",
"unicode_decimal": 58896
},
{
"icon_id": "1191734",
"name": "向下",
"font_class": "xiangxia",
"unicode": "e727",
"unicode_decimal": 59175
},
{
"icon_id": "2634249",
"name": "钩",
"font_class": "gou",
"unicode": "e628",
"unicode_decimal": 58920
},
{
"icon_id": "3554788",
"name": "皇冠",
"font_class": "huangguan",
"unicode": "e607",
"unicode_decimal": 58887
},
{
"icon_id": "1719373",
"name": "下载",
"font_class": "xiazai",
"unicode": "e7bb",
"unicode_decimal": 59323
},
{
"icon_id": "3174825",
"name": "左箭头",
"font_class": "arrow-right-bottom",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "184994",
"name": "582-单线,骑行",
"font_class": "582danxianqixing",
"unicode": "e9be",
"unicode_decimal": 59838
},
{
"icon_id": "1616962",
"name": "运动",
"font_class": "yundong",
"unicode": "e605",
"unicode_decimal": 58885
},
{
"icon_id": "2068716",
"name": "登山活动",
"font_class": "dengshanhuodong",
"unicode": "e670",
"unicode_decimal": 58992
},
{
"icon_id": "2480412",
"name": "潜水",
"font_class": "MaskSnorkel",
"unicode": "e615",
"unicode_decimal": 58901
},
{
"icon_id": "2480474",
"name": "滑雪",
"font_class": "Skiing",
"unicode": "e61d",
"unicode_decimal": 58909
},
{
"icon_id": "2480497",
"name": "帆船",
"font_class": "Windsurfing",
"unicode": "e61f",
"unicode_decimal": 58911
},
{
"icon_id": "3258176",
"name": "跑步",
"font_class": "paobu",
"unicode": "e68d",
"unicode_decimal": 59021
},
{
"icon_id": "3849798",
"name": "足球场-01",
"font_class": "zuqiuchang-",
"unicode": "e61e",
"unicode_decimal": 58910
},
{
"icon_id": "1440394",
"name": "修改资料",
"font_class": "xiugaiziliao",
"unicode": "e612",
"unicode_decimal": 58898
},
{
"icon_id": "3317632",
"name": "删除",
"font_class": "shanchu",
"unicode": "e62e",
"unicode_decimal": 58926
},
{
"icon_id": "533767",
"name": "联系人",
"font_class": "lianxiren",
"unicode": "e60d",
"unicode_decimal": 58893
},
{
"icon_id": "1035516",
"name": "邀请有礼",
"font_class": "yaoqingyouli",
"unicode": "e608",
"unicode_decimal": 58888
},
{
"icon_id": "1435249",
"name": "邀请码填充",
"font_class": "yaoqingmatianchong",
"unicode": "e639",
"unicode_decimal": 58937
},
{
"icon_id": "2545178",
"name": "首页-设置",
"font_class": "shezhi",
"unicode": "e63b",
"unicode_decimal": 58939
},
{
"icon_id": "2570215",
"name": "加",
"font_class": "jia",
"unicode": "e690",
"unicode_decimal": 59024
},
{
"icon_id": "2570217",
"name": "减",
"font_class": "jian",
"unicode": "e692",
"unicode_decimal": 59026
},
{
"icon_id": "209544",
"name": "中国地图",
"font_class": "zhongguoditu",
"unicode": "e6f4",
"unicode_decimal": 59124
},
{
"icon_id": "1576021",
"name": "打电话",
"font_class": "dadianhua",
"unicode": "e61b",
"unicode_decimal": 58907
},
{
"icon_id": "1682643",
"name": "母婴亲子",
"font_class": "muyingqinzi",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "2833319",
"name": "类型默认图-投票1",
"font_class": "leixingmorentu-toupiao",
"unicode": "e755",
"unicode_decimal": 59221
},
{
"icon_id": "1615046",
"name": "人",
"font_class": "ren",
"unicode": "e658",
"unicode_decimal": 58968
},
{
"icon_id": "820872",
"name": "未成年人特定重大疾病关爱保险金",
"font_class": "weichengnianrentedingzhongdajibingguanaibaoxianjin",
"unicode": "e64d",
"unicode_decimal": 58957
},
{
"icon_id": "166065",
"name": "天数-当前选中",
"font_class": "tianshudangqianxuanzhong",
"unicode": "e654",
"unicode_decimal": 58964
},
{
"icon_id": "2133643",
"name": "目的地",
"font_class": "mudedi",
"unicode": "e6c8",
"unicode_decimal": 59080
},
{
"icon_id": "574795",
"name": "09_财富中心",
"font_class": "09caifuzhongxin",
"unicode": "e68a",
"unicode_decimal": 59018
},
{
"icon_id": "765683",
"name": "财富中心",
"font_class": "caifuzhongxin",
"unicode": "e619",
"unicode_decimal": 58905
},
{
"icon_id": "1989306",
"name": "pdf",
"font_class": "pdf",
"unicode": "e6ca",
"unicode_decimal": 59082
},
{
"icon_id": "101352",
"name": "phone menu-02",
"font_class": "phonemenu02",
"unicode": "e637",
"unicode_decimal": 58935
},
{
"icon_id": "95888",
"name": "男人",
"font_class": "nanren",
"unicode": "e617",
"unicode_decimal": 58903
},
{
"icon_id": "1033999",
"name": "女性-人物",
"font_class": "iconfontnvtouxiang",
"unicode": "e638",
"unicode_decimal": 58936
},
{
"icon_id": "1471969",
"name": "旅行",
"font_class": "lvhang",
"unicode": "e603",
"unicode_decimal": 58883
},
{
"icon_id": "1709715",
"name": "户外2",
"font_class": "huwai",
"unicode": "e61a",
"unicode_decimal": 58906
},
{
"icon_id": "2432130",
"name": "留学-实心",
"font_class": "liuxue-shixin",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "1556332",
"name": "支付宝",
"font_class": "icon-alipay",
"unicode": "e625",
"unicode_decimal": 58917
},
{
"icon_id": "1945360",
"name": "微信",
"font_class": "weixin",
"unicode": "e602",
"unicode_decimal": 58882
},
{
"icon_id": "569458",
"name": "用户",
"font_class": "yonghu1",
"unicode": "e6d8",
"unicode_decimal": 59096
},
{
"icon_id": "683272",
"name": "电话",
"font_class": "dianhua",
"unicode": "e653",
"unicode_decimal": 58963
},
{
"icon_id": "2072443",
"name": "菜单",
"font_class": "caidan",
"unicode": "e65b",
"unicode_decimal": 58971
},
{
"icon_id": "671099",
"name": "银行卡",
"font_class": "icon",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "1183559",
"name": "密码",
"font_class": "tubiao02",
"unicode": "e601",
"unicode_decimal": 58881
},
{
"icon_id": "1428662",
"name": "身份证",
"font_class": "shenfenzheng",
"unicode": "e655",
"unicode_decimal": 58965
},
{
"icon_id": "1695188",
"name": "银行",
"font_class": "yinhang",
"unicode": "e616",
"unicode_decimal": 58902
},
{
"icon_id": "2098701",
"name": "用户",
"font_class": "yonghu",
"unicode": "e630",
"unicode_decimal": 58928
},
{
"icon_id": "720797",
"name": "验证码 (3)",
"font_class": "yanzhengma3",
"unicode": "e657",
"unicode_decimal": 58967
}
]
}
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! jQuery v1.8.3 jquery.com | jquery.org/license */
(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.ajQuery&&define("jquery",[],function(){return v})})(window);
\ No newline at end of file
/**
* @fileoverview
* - Using the 'QRCode for Javascript library'
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
* - this library has no dependencies.
*
* @author davidshimjs
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
*/
var QRCode;
(function () {
//---------------------------------------------------------------------
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
function QR8bitByte(data) {
this.mode = QRMode.MODE_8BIT_BYTE;
this.data = data;
this.parsedData = [];
// Added to support UTF-8 Characters
for (var i = 0, l = this.data.length; i < l; i++) {
var byteArray = [];
var code = this.data.charCodeAt(i);
if (code > 0x10000) {
byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray[3] = 0x80 | (code & 0x3F);
} else if (code > 0x800) {
byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray[2] = 0x80 | (code & 0x3F);
} else if (code > 0x80) {
byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
byteArray[1] = 0x80 | (code & 0x3F);
} else {
byteArray[0] = code;
}
this.parsedData.push(byteArray);
}
this.parsedData = Array.prototype.concat.apply([], this.parsedData);
if (this.parsedData.length != this.data.length) {
this.parsedData.unshift(191);
this.parsedData.unshift(187);
this.parsedData.unshift(239);
}
}
QR8bitByte.prototype = {
getLength: function (buffer) {
return this.parsedData.length;
},
write: function (buffer) {
for (var i = 0, l = this.parsedData.length; i < l; i++) {
buffer.put(this.parsedData[i], 8);
}
}
};
function QRCodeModel(typeNumber, errorCorrectLevel) {
this.typeNumber = typeNumber;
this.errorCorrectLevel = errorCorrectLevel;
this.modules = null;
this.moduleCount = 0;
this.dataCache = null;
this.dataList = [];
}
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}
this.modules[r][6]=(r%2==0);}
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. ("
+buffer.getLengthInBits()
+">"
+totalDataCount*8
+")");}
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}
buffer.put(QRCodeModel.PAD1,8);}
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}
if(r==0&&c==0){continue;}
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}
if(sameCount>5){lostPoint+=(3+sameCount-5);}}}
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");}
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}
while(n>=256){n-=255;}
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);}
var offset=0;while(offset<num.length&&num[offset]==0){offset++;}
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);}
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
function _isSupportCanvas() {
return typeof CanvasRenderingContext2D != "undefined";
}
// android 2.x doesn't support Data-URI spec
function _getAndroid() {
/*
var android = false;
var sAgent = navigator.userAgent;
if (/android/i.test(sAgent)) { // android
android = true;
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
if (aMat && aMat[1]) {
android = parseFloat(aMat[1]);
}
}
return android;
由于android 2.x的旧机子已经根本不用考虑了,
而这个方法在makeImage的时候被调用,并不是用来判断是否是android机子,
只是用来判断是需要考虑android老设备不支持Data-URI的问题,所以这里直接置false,不考虑即可
*/
return false;
}
var svgDrawer = (function() {
var Drawing = function (el, htOption) {
this._el = el;
this._htOption = htOption;
};
Drawing.prototype.draw = function (oQRCode) {
var _htOption = this._htOption;
var _el = this._el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(_htOption.width / nCount);
var nHeight = Math.floor(_htOption.height / nCount);
this.clear();
function makeSVG(tag, attrs) {
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
for (var k in attrs)
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
return el;
}
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
_el.appendChild(svg);
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
for (var row = 0; row < nCount; row++) {
for (var col = 0; col < nCount; col++) {
if (oQRCode.isDark(row, col)) {
var child = makeSVG("use", {"x": String(col), "y": String(row)});
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")
svg.appendChild(child);
}
}
}
};
Drawing.prototype.clear = function () {
while (this._el.hasChildNodes())
this._el.removeChild(this._el.lastChild);
};
return Drawing;
})();
var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
// Drawing in DOM by using Table tag
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
var Drawing = function (el, htOption) {
this._el = el;
this._htOption = htOption;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing.prototype.draw = function (oQRCode) {
var _htOption = this._htOption;
var _el = this._el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(_htOption.width / nCount);
var nHeight = Math.floor(_htOption.height / nCount);
var aHTML = ['<table style="border:0;border-collapse:collapse;">'];
for (var row = 0; row < nCount; row++) {
aHTML.push('<tr>');
for (var col = 0; col < nCount; col++) {
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');
}
aHTML.push('</tr>');
}
aHTML.push('</table>');
_el.innerHTML = aHTML.join('');
// Fix the margin values as real size.
var elTable = _el.childNodes[0];
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
}
};
/**
* Clear the QRCode
*/
Drawing.prototype.clear = function () {
this._el.innerHTML = '';
};
return Drawing;
})() : (function () { // Drawing in Canvas
function _onMakeImage() {
this._elImage.src = this._elCanvas.toDataURL("image/png");
this._elImage.style.display = "block";
//如果没有中心icon的话,二维码display会被设为none
//this._elCanvas.style.display = "none";
}
// Android 2.1 bug workaround
// http://code.google.com/p/android/issues/detail?id=5141
if (this._android && this._android <= 2.1) {
var factor = 1 / window.devicePixelRatio;
var drawImage = CanvasRenderingContext2D.prototype.drawImage;
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
if (("nodeName" in image) && /img/i.test(image.nodeName)) {
for (var i = arguments.length - 1; i >= 1; i--) {
arguments[i] = arguments[i] * factor;
}
} else if (typeof dw == "undefined") {
arguments[1] *= factor;
arguments[2] *= factor;
arguments[3] *= factor;
arguments[4] *= factor;
}
drawImage.apply(this, arguments);
};
}
/**
* Check whether the user's browser supports Data URI or not
*
* @private
* @param {Function} fSuccess Occurs if it supports Data URI
* @param {Function} fFail Occurs if it doesn't support Data URI
*/
function _safeSetDataURI(fSuccess, fFail) {
var self = this;
self._fFail = fFail;
self._fSuccess = fSuccess;
// Check it just once
if (self._bSupportDataURI === null) {
var el = document.createElement("img");
var fOnError = function() {
self._bSupportDataURI = false;
if (self._fFail) {
self._fFail.call(self);
}
};
var fOnSuccess = function() {
self._bSupportDataURI = true;
if (self._fSuccess) {
self._fSuccess.call(self);
}
};
el.onabort = fOnError;
el.onerror = fOnError;
el.onload = fOnSuccess;
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
return;
} else if (self._bSupportDataURI === true && self._fSuccess) {
self._fSuccess.call(self);
} else if (self._bSupportDataURI === false && self._fFail) {
self._fFail.call(self);
}
};
/**
* Drawing QRCode by using canvas
*
* @constructor
* @param {HTMLElement} el
* @param {Object} htOption QRCode Options
*/
var Drawing = function (el, htOption) {
this._bIsPainted = false;
this._android = _getAndroid();
this._htOption = htOption;
this._elCanvas = document.createElement("canvas");
this._elCanvas.width = htOption.curtainWidth ? htOption.curtainWidth : htOption.width;
this._elCanvas.height = htOption.curtainHeight ? htOption.curtainHeight : htOption.height;
el.appendChild(this._elCanvas);
this._el = el;
this._oContext = this._elCanvas.getContext("2d");
this._bIsPainted = false;
this._elImage = document.createElement("img");
this._elImage.alt = "Scan me!";
this._elImage.style.display = "none";
//this._el.appendChild(this._elImage);
this._bSupportDataURI = null;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing.prototype.draw = function (oQRCode) {
//目前真正被调用的是该draw方法
var _elImage = this._elImage;
var _oContext = this._oContext;
var _htOption = this._htOption;
var nCount = oQRCode.getModuleCount();
var nWidth = _htOption.width / nCount;
var nHeight = _htOption.height / nCount;
var nRoundedWidth = Math.round(nWidth);
var nRoundedHeight = Math.round(nHeight);
_elImage.style.display = "none";
this.clear();
for (var row = 0; row < nCount; row++) {
for (var col = 0; col < nCount; col++) {
var bIsDark = oQRCode.isDark(row, col);
var nLeft = col * nWidth;
var nTop = row * nHeight;
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
_oContext.lineWidth = 1;
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
// 안티 앨리어싱 방지 처리
_oContext.strokeRect(
Math.floor(nLeft) + 0.5,
Math.floor(nTop) + 0.5,
nRoundedWidth,
nRoundedHeight
);
_oContext.strokeRect(
Math.ceil(nLeft) - 0.5,
Math.ceil(nTop) - 0.5,
nRoundedWidth,
nRoundedHeight
);
}
}
this._bIsPainted = true;
};
function drawRoundRect(ctx, x, y, width, height, radius, lineWidth, lineColor) {
ctx.lineWidth = lineWidth;
ctx.strokeStyle = lineColor;
ctx.beginPath();
ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2);
ctx.lineTo(width - radius + x, y);
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.lineTo(radius + x, height +y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.closePath();
//因为有的时候图片不需要设置边框线
if(lineWidth > 0) ctx.stroke();
};
Drawing.prototype.addIcon = async function (iconSrc) {
//通过ES6的async/await语法将异步的Promise转为同步方法
const image = await new Promise((resolve, reject) => {
const image = new Image();
image.src = iconSrc;
image.onload=()=>{resolve(image);};
});
//图片占整个二维码的比例,在QRCode.CorrectLevel.L测试可行,那么更高的纠错率就更没问题了
const ratio = 0.3;
const radius = 10;
const marginRatio = (1-ratio)/2;
const x = this._htOption.width * marginRatio;
const y = this._htOption.height * marginRatio;
const width = this._htOption.width * ratio;
const height = this._htOption.height * ratio;
drawRoundRect(this._oContext, x, y, width, height, this._htOption.iconRadius, this._htOption.iconBorderWidth, this._htOption.iconBorderColor);
this._oContext.save();
this._oContext.clip();
this._oContext.drawImage(image, x, y, width, height);
this._oContext.restore();
};
Drawing.prototype.addCurtain = async function (curtainSrc) {
const image = await new Promise((resolve, reject) => {
const image = new Image();
image.src = curtainSrc;
image.onload=()=>{resolve(image);};
});
this._oContext.drawImage(image, 0, 0, this._htOption.curtainWidth, this._htOption.curtainHeight);
}
/**
* Make the image from Canvas if the browser supports Data URI.
*/
Drawing.prototype.makeImage = function () {
if (this._bIsPainted) {
_safeSetDataURI.call(this, _onMakeImage);
}
};
/**
* Return whether the QRCode is painted or not
*
* @return {Boolean}
*/
Drawing.prototype.isPainted = function () {
return this._bIsPainted;
};
/**
* Clear the QRCode
*/
Drawing.prototype.clear = function () {
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);
this._bIsPainted = false;
};
/**
* @private
* @param {Number} nNumber
*/
Drawing.prototype.round = function (nNumber) {
if (!nNumber) {
return nNumber;
}
return Math.floor(nNumber * 1000) / 1000;
};
return Drawing;
})();
/**
* Get the type by string length
*
* @private
* @param {String} sText
* @param {Number} nCorrectLevel
* @return {Number} type
*/
function _getTypeNumber(sText, nCorrectLevel) {
var nType = 1;
var length = _getUTF8Length(sText);
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
var nLimit = 0;
switch (nCorrectLevel) {
case QRErrorCorrectLevel.L :
nLimit = QRCodeLimitLength[i][0];
break;
case QRErrorCorrectLevel.M :
nLimit = QRCodeLimitLength[i][1];
break;
case QRErrorCorrectLevel.Q :
nLimit = QRCodeLimitLength[i][2];
break;
case QRErrorCorrectLevel.H :
nLimit = QRCodeLimitLength[i][3];
break;
}
if (length <= nLimit) {
break;
} else {
nType++;
}
}
if (nType > QRCodeLimitLength.length) {
throw new Error("Too long data");
}
return nType;
}
function _getUTF8Length(sText) {
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
return replacedText.length + (replacedText.length != sText ? 3 : 0);
}
/**
* @class QRCode
* @constructor
* @example
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
*
* @example
* var oQRCode = new QRCode("test", {
* text : "http://naver.com",
* width : 128,
* height : 128
* });
*
* oQRCode.clear(); // Clear the QRCode.
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
*
* @param {HTMLElement|String} el target element or 'id' attribute of element.
* @param {Object|String} vOption
* @param {String} vOption.text QRCode link data
* @param {Number} [vOption.width=256]
* @param {Number} [vOption.height=256]
* @param {String} [vOption.colorDark="#000000"]
* @param {String} [vOption.colorLight="#ffffff"]
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
*/
QRCode = function (el, vOption) {
this._htOption = {
//二维码大小
width : 256,
height : 256,
typeNumber : 4,
colorDark : "#000000",
colorLight : "#ffffff",
correctLevel : QRErrorCorrectLevel.H,
//二维码中间图标
iconSrc: undefined,
iconBorderWidth: 0,
iconBorderColor: "black",
//幕布图片
curtainImg: undefined,
curtainBgColor: undefined,
//整个画布大小,边框充满整个画布
curtainWidth: undefined,
curtainHeight: undefined,
//二维码相对画布或边框图片的偏移
qrcodeOffsetX: undefined,
qrcodeOffsetY: undefined,
};
if (typeof vOption === 'string') {
vOption = {
text : vOption
};
}
// Overwrites options
if (vOption) {
for (var i in vOption) {
this._htOption[i] = vOption[i];
}
}
if (typeof el == "string") {
el = document.getElementById(el);
}
if (this._htOption.useSVG) {
Drawing = svgDrawer;
}
this._android = _getAndroid();
this._el = el;
this._oQRCode = null;
this._oDrawing = new Drawing(this._el, this._htOption);
if (this._htOption.text) {
this.makeCode(this._htOption.text);
}
};
/**
* Make the QRCode
*
* @param {String} sText link data
*/
QRCode.prototype.makeCode = async function (sText) {
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
this._oQRCode.addData(sText);
this._oQRCode.make();
this._el.title = sText;
const offsetExists = typeof(this._htOption.qrcodeOffsetX) !== "undefined" && typeof(this._htOption.qrcodeOffsetY) !== "undefined";
const curtainExists = typeof(this._htOption.curtainWidth) !== "undefined" && typeof(this._htOption.curtainHeight) !== "undefined";
const curtainImgExists = typeof(this._htOption.curtainImg) !== "undefined";
const curtainBgColorExists = typeof this._htOption.curtainBgColor !== "undefined" && curtainExists;
if(curtainBgColorExists) {
//如果不填充白色,下载下来的图片默认为透明色,很难看
this._oDrawing._oContext.fillStyle = this._htOption.curtainBgColor ? this._htOption.curtainBgColor : "white";
this._oDrawing._oContext.fillRect(0, 0, this._htOption.curtainWidth, this._htOption.curtainHeight);
this._oDrawing._oContext.save();
}
if(offsetExists) {
const x = this._htOption.qrcodeOffsetX;
const y = this._htOption.qrcodeOffsetY;
this._oDrawing._oContext.save();
this._oDrawing._oContext.translate(x, y);
}
if(curtainBgColorExists) {
this._oDrawing._oContext.rect(0,0,this._htOption.width,this._htOption.height);
this._oDrawing._oContext.clip();
}
this._oDrawing.draw(this._oQRCode);
if(typeof(this._htOption.iconSrc) !== "undefined") {
//这里是异步的函数,只有加了await才会变成同步(注意:即使函数里面有await,这个函数也是异步执行的)
await this._oDrawing.addIcon(this._htOption.iconSrc);
}
if(curtainBgColorExists) {
this._oDrawing._oContext.restore();
}
if(offsetExists) {
this._oDrawing._oContext.restore();
}
if(curtainImgExists) {
this._oDrawing._oContext.globalCompositeOperation = "destination-over";
await this._oDrawing.addCurtain(this._htOption.curtainImg);
this._oDrawing._oContext.globalCompositeOperation = "source-over";
}
this.makeImage();
};
/**
* Make the Image from Canvas element
* - It occurs automatically
* - Android below 3 doesn't support Data-URI spec.
*
* @private
*/
QRCode.prototype.makeImage = function () {
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
this._oDrawing.makeImage();
}
};
/**
* Clear the QRCode
*/
QRCode.prototype.clear = function () {
this._oDrawing.clear();
};
/**
* @name QRCode.CorrectLevel
*/
QRCode.CorrectLevel = QRErrorCorrectLevel;
})();
/*! laydate-v5.0.9 日期与时间组件 MIT License http://www.layui.com/laydate/ By 贤心 */
;!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期<br>建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t<n.length;t++)this.push(n[t])};C.prototype=[],C.prototype.constructor=C,w.extend=function(){var e=1,t=arguments,n=function(e,t){e=e||(t.constructor===Array?[]:{});for(var a in t)e[a]=t[a]&&t[a].constructor===Object?n(e[a],t[a]):t[a];return e};for(t[0]="object"==typeof t[0]?t[0]:{};e<t.length;e++)"object"==typeof t[e]&&n(t[0],t[e]);return t[0]},w.ie=function(){var e=navigator.userAgent.toLowerCase();return!!(window.ActiveXObject||"ActiveXObject"in window)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")}(),w.stope=function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},w.each=function(e,t){var n,a=this;if("function"!=typeof t)return a;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return a},w.digit=function(e,t,n){var a="";e=String(e),t=t||2;for(var i=e.length;i<t;i++)a+="0";return e<Math.pow(10,t)?a+(0|e):e},w.elem=function(e,t){var n=document.createElement(e);return w.each(t||{},function(e,t){n.setAttribute(e,t)}),n},C.addStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){new RegExp("\\b"+n+"\\b").test(e)||(e=e+" "+n)}),e.replace(/^\s|\s$/,"")},C.removeStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){var a=new RegExp("\\b"+n+"\\b");a.test(e)&&(e=e.replace(a,""))}),e.replace(/\s+/," ").replace(/^\s|\s$/,"")},C.prototype.find=function(e){var t=this,n=0,a=[],i="object"==typeof e;return this.each(function(r,o){for(var s=i?[e]:o.querySelectorAll(e||null);n<s.length;n++)a.push(s[n]);t.shift()}),i||(t.selector=(t.selector?t.selector+" ":"")+e),w.each(a,function(e,n){t.push(n)}),t},C.prototype.each=function(e){return w.each.call(this,this,e)},C.prototype.addClass=function(e,t){return this.each(function(n,a){a.className=C[t?"removeStr":"addStr"](a.className,e)})},C.prototype.removeClass=function(e){return this.addClass(e,!0)},C.prototype.hasClass=function(e){var t=!1;return this.each(function(n,a){new RegExp("\\b"+e+"\\b").test(a.className)&&(t=!0)}),t},C.prototype.attr=function(e,t){var n=this;return void 0===t?function(){if(n.length>0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r<s?o+r*s:r:o);a=[l.getFullYear(),l.getMonth()+1,l.getDate()],r<s||(i=[l.getHours(),l.getMinutes(),l.getSeconds()])}else a=(t[n].match(/\d+-\d+-\d+/)||[""])[0].split("-"),i=(t[n].match(/\d+:\d+:\d+/)||[""])[0].split(":");t[n]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|i[0],minutes:0|i[1],seconds:0|i[2]}}),e.elemID="layui-laydate"+t.elem.attr("lay-key"),(t.show||a)&&e.render(),a||e.events(),t.value&&(t.value.constructor===Date?e.setValue(e.parse(0,e.systemDate(t.value))):e.setValue(t.value)))},T.prototype.render=function(){var e=this,t=e.config,n=e.lang(),a="static"===t.position,i=e.elem=w.elem("div",{id:e.elemID,"class":["layui-laydate",t.range?" layui-laydate-range":"",a?" "+c:"",t.theme&&"default"!==t.theme&&!/^#/.test(t.theme)?" laydate-theme-"+t.theme:""].join("")}),r=e.elemMain=[],o=e.elemHeader=[],s=e.elemCont=[],l=e.table=[],d=e.footer=w.elem("div",{"class":p});if(t.zIndex&&(i.style.zIndex=t.zIndex),w.each(new Array(2),function(e){if(!t.range&&e>0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="&#xe65a;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="&#xe603;",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="&#xe602;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="&#xe65b;",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push('<span lay-type="datetime" class="laydate-btns-time">'+n.timeTips+"</span>"),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push('<span lay-type="'+r+'" class="laydate-btns-'+r+'">'+o+"</span>"))}),e.push('<div class="laydate-footer-btns">'+i.join("")+"</div>"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3)},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length<l.length&&(a=!0),/yyyy|y/.test(l)?(c<d[0]&&(c=d[0],a=!0),e.year=c):/MM|M/.test(l)?(c<1&&(c=1,a=!0),e.month=c-1):/dd|d/.test(l)?(c<1&&(c=1,a=!0),e.date=c):/HH|H/.test(l)?(c<1&&(c=0,a=!0),e.hours=c,r.range&&(i[o[n]].hours=c)):/mm|m/.test(l)?(c<1&&(c=0,a=!0),e.minutes=c,r.range&&(i[o[n]].minutes=c)):/ss|s/.test(l)&&(c<1&&(c=0,a=!0),e.seconds=c,r.range&&(i[o[n]].seconds=c))}),c(e)};return"limit"===e?(c(o),i):(l=l||r.value,"string"==typeof l&&(l=l.replace(/\s+/g," ").replace(/^\s|\s$/g,"")),i.startState&&!i.endState&&(delete i.startState,i.endState=!0),"string"==typeof l&&l?i.EXP_IF.test(l)?r.range?(l=l.split(" "+r.range+" "),i.startDate=i.startDate||i.systemDate(),i.endDate=i.endDate||i.systemDate(),r.dateTime=w.extend({},i.startDate),w.each([i.startDate,i.endDate],function(e,t){m(t,l[e],e)})):m(o,l):(i.hint("日期格式不合法<br>必须遵循下述格式:<br>"+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"<br>已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html('<span class="laydate-day-mark">'+n+"</span>"),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.now<l.min||l.now>l.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.year<d[0]&&(l.year=d[0],r.hint("最低只能支持到公元"+d[0]+"年")),l.year>d[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e<t?(c=a-t+e,n.addClass("laydate-day-prev"),d=r.getAsYM(l.year,l.month,"sub")):e>=t&&e<i+t?(c=e-t,s.range||c+1===l.date&&n.addClass(o)):(c=e-i-t,n.addClass("laydate-day-next"),d=r.getAsYM(l.year,l.month)),d[1]++,d[2]=c+1,n.attr("lay-ymd",d.join("-")).html(d[2]),r.mark(n,d).limit(n,{year:d[0],month:d[1]-1,date:d[2]},e)}),w(f[0]).attr("lay-ym",l.year+"-"+(l.month+1)),w(f[1]).attr("lay-ym",l.year+"-"+(l.month+1)),"cn"===s.lang?(w(f[0]).attr("lay-type","year").html(l.year+"年"),w(f[1]).attr("lay-type","month").html(l.month+1+"月")):(w(f[0]).attr("lay-type","month").html(m.month[l.month]),w(f[1]).attr("lay-type","year").html(l.year)),u&&(s.range&&(e?r.endDate=r.endDate||{year:l.year+("year"===s.type?1:0),month:l.month+("month"===s.type?0:-1)}:r.startDate=r.startDate||{year:l.year,month:l.month},e&&(r.listYM=[[r.startDate.year,r.startDate.month+1],[r.endDate.year,r.endDate.month+1]],r.list(s.type,0).list(s.type,1),"time"===s.type?r.setBtnStatus("时间",w.extend({},r.systemDate(),r.startTime),w.extend({},r.systemDate(),r.endTime)):r.setBtnStatus(!0))),s.range||(r.listYM=[[l.year,l.month+1]],r.list(s.type,0))),s.range&&!e){var p=r.getAsYM(l.year,l.month);r.calendar(w.extend({},l,{year:p[0],month:p[1]}))}return s.range||r.limit(w(r.footer).find(g),null,0,["hours","minutes","seconds"]),s.range&&e&&!u&&r.stampRange(),r},T.prototype.list=function(e,t){var n=this,a=n.config,i=a.dateTime,r=n.lang(),l=a.range&&"date"!==a.type&&"datetime"!==a.type,d=w.elem("ul",{"class":m+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[e]}),c=n.elemHeader[t],u=w(c[2]).find("span"),h=n.elemCont[t||0],y=w(h).find("."+m)[0],f="cn"===a.lang,p=f?"年":"",T=n.listYM[t]||{},C=["hours","minutes","seconds"],x=["startTime","endTime"][t];if(T[0]<1&&(T[0]=1),"year"===e){var M,b=M=T[0]-7;b<1&&(b=M=1),w.each(new Array(15),function(e){var i=w.elem("li",{"lay-ym":M}),r={year:M};M==T[0]&&w(i).addClass(o),i.innerHTML=M+p,d.appendChild(i),M<n.firstDate.year?(r.month=a.min.month,r.date=a.min.date):M>=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]<n.firstDate.year?s.date=a.min.date:T[0]>=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["<p>"+r.time[e]+"</p><ol>"];w.each(new Array(t),function(t){i.push("<li"+(n[x][C[e]]===t?' class="'+o+'"':"")+">"+w.digit(t,2)+"</li>")}),a.innerHTML=i.join("")+"</ol>",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s<t&&w(i).addClass(u)})},T.prototype.done=function(e,t){var n=this,a=n.config,i=w.extend({},n.startDate?w.extend(n.startDate,n.startTime):a.dateTime),r=w.extend({},w.extend(n.endDate,n.endTime));return w.each([i,r],function(e,t){"month"in t&&w.extend(t,{month:t.month+1})}),e=e||[n.parse(),i,r],"function"==typeof a[t||"done"]&&a[t||"done"].apply(a,e),n},T.prototype.choose=function(e){var t=this,n=t.config,a=n.dateTime,i=w(t.elem).find("td"),r=e.attr("lay-ymd").split("-"),l=function(e){new Date;e&&w.extend(a,r),n.range&&(t.startDate?w.extend(t.startDate,r):t.startDate=w.extend({},r,t.startTime),t.startYMD=r)};if(r={year:0|r[0],month:(0|r[1])-1,date:0|r[2]},!e.hasClass(s))if(n.range){if(w.each(["startTime","endTime"],function(e,n){t[n]=t[n]||{hours:0,minutes:0,seconds:0}}),t.endState)l(),delete t.endState,delete t.endDate,t.startState=!0,i.removeClass(o+" "+u),e.addClass(o);else if(t.startState){if(e.addClass(o),t.endDate?w.extend(t.endDate,r):t.endDate=w.extend({},r,t.endTime),t.newDate(r).getTime()<t.newDate(t.startYMD).getTime()){var d=w.extend({},t.endDate,{hours:t.startDate.hours,minutes:t.startDate.minutes,seconds:t.startDate.seconds});w.extend(t.endDate,t.startDate,{hours:t.endDate.hours,minutes:t.endDate.minutes,seconds:t.endDate.seconds}),t.startDate=d}n.showBottom||t.done(),t.stampRange(),t.endState=!0,t.done(null,"change")}else e.addClass(o),l(),t.startState=!0;w(t.footer).find(g)[t.endDate?"removeClass":"addClass"](s)}else"static"===n.position?(l(!0),t.calendar().done().done(null,"change")):"date"===n.type?(l(!0),t.setValue(t.parse()).remove().done()):"datetime"===n.type&&(l(!0),t.calendar().done(null,"change"))},T.prototype.tool=function(e,t){var n=this,a=n.config,i=a.dateTime,r="static"===a.position,o={datetime:function(){w(e).hasClass(s)||(n.list("time",0),a.range&&n.list("time",1),w(e).attr("lay-type","date").html(n.lang().dateTips))},date:function(){n.closeList(),w(e).attr("lay-type","datetime").html(n.lang().timeTips)},clear:function(){n.setValue("").remove(),r&&(w.extend(i,n.firstDate),n.calendar()),a.range&&(delete n.startState,delete n.endState,delete n.endDate,delete n.startTime,delete n.endTime),n.done(["",{},{}])},now:function(){var e=new Date;w.extend(i,n.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),n.setValue(n.parse()).remove(),r&&n.calendar(),n.done()},confirm:function(){if(a.range){if(!n.endDate)return n.hint("请先选择日期范围");if(w(e).hasClass(s))return n.hint("time"===a.type?l.replace(/日期/g,"时间"):l)}else if(w(e).hasClass(s))return n.hint("不在有效日期或时间范围内");n.done(),n.setValue(n.parse()).remove()}};o[t]&&o[t]()},T.prototype.change=function(e){var t=this,n=t.config,a=n.dateTime,i=n.range&&("year"===n.type||"month"===n.type),r=t.elemCont[e||0],o=t.listYM[e],s=function(s){var l=["startDate","endDate"][e],d=w(r).find(".laydate-year-list")[0],c=w(r).find(".laydate-month-list")[0];return d&&(o[0]=s?o[0]-15:o[0]+15,t.list("year",e)),c&&(s?o[0]--:o[0]++,t.list("month",e)),(d||c)&&(w.extend(a,{year:o[0]}),i&&(t[l].year=o[0]),n.range||t.done(null,"change"),t.setBtnStatus(),n.range||t.limit(w(t.footer).find(g),{year:o[0]})),d||c};return{prevYear:function(){s("sub")||(a.year--,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))},prevMonth:function(){var e=t.getAsYM(a.year,a.month,"sub");w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextMonth:function(){var e=t.getAsYM(a.year,a.month);w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextYear:function(){s()||(a.year++,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))}}},T.prototype.changeEvent=function(){var e=this;e.config;w(e.elem).on("click",function(e){w.stope(e)}),w.each(e.elemHeader,function(t,n){w(n[0]).on("click",function(n){e.change(t).prevYear()}),w(n[1]).on("click",function(n){e.change(t).prevMonth()}),w(n[2]).find("span").on("click",function(n){var a=w(this),i=a.attr("lay-ym"),r=a.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(r,t),w(e.footer).find(D).addClass(s))}),w(n[3]).on("click",function(n){e.change(t).nextMonth()}),w(n[4]).on("click",function(n){e.change(t).nextYear()})}),w.each(e.table,function(t,n){var a=w(n).find("td");a.on("click",function(){e.choose(w(this))})}),w(e.footer).find("span").on("click",function(){var t=w(this).attr("lay-type");e.tool(this,t)})},T.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},T.prototype.events=function(){var e=this,t=e.config,n=function(n,a){n.on(t.trigger,function(){a&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(n(t.elem,"bind"),n(t.eventElem),w(document).on("click",function(n){n.target!==t.elem[0]&&n.target!==t.eventElem[0]&&n.target!==w(t.closeStop)[0]&&e.remove()}).on("keydown",function(t){13===t.keyCode&&w("#"+e.elemID)[0]&&e.elemID===T.thisElem&&(t.preventDefault(),w(e.footer).find(g)[0].click())}),w(window).on("resize",function(){return!(!e.elem||!w(r)[0])&&void e.position()}),t.elem[0].eventHandler=!0)},n.render=function(e){var t=new T(e);return a.call(t)},n.getEndDate=function(e,t){var n=new Date;return n.setFullYear(t||n.getFullYear(),e||n.getMonth()+1,1),new Date(n.getTime()-864e5).getDate()},window.lay=window.lay||w,e?(n.ready(),layui.define(function(e){n.path=layui.cache.dir,e(i,n)})):"function"==typeof define&&define.amd?define(function(){return n}):function(){n.ready(),window.laydate=n}()}();
\ 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="laydate-icon" horiz-adv-x="1024" >
<font-face
font-family="laydate-icon"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
<glyph glyph-name="youyou" unicode="&#58882;" d="M283.648 721.918976 340.873216 780.926976 740.352 383.997952 340.876288-12.925952 283.648 46.077952 619.52 383.997952Z" horiz-adv-x="1024" />
<glyph glyph-name="zuozuo" unicode="&#58883;" d="M740.352 721.918976 683.126784 780.926976 283.648 383.997952 683.123712-12.925952 740.352 46.077952 404.48 383.997952Z" horiz-adv-x="1024" />
<glyph glyph-name="xiayiye" unicode="&#58970;" d="M62.573 384.103l423.401 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.751-18.976-68.727 0l-39.753 39.753 0.269 0.246-385.655 385.661zM451.365 384.103l423.407 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.757-18.977-68.727 0l-39.762 39.754 0.273 0.249-385.662 385.661zM451.365 384.103z" horiz-adv-x="1024" />
<glyph glyph-name="xiayiye1" unicode="&#58971;" d="M948.066926 382.958838l-411.990051-412.24426c-18.47333-18.47333-48.417689-18.47333-66.875207 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L814.691135 383.088983 467.512212 730.269123c-18.466032 18.458735-18.466032 48.405526 0 66.873991 18.468465 18.464816 48.410391 18.464816 66.872774 0l38.682336-38.682336-0.261507-0.239614 375.259894-375.265975v0.003649m-378.312834 0L157.756743-29.285422c-18.47333-18.47333-48.415256-18.47333-66.872775 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L436.369787 383.088983 89.19208 730.269123c-18.4636 18.458735-18.4636 48.405526 0 66.873991 18.470898 18.464816 48.415256 18.464816 66.872774 0l38.692067-38.682336-0.266372-0.239614 375.267191-375.265975-0.004865 0.003649m0 0z" horiz-adv-x="1024" />
</font>
</defs></svg>
/*! laydate-v5.0.9 日期与时间组件 MIT License http://www.layui.com/laydate/ By 贤心 */
.laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666;font-weight: normal !important;}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}@font-face{font-family:laydate-icon;src:url(font/iconfont.eot);src:url(font/iconfont.eot#iefix) format('embedded-opentype'),url(font/iconfont.svg#iconfont) format('svg'),url(font/iconfont.woff) format('woff'),url(font/iconfont.ttf) format('truetype')}.laydate-icon{font-family:laydate-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
This source diff could not be displayed because it is too large. You can view the blob instead.
# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
#
# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed
> 0.5%
last 2 versions
Firefox ESR
not dead
not IE 9-11
\ No newline at end of file
export const environment = {
production: true,
BACKEND_URL_CONFIG_VALUE: 'https://m.zuihuibi.cn/api',
ORIGINNAME: 'https://m.zuihuibi.cn/ydapi',
DOMAINNAME: 'https://m.zuihuibi.cn/',
BAIDU_TONGJI_CODE: '36b1eb7eec3b5dac9f97d887092b5b27'
};
/**
* Created by Sweet on 14/03/2018.
*/
export const environment = {
production: true,
BACKEND_URL_CONFIG_VALUE: 'https://mstage.zuihuibi.cn/api',
ORIGINNAME: 'https://mstage.zuihuibi.cn/ydapi',
DOMAINNAME: 'https://mstage.zuihuibi.cn/',
BAIDU_TONGJI_CODE: '84be9b9eaaca51048f32bb160ccad2e6'
};
// The file contents for the current environment will overwrite these during build.
// The build system defaults to the dev environment which uses `environment.ts`, but if you do
// `ng build --env=prod` then `environment.prod.ts` will be used instead.
// The list of which env maps to which file can be found in `.angular-cli.json`.
export const environment = {
production: false,
BACKEND_URL_CONFIG_VALUE: 'https://mdev.zuihuibi.cn/api',
ORIGINNAME: 'https://mdev.zuihuibi.cn/ydapi',
DOMAINNAME: 'https://mdev.zuihuibi.cn/',
BAIDU_TONGJI_CODE: 'e8fa107d82e0471d097d545225aeed64'
};
File added
<!doctype html>
<html lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<meta name="keywords" content="银盾保险在线,健康保险,出国旅行保险,户外运动保险,意外保险,国内旅行保险,留学游学保险,邮轮保险">
<meta name="description" content="银盾保险在线,提供全球多家知名保险公司产品网上投保,甄选并推荐最适合您的保险产品。" />
<title>银盾保险经纪</title>
<base href="/">
<link rel="shortcut icon" href="https://www.ydinsurance.cn/wp-content/uploads/2018/04/favicon.gif"
type="image/x-icon" />
<link rel="stylesheet" href="./assets/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="./assets/LCalendar/LCalendar.css">
<link rel="stylesheet" href="./assets/laydate/theme/default/laydate.css">
</head>
<body>
<app-root>
<div id="adv"
style="width: 100%;min-width: 320px;
max-width: 640px;overflow: hidden;position: fixed;top: 0;right: 0; bottom: 0;left: 0;background: #fff;margin: auto;">
<div class="content" style="text-align: center;width: 60%;margin: 45% auto 0 auto;">
<img style="width:100%;margin-bottom: 15px;" src="assets/images/login_logo.png">
<div class="loadingContent">
<span style="letter-spacing: 4px;">DYD</span>
<span style="letter-spacing: 4px;">·</span>
<span style="letter-spacing: 4px;">Digital Yindun</span>
</div>
<!-- <div style="margin-top: 45%;">欢迎回家,先喝碗鸡汤</div> -->
</div>
<div id="content" style="font-size:18px;margin-top: 30%;text-align: center;padding: 0 15px;">
</div>
</div>
</app-root>
<!-- <div class="loadingBox" id="loading"
style="display: flex;justify-content: center;align-items: center;position: fixed;left:40%;top:40%;width:100%;height: 100%;">
<img src="assets/images/loading.gif" alt="loading" class="img-responsive" style="width: 68px;height: 68px;">
</div> -->
<div>
</div>
<script src="./assets/js/jquery.min.js"></script>
<script src="./assets/js/qrcode.js"></script>
<!--<script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>-->
<script src="https://res2.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
<script src="./assets/LCalendar/LCalendar.js"></script>
<script src="./assets/laydate/laydate.js"></script>
<script type="text/javascript">
var api = 'https://' + window.location.host;
// var api = 'https://mdev.zuihuibi.cn';
function getToken() {
$.ajax({
type: "POST",
url: api + '/api/authorize/obtainToken',
contentType: "application/json",
data: JSON.stringify({
ticket: 'life'
}),
async: false,
success: function (res) {
token = res.data.token
}
})
return token;
}
var token = getToken();
const initialize = function () {
let loading = document.getElementById("adv");
loading.style.display = 'block';
document.onreadystatechange = function () {
if (document.readyState == "complete") {
setTimeout(() => {
loading.style.display = 'none';
}, 4000)
}
}
}
//页面刷新的时候不出现
if (window.name == "") {
window.name = "isReload"; // 在首次进入页面时我们可以给window.name设置一个固定值
initialize();
} else if (window.name == "isReload") {
let loading = document.getElementById("adv");
loading.style.display = 'none';
}
//用于去除alert的url
window.alert = function (name) {
var iframe = document.createElement("IFRAME");
iframe.style.display = "none";
iframe.setAttribute("src", 'data:text/plain,');
document.documentElement.appendChild(iframe);
window.frames[0].window.alert(name);
iframe.parentNode.removeChild(iframe);
}
function getknowledgeQry() {
$.ajax({
type: "POST",
url: api + '/api/metadata/knowledgeQry',
contentType: "application/json",
data: JSON.stringify({
tagId: 35
}),
async: false,
headers: { "X-Authorization": token },
success: function (res) {
if (res['success']) {
let content = String(res['data']['knowledge']['content']);
if (content.indexOf(',') != -1) {
const idx = content.indexOf(',')
content = content.split(',')
// const newStr = ('<span class="iconfont icon-shangyinhao"></span>' + content[0] + ',<br/>' + content[1]).toString()
const newStr = ('' + content[0] + ',<br/>' + content[1]).toString()
$('#content').html(newStr)
} else if (content.indexOf('') != -1) {
const idx = content.indexOf('')
content = content.split('')
// const newStr = ('<span class="iconfont icon-shangyinhao"></span>' + content[0] + ',<br/>' + content[1]).toString()
const newStr = ('' + content[0] + '<br/>' + content[1]).toString()
$('#content').html(newStr)
} else {
$('#content').html('' + content)
}
}
}
})
}
getknowledgeQry();
</script>
</body>
</html>
\ No newline at end of file
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../coverage/ydLife'),
reports: ['html', 'lcovonly', 'text-summary'],
fixWebpackSourcePaths: true
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false,
restartOnFileChange: true
});
};
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
/**
* This file includes polyfills needed by Angular and is loaded before the app.
* You can add your own extra polyfills to this file.
*
* This file is divided into 2 sections:
* 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
* 2. Application imports. Files imported after ZoneJS that should be loaded before your main
* file.
*
* The current setup is for so-called "evergreen" browsers; the last versions of browsers that
* automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
* Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
*
* Learn more in https://angular.io/guide/browser-support
*/
/***************************************************************************************************
* BROWSER POLYFILLS
*/
/** IE10 and IE11 requires the following for NgClass support on SVG elements */
// import 'classlist.js'; // Run `npm install --save classlist.js`.
/**
* Web Animations `@angular/platform-browser/animations`
* Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
* Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
*/
// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
/**
* By default, zone.js will patch all possible macroTask and DomEvents
* user can disable parts of macroTask/DomEvents patch by setting following flags
* because those flags need to be set before `zone.js` being loaded, and webpack
* will put import in the top of bundle, so user need to create a separate file
* in this directory (for example: zone-flags.ts), and put the following flags
* into that file, and then add the following code before importing zone.js.
* import './zone-flags.ts';
*
* The flags allowed in zone-flags.ts are listed here.
*
* The following flags will work for all browsers.
*
* (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
* (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
* (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
*
* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
* with the following flag, it will bypass `zone.js` patch for IE/Edge
*
* (window as any).__Zone_enable_cross_context_check = true;
*
*/
/***************************************************************************************************
* Zone JS is required by default for Angular itself.
*/
import 'zone.js/dist/zone'; // Included with Angular CLI.
/***************************************************************************************************
* APPLICATION IMPORTS
*/
/* You can add global styles to this file, and also import other style files */
html, body {
height: 100%;
width: 100%;
min-height: 100%;
min-width: 320px;
max-width: 640px;
margin: 0 auto;
position: relative;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
SimSun, sans-serif;
font-variant-numeric: tabular-nums;
overflow-x: hidden;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
ol, ul {
margin-top: 0;
margin-bottom: 0;
}
.h1, .h2, .h3, h1, h2, h3 {
margin: 0;
line-height: inherit;
}
p {
margin: 0;
}
.img-responsive {
max-width: 100%;
height: auto;
width: 100%;
}
input::placeholder {
font-size: 14px;
}
.announcementItem {
a {
color: #000 !important;
}
}
.summaryBox .summaryContent {
display: flex;
align-items: baseline;
justify-content: flex-start;
width: 100%;
margin-right: 15px;
line-height: 1.2;
margin-top: 3px;
}
.summaryIcon .iconfont {
color: #11998e;
}
.summaryBox .summaryContent .summaryLabel {
margin-left: 5px;
line-height: 1;
font-size: 14px;
}
.summaryBox .summaryContent:nth-child(2n) {
margin-right: 0;
}
.weui-dialog__btn{
background: red;
color: #fff;
border-radius: 10px;
padding: 5px 12px;
font-weight: normal;
}
.borderBottom:after, .borderTop:after {
position: absolute;
left: 0;
bottom: 0;
content: "";
width: 100%;
height: 1px;
-webkit-transform: scaleY(.5);
transform: scaleY(.5);
background-color: #dcdcdc;
}
.loadingContent{
font-size:14px;
font-family: '微软雅黑';
position: relative;
}
.loadingContent:before {
content: " ";
position: absolute;
left: 3px;
top: -5px;
width: 98%;
height: 1px;
border-top: 1px solid #000000 !important;
transform: scaleY(0.5);
}
.icon-shangyinhao{
position: relative;
top: -8px;
}
@keyframes slowUp {
0% {
-webkit-transform: translateY(100%);
transform: translateY(100%)
}
100% {
-webkit-transform: translateY(0);
transform: translateY(0)
}
}
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
import 'zone.js/dist/zone-testing';
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
declare const require: any;
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"types": []
},
"exclude": [
"test.ts",
"**/*.spec.ts"
]
}
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/spec",
"types": [
"jasmine",
"node"
]
},
"files": [
"test.ts",
"polyfills.ts"
],
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
}
{
"extends": "../tslint.json",
"rules": {
"directive-selector": [
true,
"attribute",
"app",
"camelCase"
],
"component-selector": [
true,
"element",
"app",
"kebab-case"
]
}
}
/* SystemJS module definition */
declare var module: NodeModule;
declare var LCalendar: any;
interface NodeModule {
id: string;
}
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"module": "esnext",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"importHelpers": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
}
}
{
"extends": "tslint:recommended",
"rulesDirectory": [
"codelyzer"
],
"rules": {
"array-type": false,
"arrow-parens": false,
"deprecation": {
"severity": "warn"
},
"import-blacklist": [
true,
"rxjs/Rx"
],
"interface-name": false,
"max-classes-per-file": false,
"max-line-length": [
true,
140
],
"member-access": false,
"member-ordering": [
true,
{
"order": [
"static-field",
"instance-field",
"static-method",
"instance-method"
]
}
],
"no-consecutive-blank-lines": false,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-empty": false,
"no-inferrable-types": [
true,
"ignore-params"
],
"no-non-null-assertion": true,
"no-redundant-jsdoc": true,
"no-switch-case-fall-through": true,
"no-use-before-declare": true,
"no-var-requires": false,
"object-literal-key-quotes": [
true,
"as-needed"
],
"object-literal-sort-keys": false,
"ordered-imports": false,
"quotemark": [
true,
"single"
],
"trailing-comma": false,
"no-output-on-prefix": true,
"use-input-property-decorator": true,
"use-output-property-decorator": true,
"use-host-property-decorator": true,
"no-input-rename": true,
"no-output-rename": true,
"use-life-cycle-interface": true,
"use-pipe-transform-interface": true,
"component-class-suffix": true,
"directive-class-suffix": true
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
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