first commit

This commit is contained in:
编码猿
2024-09-27 01:32:49 +08:00
commit 28ebe05a64
7399 changed files with 1174529 additions and 0 deletions

1
moehu/moehu_admin/.pydio Normal file
View File

@@ -0,0 +1 @@
6609d405-8ad0-44e8-83f7-6534eb4bf75b

View File

View File

@@ -0,0 +1,9 @@
/*
* Copyright (c) 2020. bmy
*/
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

View File

@@ -0,0 +1 @@
55d0c799-794b-47f5-b30f-2aeda081f5f4

View File

@@ -0,0 +1 @@
540faacb-8c40-430c-858c-b9cd6218e349

View File

@@ -0,0 +1,94 @@
/*
* Copyright (c) 2020. bmy
*/
module.exports = {
pageConfig: (name) => {
return `
import "@pageLess/${ name }.less";
import { Component } from 'vue-property-decorator';
import { ${ name }Logic } from "@logic/page/${ name }.logic";
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import { Route, RawLocation } from 'vue-router';
@Component
export default class ${ name } extends VueCustomize {
private logic: ${ name }Logic<${ name }> = new ${ name }Logic(this);
private RouterMeta: RouterMeta = {
title: '${ name }',
isLogin: true
};
public async created() {
await this.logic.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
return (
<div class="${ name }">
${ name }
</div>
)
}
}
`
},
logicConfig: (name) => {
return `
import { BaseLogic } from "@logic/Base.logic";
import { Autowired } from "@ann/Ioc.annotation";
import { Methods, VueCustomize } from "@logic/Base.type";
import { UserServiceImpl } from "@impl/User.service.impl";
export class ${ name }Logic<T extends VueCustomize> extends BaseLogic implements Methods {
@Autowired
public readonly UserServiceImpl!: UserServiceImpl;
constructor(_: T) {
super();
this._ = _;
}
public async StartUp(): Promise<void> {
}
}
`
},
serviceConfig: (name) => {
return `
export interface ${ name }Service {
IndexClass(params: object): Promise<any>;
}
`
},
implPathConfig: (name) => {
return `
import { ${ name }Service } from "@service/${ name }.service";
import { Injectable } from "@ann/Ioc.annotation";
import { GET } from "@ann/Http.annotation";
@Injectable()
export class ${ name }ServiceImpl implements ${ name }Service {
@GET({ useHandle: false })
public async IndexClass(params: object): Promise<any> { }
}
`
},
lessConfig: (name) => {
return `
@import "../mixin/index";
.${ name } {
}
`
}
}

105
moehu/moehu_admin/bin/tinit Executable file
View File

@@ -0,0 +1,105 @@
#!/usr/bin/env node
const { program } = require('commander');
const packageConfig = require("../package.json");
const fs = require("fs");
const path = require('path');
const Config = require("./config");
var isWin = /^win/.test(process.platform);
const RootPath = process.cwd();
program
.requiredOption('-t, --file-type <type>', '文件类型: [pagelogicserviceimplless]')
.option('-n, --file-name <name>', '被创建的文件名称')
.option('-i, --is-create <is>', '是否为 -t 参数自动创建相关文件类型', false);
program.version(packageConfig.version, '-v, --version', '显示当前的版本');
program.parse(process.argv);
// 存储终端的参数
let programOptions = program.opts();
let OtherFileType = program.parse(process.argv).args
// tsx 页面路径
let PagePath = isWin ? `${RootPath}\\src\\application\\page\\${UpperCase(programOptions.fileName)}.tsx` :`${RootPath}/src/application/page/${UpperCase(programOptions.fileName)}.tsx`;
// logic 页面路径
let LogicPath = isWin ? `${RootPath}\\src\\application\\logic\\page\\${UpperCase(programOptions.fileName)}.logic.ts` : `${RootPath}/src/application/logic/page/${UpperCase(programOptions.fileName)}.logic.ts`;
// service 页面路径
let ServicePath = isWin ? `${RootPath}\\src\\core\\service\\${UpperCase(programOptions.fileName)}.service.ts` : `${RootPath}/src/core/service/${UpperCase(programOptions.fileName)}.service.ts`;
// Impl 页面路径
let ImplPath = isWin ? `${RootPath}\\src\\core\\service\\impl\\${UpperCase(programOptions.fileName)}.service.impl.ts` : `${RootPath}/src/core/service/impl/${UpperCase(programOptions.fileName)}.service.impl.ts`;
// Less 页面路径
let LessPath = isWin ? `${RootPath}\\src\\application\\assets\\less\\page\\${UpperCase(programOptions.fileName)}.less` : `${RootPath}/src/application/assets/less/page/${UpperCase(programOptions.fileName)}.less`;
// 需要创建的文件类型
let FileList = ['page', 'logic', 'service', 'impl', 'less'];
// 是否需要为 controller 联合创建所有文件
if (programOptions.isCreate) {
FileList.forEach(val => replaceTplText(val));
console.log("成功创建文件...");
} else {
// 循环创建多个文件
if (OtherFileType.length !=0 ) {
[...OtherFileType, programOptions.fileType].forEach(v => replaceTplText(v))
} else {
replaceTplText(programOptions.fileType)
}
console.log("成功创建文件...");
}
/**
* 替换模板的内容,并将内容写入文件。
*/
let FileText = ""
function replaceTplText (action) {
switch (action) {
case 'page':
fs.writeFileSync(PagePath, Config.pageConfig(UpperCase(programOptions.fileName)));
break;
case 'logic':
fs.writeFileSync(LogicPath, Config.logicConfig(UpperCase(programOptions.fileName)));
break;
case 'service':
fs.writeFileSync(ServicePath, Config.serviceConfig(UpperCase(programOptions.fileName)));
break;
case 'impl':
fs.writeFileSync(ImplPath, Config.implPathConfig(UpperCase(programOptions.fileName)));
break;
case 'less':
fs.writeFileSync(LessPath, Config.lessConfig(UpperCase(programOptions.fileName)));
break;
default:
break
}
}
/**
* 单词首字母大写
* @param str
* @returns {void | string | *}
* @constructor
*/
function UpperCase (str) {
return str.replace(str[0],str[0].toUpperCase())
}
/**
* 读取文件内容
* @param path
* @returns {*}
* @constructor
*/
function GetFileText (path) {
return (fs.readFileSync( pathJoin(path), 'utf-8' )).toString();
}
/**
* 拼接路径
* @param paths
* @returns {string}
*/
function pathJoin (paths) {
return path.join(__dirname, paths)
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2020. bmy
*/
const gulp = require('gulp');
const exec = require('child_process').exec;
/**
* 执行 vue-cli-service route 命令进行路由编译
*/
gulp.task('AutoCompileRouter', function (cb) {
return exec('npm run route', (err, stdout, stderr) => {
if (err) {
console.log("编译失败: ", err);
cb(err)
} else {
console.log("编译成功");
}
});
});
/**
* 监听 page 所有文件的修改,自动触发 AutoCompileRouter 任务
*/
gulp.task('auto', function () {
gulp.watch('src/application/page/**/*', gulp.parallel('AutoCompileRouter'));
});
gulp.task('default', gulp.parallel('auto'));

13
moehu/moehu_admin/move.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
# 需要被复制的文件
form_path=dist/
# 被复制去的地方
to_path=/Users/bmy/Desktop/moehu/moehu-backend/static/admin
cp -R ${form_path} ${to_path}
echo "打包成功..."
echo "已复制到后端静态资源文件夹..."

30150
moehu/moehu_admin/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,56 @@
{
"name": "tsx-vue-class-api",
"version": "1.1.0",
"private": true,
"scripts": {
"start": "concurrently \"npm run route && npm run serve\" \"gulp\" ",
"serve": "cross-env NODE_ENV=dev vue-cli-service serve",
"build": "cross-env NODE_ENV=production vue-cli-service build --report-json",
"route": "vue-cli-service route",
"analyzer": "webpack-bundle-analyzer ./dist/report.json",
"online": "serve -s ./dist"
},
"bin": {
"tinit": "./bin/tinit"
},
"dependencies": {
"axios": "^0.21.1",
"core-js": "^3.6.5",
"element-ui": "^2.15.2",
"vue": "^2.6.11",
"vue-class-component": "^7.2.3",
"vue-property-decorator": "^8.4.2",
"vue-router": "^3.2.0",
"vuex": "^3.4.0",
"vuex-class": "^0.3.2",
"isarray": "^2.0.5"
},
"devDependencies": {
"@types/isarray": "^2.0.0",
"@babel/generator": "^7.11.4",
"@babel/parser": "^7.11.4",
"@babel/types": "^7.11.0",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-typescript": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-polyfill": "^6.26.0",
"commander": "^6.2.0",
"compression-webpack-plugin": "^5.0.1",
"es6-promise": "^4.2.8",
"glob": "^7.1.3",
"gulp": "^4.0.2",
"less": "^3.0.4",
"less-loader": "^5.0.0",
"pify": "^4.0.1",
"reflect-metadata": "^0.1.13",
"serve": "^14.2.1",
"typescript": "~3.9.3",
"uglifyjs-webpack-plugin": "^2.2.0",
"vue-cli-plugin-tsx-autorouter": "^1.3.8",
"vue-template-compiler": "^2.6.11",
"webpack-bundle-analyzer": "^3.8.0",
"yamljs": "^0.3.0"
}
}

View File

@@ -0,0 +1 @@
80c1fe48-83e8-4d0e-93ef-09dd797f83ba

View File

@@ -0,0 +1 @@
2d531665-9a96-4802-97bf-000766273abd

View File

@@ -0,0 +1 @@
cdcb6e7e-d20d-4a44-996f-9894d2269d49

View File

@@ -0,0 +1,326 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 723.8 427.5" style="enable-background:new 0 0 723.8 427.5;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;stroke:#14223C;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st1{fill:#E5E5E5;stroke:#14223C;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st2{fill:none;stroke:#14223C;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st3{fill:#E5E5E5;}
.st4{fill:none;stroke:#E5E5E5;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st5{fill:#BDBDBD;}
.st6{fill:#CDCDCD;}
.st7{fill:#DEDEDE;}
.st8{fill:#EEEEEE;}
.st9{fill:#14223C;}
.st10{fill:#ACACAC;}
.st11{fill:none;stroke:#E5E5E5;stroke-width:2;stroke-miterlimit:10;}
.st12{fill:none;stroke:#DBDBDB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st13{opacity:0.3;}
.st14{opacity:0.3;fill:#ACACAC;enable-background:new ;}
.st15{opacity:0.3;fill:#E5E5E5;enable-background:new ;}
.st16{opacity:0.17;fill:#ACACAC;enable-background:new ;}
.st17{fill:none;stroke:#FFFFFF;stroke-linecap:square;stroke-miterlimit:10;}
</style>
<title>Designer</title>
<g>
<g id="Layer_2_1_">
<g id="Layer_1-2">
<path class="st0" d="M394.8,397.1c1.3,0.7,1.8,2.2,1.1,3.5c-0.2,0.4-0.5,0.7-0.9,1l-38.2,24.8l0,0l-2.1-3.3l-20.8-32.2l-5.3-8.1
l-39.5-61l-1.2-1.8L273,297l-0.1-0.2L262.7,281l39.2,2.3l1,2l17.4,36.5l24.6,51.6l4.2,8.8l6.3,13.2c3.9,8.6,12.1,8,19,4.8
l7.5-3.3c2.7-1.2,5.7-1.6,8.6-1.1C392,396,393.4,396.4,394.8,397.1L394.8,397.1z"/>
<polygon class="st1" points="349,382.1 333.8,390.9 328.5,382.8 344.8,373.3 "/>
<path class="st2" d="M371.9,394.9"/>
<line class="st2" x1="351.2" y1="386.8" x2="347.6" y2="389.2"/>
<line class="st2" x1="353.2" y1="392.3" x2="349.7" y2="394.3"/>
<line class="st2" x1="355.8" y1="397" x2="352.3" y2="399"/>
<path class="st2" d="M395,401.5l-38.3,24.8l-2.1-3.3l40.1-26l0,0c1.3,0.6,1.8,2.2,1.1,3.5C395.7,401,395.4,401.3,395,401.5z"/>
<rect x="128.8" y="246.7" class="st3" width="357.6" height="9.5"/>
<path class="st4" d="M447.1,224.4v90.6c0,6.1,4.9,11,11,11l0,0h107.8c6.1,0,11-4.9,11-11l0,0"/>
<path class="st4" d="M564.8,285.7h46.6c1.1,0,2,0.9,2,2v24.8c0,1.1-0.9,2-2,2h-46.6c-1.1,0-2-0.9-2-2v-24.8
C562.8,286.6,563.7,285.7,564.8,285.7z"/>
<path class="st4" d="M603.2,292.3h3.6c0.6,0,1,0.4,1,1v13.5c0,0.6-0.4,1-1,1h-3.6c-0.6,0-1-0.4-1-1v-13.5
C602.2,292.8,602.6,292.3,603.2,292.3z"/>
<path class="st4" d="M592,292.3h3.6c0.6,0,1,0.4,1,1v13.5c0,0.6-0.4,1-1,1H592c-0.6,0-1-0.4-1-1v-13.5
C591,292.8,591.4,292.3,592,292.3z"/>
<path class="st4" d="M585.1,304.4L585.1,304.4l-6-10.6l0,0c-0.5-1.2-2-1.8-3.2-1.2c-0.6,0.3-1,0.7-1.3,1.3l-5.9,10.5l0,0
c-0.2,0.3-0.2,0.7-0.2,1.1c0,1.4,1.1,2.5,2.5,2.5l0,0h12c1.3,0,2.4-1.1,2.4-2.4C585.3,305.1,585.2,304.7,585.1,304.4L585.1,304.4
z"/>
<line class="st4" x1="576.9" y1="314.9" x2="576.9" y2="307.9"/>
<path class="st1" d="M368.9,90h148.5c1.2,0,2.2,1,2.2,2.2v105.5c0,1.2-1,2.2-2.2,2.2H368.9c-1.2,0-2.2-1-2.2-2.2V92.2
C366.7,91,367.7,90,368.9,90z"/>
<path class="st1" d="M356.9,90h154.5c1.2,0,2.2,1,2.2,2.2v105.5c0,1.2-1,2.2-2.2,2.2H356.9c-1.2,0-2.2-1-2.2-2.2V92.2
C354.7,91,355.7,90,356.9,90z"/>
<path class="st0" d="M505.7,191h-142c-1.1,0-2-0.9-2-2v-89c0-1.1,0.9-2,2-2h142c1.1,0,2,0.9,2,2v89
C507.7,190.1,506.8,191,505.7,191z"/>
<path class="st3" d="M382.8,115.6h57.5c0.8,0,1.5,0.7,1.5,1.5v40.7c0,0.8-0.7,1.5-1.5,1.5h-57.5c-0.8,0-1.5-0.7-1.5-1.5v-40.7
C381.4,116.3,382,115.6,382.8,115.6z"/>
<path class="st0" d="M377.8,110.5h57.5c0.8,0,1.5,0.7,1.5,1.5v40.7c0,0.8-0.7,1.5-1.5,1.5h-57.5c-0.8,0-1.5-0.7-1.5-1.5V112
C376.3,111.2,376.9,110.5,377.8,110.5z"/>
<path class="st1" d="M376.3,112v3.6h60.4V112c0-0.8-0.7-1.5-1.5-1.5h-57.5C376.9,110.5,376.3,111.2,376.3,112z"/>
<rect x="381.4" y="121.3" class="st5" width="9.7" height="17"/>
<rect x="395" y="121.3" class="st6" width="9.7" height="17"/>
<rect x="408.5" y="121.3" class="st7" width="9.7" height="17"/>
<rect x="422.1" y="121.3" class="st8" width="9.7" height="17"/>
<rect x="381.4" y="142.3" class="st8" width="50.4" height="7"/>
<path class="st3" d="M435,133.9h57.5c0.8,0,1.5,0.7,1.5,1.5v40.7c0,0.8-0.7,1.5-1.5,1.5H435c-0.8,0-1.5-0.7-1.5-1.5v-40.7
C433.5,134.6,434.2,133.9,435,133.9z"/>
<path class="st0" d="M429.9,128.8h57.5c0.8,0,1.5,0.7,1.5,1.5V171c0,0.8-0.7,1.5-1.5,1.5h-57.5c-0.8,0-1.5-0.7-1.5-1.5v-40.7
C428.4,129.5,429.1,128.8,429.9,128.8z"/>
<path class="st1" d="M428.4,130.3v3.6h60.4v-3.6c0-0.8-0.7-1.5-1.5-1.5h-57.5C429.1,128.8,428.4,129.5,428.4,130.3z"/>
<rect x="433.5" y="139.6" class="st5" width="9.7" height="17"/>
<rect x="447.1" y="139.6" class="st6" width="9.7" height="17"/>
<rect x="460.7" y="139.6" class="st7" width="9.7" height="17"/>
<rect x="474.2" y="139.6" class="st8" width="9.7" height="17"/>
<rect x="433.5" y="160.6" class="st8" width="50.4" height="7"/>
<rect x="416.9" y="200" class="st1" width="47" height="33.7"/>
<path class="st1" d="M405.7,233.7h52V200h-47v28.8C410.7,231.5,408.5,233.7,405.7,233.7C405.7,233.7,405.7,233.7,405.7,233.7z"/>
<rect x="410.7" y="200" class="st9" width="47" height="6.8"/>
<path class="st2" d="M405.7,233.7h52V200h-47v28.8C410.7,231.5,408.5,233.7,405.7,233.7C405.7,233.7,405.7,233.7,405.7,233.7z"/>
<polygon class="st0" points="239.4,113.5 215.7,132.9 213.5,130.7 236.7,110.2 "/>
<rect x="327.8" y="226.1" class="st0" width="98.5" height="7.6"/>
<path class="st0" d="M359.4,124.8l-11.8,10.8l0.2,0.1l6,5.1l0,0l0.3,0.3l0.2,0.2c1.8,1.7,1.9,4.5,0.4,6.3l-0.3,0.3l-5.1,6
c-1.9,2.2-4.7,3.3-7.6,2.8l-4.2,5.2l-0.3,0.3l-2.7,3.3l-28.2,34.8c-3.3,4.1-8.8,5.6-13.8,3.9l-55.2-19.3c-4.6-1.7-7-6.7-5.3-11.3
s6.7-7,11.3-5.3l0,0l52.4,18.6l28.5-30.7l2.9-3.1l4.2-4.5c5.2-4.9-0.7-3.7,0-5l13.4-28.3c0.7-1.4,2.3-1.9,3.7-1.2
c1,0.5,1.6,1.5,1.5,2.6c0,0.4-0.1,0.8-0.3,1.1l-6.8,14l-0.6,1.3l1-0.9l12.3-11.3c1.1-1,2.9-0.9,3.9,0.2c0.5,0.5,0.7,1.2,0.7,1.9
C360.2,123.6,359.9,124.3,359.4,124.8z"/>
<path class="st0" d="M317.5,104l12.5-11c1.8-1.6,4.5-1.4,6.1,0.4l47.8,54c1.6,1.8,1.4,4.5-0.4,6.1l-12.5,11
c-1.8,1.6-4.5,1.4-6.1-0.4l-47.8-54C315.6,108.3,315.7,105.6,317.5,104z"/>
<rect x="324" y="102.2" transform="matrix(0.7491 -0.6625 0.6625 0.7491 11.8717 246.6514)" class="st10" width="15" height="11"/>
<rect x="333.4" y="112.8" transform="matrix(0.7491 -0.6625 0.6625 0.7491 7.1974 255.5444)" class="st5" width="15" height="11"/>
<rect x="342.8" y="123.4" transform="matrix(0.7491 -0.6625 0.6625 0.7491 2.5173 264.4269)" class="st6" width="15" height="11"/>
<rect x="352.2" y="134" transform="matrix(0.7491 -0.6625 0.6625 0.7491 -2.1603 273.3162)" class="st7" width="15" height="11"/>
<rect x="361.6" y="144.6" transform="matrix(0.7491 -0.6625 0.6625 0.7491 -6.8412 282.2117)" class="st8" width="15" height="11"/>
<path class="st0" d="M264.1,157.8l-5.6,16.2c-1.6,4.7-17.3,9.9-22,8.3l3.3-14.5c0,0,5.3,1.4,6.8-2.7l3.5-10.1"/>
<rect x="499.4" y="246.7" class="st1" width="26" height="179.7"/>
<rect x="423.7" y="246.7" class="st0" width="75.8" height="179.7"/>
<rect x="102.8" y="246.7" class="st1" width="26" height="179.7"/>
<rect x="89.8" y="246.7" class="st0" width="13" height="179.7"/>
<rect x="39.8" y="233.7" class="st0" width="510" height="13"/>
<rect x="549.8" y="233.7" class="st1" width="65.9" height="13"/>
<polygon class="st0" points="231.2,241.4 243.6,229.1 235.7,245.9 "/>
<path class="st3" d="M200.7,308.2h24.7l0,0l0,0c0,6.1-4.9,11-11,11h-2.7C205.6,319.2,200.7,314.3,200.7,308.2L200.7,308.2
L200.7,308.2z"/>
<rect x="207.1" y="308.2" class="st3" width="11.7" height="108.5"/>
<path class="st3" d="M262.8,426.4L262.8,426.4L262.8,426.4h-99.5l0,0l0,0c0-6.5,5.2-11.7,11.7-11.7H251
C257.5,414.7,262.8,419.9,262.8,426.4C262.8,426.4,262.8,426.4,262.8,426.4z"/>
<path class="st3" d="M185.2,321.5h14.7c1.2,0,2.2,1,2.2,2.2v0c0,1.2-1,2.2-2.2,2.2h-14.7c-1.2,0-2.2-1-2.2-2.2v0
C183,322.5,184,321.5,185.2,321.5z"/>
<line class="st11" x1="192.5" y1="323.7" x2="210" y2="323.7"/>
<path class="st1" d="M300.2,296.9c0,0-100.9,1.2-101.4,1.1c-1-0.1-2-0.3-2.9-0.6c-2.5-0.9-4.7-2.4-6.6-4.3
c-11-10.9-11.3-28.6-1.2-40.3c3.3-3.9,6.6-7.5,9-9.8l5.3-5.6c6.6-6.9,10.8-15.8,11.9-25.4c0.5-4.8,1.9-9.4,3.9-13.8l11.4-24
c2.6-5.5,8.9-8.1,14.6-6c7.3,2.7,14.4,5.3,14.4,5.3c-0.5,1.7-0.8,3.5-0.8,5.3c0,4.2,1.3,8.3,3.7,11.8l0.6,12.3
c0.4,9-4.2,17.6-12,22.1c-4.2,2.5-7.6,6.2-9.7,10.7l-0.3,0.6L238,241l-2.3,4.9l-1.6,3.5c-1.1,2.5,0,5.5,2.5,6.6
c0.3,0.1,0.6,0.2,0.9,0.3l11.4,2.7l41.1,12c3.4,0.8,6.5,2.7,8.8,5.3c0.4,0.4,0.7,0.9,1.1,1.4l0.2,0.3c1.5,2.2,2.4,4.6,2.8,7.2
C303.3,289.3,302.4,293.5,300.2,296.9z"/>
<path class="st1" d="M231.3,231.7"/>
<path class="st12" d="M238.6,178.6l-11.4,23.9c-1.6,3.4-2.6,6.9-3,10.6c-1.3,11.7-6.4,22.6-14.6,31.1l-5.3,5.6l-0.2,0.2
c-0.2,0.2-0.7,0.7-1.3,1.3c-6.7,7.1-8.4,17.5-4.3,26.4c2.6,5.5,7.5,10,16.5,10c15,0,41.4-0.1,58.6-0.2c5.1,0,9.2,4.1,9.3,9.2
c0,0,0,0,0,0.1l0,0"/>
<path class="st0" d="M258.5,173.5c0.1-0.3,0.2-0.7,0.3-1"/>
<path class="st0" d="M258.5,173.5"/>
<ellipse transform="matrix(0.5122 -0.8589 0.8589 0.5122 14.6302 256.638)" class="st1" cx="233.2" cy="115.4" rx="16.2" ry="16.2"/>
<path class="st1" d="M227.2,104.8c1.8-1,3.9-1.6,6-1.6"/>
<path class="st1" d="M233.2,127.6"/>
<path class="st1" d="M282.2,116.7l-16.4,16.4h-9.6c-2.7,0-4.8,2.2-4.8,4.8c0,2.7,2.2,4.8,4.8,4.8l-12.8,12.8
c-10.5-10.9-10.2-28.3,0.7-38.9C254.7,106.5,271.6,106.5,282.2,116.7z"/>
<path class="st1" d="M260.5,112.9c0.8-0.1,1.6-0.1,2.4-0.1"/>
<path class="st1" d="M260.5,112.9"/>
<path class="st1" d="M257.4,113.4"/>
<path class="st1" d="M248,118.2c0.8-0.6,1.6-1.2,2.4-1.7c2.2-1.4,4.6-2.4,7.1-3"/>
<path class="st0" d="M290.4,136.3c0,15.2-12.4,27.5-27.5,27.4c-7.3,0-14.3-2.9-19.5-8.1l12.8-12.8c-2.7,0-4.8-2.2-4.8-4.8
c0-2.7,2.2-4.8,4.8-4.8h9.6l16.4-16.4C287.5,121.9,290.4,128.9,290.4,136.3L290.4,136.3z"/>
<polyline class="st2" points="294.4,144.5 294.4,133.1 294.4,124.8 "/>
<line class="st2" x1="294.4" y1="133.1" x2="265.8" y2="133.1"/>
<path class="st2" d="M245.6,317.3"/>
<path class="st2" d="M90.8,321.7"/>
<path class="st2" d="M238,312.9"/>
<path class="st0" d="M267.4,422.4c0.8,1.3,0.3,2.9-1,3.7c-0.4,0.2-0.9,0.4-1.4,0.4l-45.4-0.1l0.1-0.1l1.3-3.9l12.3-36.1l3.3-9.7
l18.7-54.9l8.2-24.5l36.7-0.3l-43.3,79.7l-5.3,9.7l-8.7,15.9c-2.2,3.9-0.8,8.8,3.1,11c0.6,0.4,1.3,0.6,2,0.8l0.7,0.1l8.1,1.3
C261.2,416.1,265.1,418.7,267.4,422.4L267.4,422.4z"/>
<rect x="256.2" y="142.8" class="st0" width="3.8" height="12.8"/>
<path class="st0" d="M241.6,233.2l-1.4,3.3l-2,4.6L238,241l-29-12.7c1.4-2.5,2.5-5.1,3.4-7.9L241.6,233.2z"/>
<line class="st2" x1="643.2" y1="426.4" x2="689.1" y2="426.4"/>
<line class="st2" x1="46.1" y1="426.4" x2="636.2" y2="426.4"/>
<line class="st2" x1="694.2" y1="426.4" x2="698.2" y2="426.4"/>
<path class="st0" d="M342.3,150.8c1.9-1.9,2.5-4.8,1.5-7.3c-0.1-0.4-0.3-0.7-0.5-1.1l5.6-2.3c1.4-0.6,2.1-2.2,1.5-3.6
c-0.6-1.4-2.2-2.1-3.6-1.5c0,0,0,0,0,0l-11.7,4.8c-1.3,0.5-2.4,1.4-3.1,2.6c-1.8,2.8-1.2,6.6,1.3,8.7"/>
<path class="st2" d="M239.5,115.7c-0.9-0.2-1.8-0.6-2.5-1.1c-0.9-0.6-1.6-1.3-2.1-2.3c-0.5-0.8-0.8-1.7-1-2.7"/>
<polygon class="st0" points="212.6,133.8 215.7,132.9 213.5,130.7 "/>
<path class="st0" d="M259.6,96.2L237,114.6c-0.9-0.6-1.6-1.3-2.1-2.3l22-19.4c0.5-0.5,1.4-0.4,1.9,0.1c0,0,0,0,0,0l1,1.2
C260.2,94.8,260.2,95.7,259.6,96.2C259.6,96.2,259.6,96.2,259.6,96.2z"/>
<line class="st2" x1="255" y1="94.6" x2="257.5" y2="97.9"/>
<polygon class="st1" points="256.9,376.6 251.6,386.3 233.3,386.3 236.6,376.6 "/>
<path class="st2" d="M351.9,431.8"/>
<line class="st2" x1="248.3" y1="391.3" x2="243.1" y2="391.3"/>
<line class="st2" x1="245.3" y1="396.3" x2="240.1" y2="396.3"/>
<line class="st2" x1="243.3" y1="401.3" x2="238.1" y2="401.3"/>
<path class="st2" d="M295.7,186.9l-3.5,3.5"/>
<path class="st1" d="M391.9,233.7h-27.7c0-7.7,6.2-13.9,13.9-13.9S391.9,226,391.9,233.7C391.9,233.7,391.9,233.7,391.9,233.7z"
/>
<path class="st0" d="M352,222.9l34-9.2c1.4-0.4,2.8,0.5,3.2,1.9c0,0,0,0,0,0l0,0c0.4,1.4-0.5,2.8-1.8,3.1l-23.3,7L352,222.9z"/>
<path class="st0" d="M385.7,233.7h-38.8l-54.7-0.1h-1.3l-1.2-0.1c-1.6-0.3-3.1-1-4.3-2.1l-2.1-1.9l-44.8-39.7
c-3.6-3.2-3.9-8.8-0.7-12.5s8.8-3.9,12.5-0.7l41.1,38.2c1.7,1.5,3.8,2.5,6.1,2.7l48,5.6c2,0.3,4,0.2,6-0.4l11.7-3.1
c2.3-0.6,4.8-0.4,7,0.6l7.4,3.3c0.7,0.3,1.7,0.9,2.8,1.4c2.6,1.4,4.5,4,5.1,6.9L385.7,233.7z"/>
<line class="st2" x1="304" y1="218.5" x2="288.9" y2="216.8"/>
<path class="st1" d="M422.5,226.1h13l0,0v7.6l0,0h-20.6l0,0l0,0C414.9,229.5,418.3,226.1,422.5,226.1z"/>
<path class="st1" d="M496.5,233.7h40.7c3.1-1.8,4.2-5.7,2.5-8.9c-0.6-1-1.4-1.9-2.5-2.5h-40.7V233.7z"/>
<path class="st0" d="M482.2,233.7h25.3c3.1-1.8,4.2-5.7,2.5-8.9c-0.6-1-1.4-1.9-2.5-2.5h-25.3c3.1,1.8,4.2,5.7,2.5,8.9
C484,232.2,483.2,233.1,482.2,233.7L482.2,233.7z"/>
<path class="st1" d="M503.6,222.4h40.7c3.1-1.8,4.2-5.7,2.5-8.9c-0.6-1-1.4-1.9-2.5-2.5h-40.7V222.4z"/>
<path class="st0" d="M489.3,222.4h25.3c3.1-1.8,4.2-5.7,2.5-8.9c-0.6-1-1.4-1.9-2.5-2.5h-25.3c3.1,1.8,4.2,5.7,2.5,8.9
C491.2,220.9,490.4,221.8,489.3,222.4z"/>
<path class="st1" d="M258.6,306.6c-0.1,0.1-0.3,0.3-0.5,0.4c-1,0.8-2.2,1.2-3.4,1.2h-78.4c-1.3,0-2.6-0.1-3.8-0.4
c-7.3-1.5-13-7.4-14.3-14.8l-17.3-96.9c-0.5-3,1.4-5.8,4.4-6.4c0,0,0,0,0,0c0.3-0.1,0.7-0.1,1-0.1h21c0,0,15.2,107.6,21.2,107.6
h66.1c2.9-0.1,5.4,2.1,5.7,5v0.1C260.3,303.9,259.7,305.5,258.6,306.6z"/>
<path class="st0" d="M267.6,306.6c-0.1,0.1-0.3,0.3-0.5,0.4c-1,0.8-2.2,1.2-3.4,1.2h-66.4c-1.3,0-2.6-0.1-3.8-0.4
c-7.3-1.5-13-7.4-14.3-14.8l-17.3-96.9c-0.5-3,1.4-5.8,4.4-6.4c0,0,0,0,0,0c0.3-0.1,0.7-0.1,1-0.1c2.7,0,4.9,1.9,5.4,4.5
l15.3,85.7l0.2,0.9l1.1,6.2c1.1,5.9,6.2,10.2,12.2,10.2h62.1c2.9-0.1,5.4,2.1,5.7,5v0.1C269.4,303.9,268.8,305.5,267.6,306.6z"/>
<g class="st13">
<rect y="108.5" class="st14" width="160.9" height="37.2"/>
</g>
<rect class="st3" width="168.9" height="6"/>
<rect y="151.8" class="st3" width="160.9" height="6"/>
<rect x="4.5" y="17.1" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="25.8" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="34.6" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="43.4" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="52.2" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="60.9" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="69.7" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="78.5" class="st15" width="75.5" height="4.1"/>
<rect x="4.5" y="87.2" class="st15" width="75.5" height="4.1"/>
<rect x="88.4" y="17.1" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="25.8" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="34.6" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="43.4" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="52.2" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="60.9" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="69.7" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="78.5" class="st15" width="67.9" height="4.1"/>
<rect x="88.4" y="87.2" class="st15" width="67.9" height="4.1"/>
<rect y="12" class="st15" width="160.9" height="89.9"/>
<rect y="96.2" class="st15" width="160.9" height="5.6"/>
<path class="st3" d="M165.7,99.7V85c0-1.2,1-2.2,2.2-2.2l0,0c1.2,0,2.2,1,2.2,2.2v14.7c0,1.2-1,2.2-2.2,2.2l0,0
C166.7,101.9,165.7,100.9,165.7,99.7z"/>
<line class="st11" x1="167.9" y1="92.4" x2="167.9" y2="0"/>
<g class="st13">
<rect x="553.8" y="91.3" class="st14" width="160.9" height="54.4"/>
</g>
<rect x="553.8" class="st3" width="168.9" height="6"/>
<rect x="553.8" y="151.8" class="st3" width="160.9" height="6"/>
<rect x="558.3" y="17.1" class="st15" width="75.5" height="4.1"/>
<rect x="558.3" y="25.8" class="st15" width="75.5" height="4.1"/>
<rect x="558.3" y="34.6" class="st15" width="75.5" height="4.1"/>
<rect x="558.3" y="43.4" class="st15" width="75.5" height="4.1"/>
<rect x="558.3" y="52.2" class="st15" width="75.5" height="4.1"/>
<rect x="558.3" y="60.9" class="st15" width="75.5" height="4.1"/>
<rect x="558.3" y="69.7" class="st15" width="75.5" height="4.1"/>
<rect x="642.2" y="17.1" class="st15" width="68" height="4.1"/>
<rect x="642.2" y="25.8" class="st15" width="68" height="4.1"/>
<rect x="642.2" y="34.6" class="st15" width="68" height="4.1"/>
<rect x="642.2" y="43.4" class="st15" width="68" height="4.1"/>
<rect x="642.2" y="52.2" class="st15" width="68" height="4.1"/>
<rect x="642.2" y="60.9" class="st15" width="68" height="4.1"/>
<rect x="642.2" y="69.7" class="st15" width="68" height="4.1"/>
<rect x="553.8" y="12" class="st15" width="160.9" height="72.7"/>
<rect x="553.8" y="79" class="st15" width="160.9" height="5.6"/>
<path class="st3" d="M719.5,99.7V85c0-1.2,1-2.2,2.2-2.2l0,0c1.2,0,2.2,1,2.2,2.2v14.7c0,1.2-1,2.2-2.2,2.2l0,0
C720.4,101.9,719.5,100.9,719.5,99.7z"/>
<line class="st11" x1="721.6" y1="92.4" x2="721.6" y2="0"/>
<path class="st1" d="M265.1,426.4h-45.5l1.3-3.9h46.3l0,0c0.7,1.2,0.4,2.8-0.8,3.5C266.1,426.3,265.6,426.4,265.1,426.4z"/>
<polygon class="st1" points="337.1,162.2 334.4,165.5 324.2,156.2 327.1,153.1 "/>
<line class="st2" x1="231.6" y1="238.2" x2="235.1" y2="230.4"/>
<line class="st2" x1="239.7" y1="237.3" x2="236.7" y2="235.9"/>
<line class="st2" x1="147.2" y1="201.4" x2="156.2" y2="201.4"/>
<line class="st2" x1="147.9" y1="207.3" x2="156.9" y2="207.3"/>
<polygon class="st16" points="641.1,385.4 689.2,385.4 682.5,426.4 647.8,426.4 "/>
<rect x="637.7" y="374.9" class="st3" width="54.9" height="5.4"/>
<line class="st11" x1="665.1" y1="374.9" x2="665.1" y2="281.5"/>
<path class="st16" d="M686.3,341.9h11.2l0,0l0,0c0,9.1-7.4,16.5-16.5,16.5c0,0,0,0,0,0h-11.1l0,0l0,0
C669.9,349.3,677.2,341.9,686.3,341.9z"/>
<path class="st16" d="M660.4,358.4h-11.2c-9.1,0-16.5-7.4-16.5-16.5l0,0l0,0h11.2C653,341.9,660.4,349.3,660.4,358.4L660.4,358.4
L660.4,358.4L660.4,358.4z"/>
<path class="st16" d="M683.1,321.9h9l0,0l0,0c0,7.3-5.9,13.2-13.2,13.2l0,0h-9l0,0l0,0C669.9,327.8,675.8,321.9,683.1,321.9
L683.1,321.9z"/>
<path class="st16" d="M660.4,335.1h-9c-7.3,0-13.2-5.9-13.2-13.2l0,0l0,0l0,0h9C654.5,321.9,660.4,327.8,660.4,335.1L660.4,335.1
L660.4,335.1L660.4,335.1z"/>
<path class="st16" d="M679.1,305.8h6.3l0,0l0,0c0,5.1-4.1,9.3-9.3,9.3l0,0h-6.3l0,0l0,0C669.9,310,674,305.8,679.1,305.8
L679.1,305.8z"/>
<path class="st16" d="M660.4,315.1h-6.3c-5.1,0-9.3-4.1-9.3-9.3c0,0,0,0,0,0l0,0l0,0h6.3C656.3,305.8,660.4,310,660.4,315.1
C660.4,315.1,660.4,315.1,660.4,315.1L660.4,315.1L660.4,315.1z"/>
<path class="st16" d="M676,291.3h4.2l0,0l0,0c0,3.4-2.7,6.1-6.1,6.1l0,0h-4.2l0,0l0,0C669.9,294.1,672.6,291.3,676,291.3
L676,291.3z"/>
<path class="st16" d="M660.4,297.5h-4.2c-3.4,0-6.1-2.7-6.1-6.1v0l0,0l0,0h4.2C657.7,291.3,660.4,294.1,660.4,297.5L660.4,297.5
L660.4,297.5L660.4,297.5z"/>
<polygon class="st0" points="592.9,209 592.2,213.6 589,233.7 572.2,233.7 569,213.6 568.2,209 "/>
<path class="st1" d="M594.9,186.8v2.7c0,2.8-2.2,5-5,5h-0.7c-2.2,0-4.1,1.8-4.1,4.1V209H576v-4.5c0-1-0.8-1.8-1.8-1.9h-2.9
c-2.8,0-5-2.2-5-5v-2.9c0-1.7,1.4-3,3-3c1.7,0,3,1.4,3,3c0,1-0.1,1.9,0.9,1.9h1c1,0,1.8-0.9,1.8-1.9c0,0,0,0,0,0v-15.6
c0-2.4,1.7-4.4,4.1-4.7c2.5-0.2,4.7,1.6,5,4.1c0,0.1,0,0.3,0,0.4v8.3c0,0.7,0.5,1.2,1.2,1.2h0.7c1.1,0,2-0.8,2-1.8c0,0,0,0,0-0.1
c0-1.7,1.3-3,3-3c0.1,0,0.1,0,0.2,0C593.8,183.9,594.9,185.2,594.9,186.8z"/>
<polygon class="st0" points="592.9,209 592.2,213.6 569,213.6 568.2,209 "/>
<rect x="102.8" y="246.6" class="st3" width="26" height="9.5"/>
<path class="st17" d="M235.4,187.1"/>
<path class="st17" d="M221.3,221.9"/>
<path class="st0" d="M56.9,226.5H39.4c-2,0-3.6,1.6-3.6,3.6l0,0v4.9c0,2,1.4,3.6,3.4,3.8c2,0.1,3.7-1.4,3.8-3.4
c0-0.1,0-0.1,0-0.2v-1.5h15.2"/>
<path class="st0" d="M60.5,211.1H103c8.4,0,15.3,6.8,15.3,15.3l0,0v7.4l0,0H60.5l0,0V211.1L60.5,211.1z"/>
<path class="st0" d="M56.1,221.4H44.2v-15.2c0-1.2,1-2.2,2.2-2.2c0.5,0,1,0.2,1.4,0.5l8.2,6.6L56.1,221.4z"/>
<path class="st0" d="M64.9,221.4h11.8v-15.2c0-1.2-1-2.2-2.2-2.2c-0.5,0-1,0.2-1.4,0.5l-8.2,6.6L64.9,221.4z"/>
<path class="st0" d="M55.6,211.1h9.9c6.3,0,11.3,5.1,11.3,11.3l0,0c0,6.3-5.1,11.3-11.3,11.3h-9.9c-6.3,0-11.3-5.1-11.3-11.3l0,0
C44.2,216.1,49.3,211.1,55.6,211.1z"/>
<line class="st2" x1="53.4" y1="212.1" x2="53.4" y2="213.4"/>
<line class="st2" x1="57.1" y1="211.1" x2="57.1" y2="215.4"/>
<line class="st2" x1="60.8" y1="211.1" x2="60.8" y2="213.4"/>
<polyline class="st2" points="48.5,221.4 52.7,221.4 51.1,219.8 "/>
<polyline class="st2" points="65,221.4 60.9,221.4 60.8,219.8 "/>
<path class="st0" d="M113.7,233.7h7.4c1.2,0,2.2,1,2.2,2.2v25.8c0,4,3.2,7.2,7.2,7.2h2.1c2,0,3.6-1.6,3.6-3.6l0,0l0,0
c0-2-1.6-3.6-3.6-3.6h0l0,0c-1.2,0-2.1-0.9-2.1-2.1v-26c0-4-3.2-7.2-7.2-7.2h0l0,0l0,0h-6"/>
<path class="st0" d="M85.3,226.5H67.8c-2,0-3.6,1.6-3.6,3.6l0,0v4.9c0,2,1.4,3.6,3.4,3.8c2,0.1,3.7-1.4,3.8-3.4
c0-0.1,0-0.1,0-0.2v-1.5h15.2"/>
<path class="st1" d="M83.7,226.5c0,0,0.6-3.2,3.2-3.2"/>
<line class="st2" x1="55.2" y1="225.4" x2="59.2" y2="225.4"/>
<path class="st2" d="M80.7,211.1h0.4c4.8,0,8.7,3.9,8.7,8.7l0,0"/>
<path class="st2" d="M88.3,211.1h0.4c4.8,0,8.7,3.9,8.7,8.7l0,0"/>
<path class="st2" d="M95.9,211.1h0.4c4.8,0,8.7,3.9,8.7,8.7l0,0"/>
<line class="st2" x1="127.3" y1="255.9" x2="129.5" y2="255.9"/>
<line class="st2" x1="127.3" y1="250.6" x2="129.5" y2="250.6"/>
<polygon class="st9" points="482.9,165.7 486.8,180.6 490.8,178 494.8,175.4 "/>
<rect x="490.9" y="174.9" transform="matrix(0.8407 -0.5416 0.5416 0.8407 -18.7816 294.8061)" class="st9" width="1.4" height="8.8"/>
<rect x="423.7" y="246.7" class="st0" width="75.8" height="48.3"/>
<rect x="450.3" y="266.2" class="st1" width="27.1" height="5.5"/>
<rect x="445.7" y="266.2" class="st0" width="27.1" height="5.5"/>
<rect x="423.7" y="295" class="st0" width="75.8" height="48.1"/>
<rect x="450.3" y="314.3" class="st1" width="27.1" height="5.5"/>
<rect x="445.7" y="314.3" class="st0" width="27.1" height="5.5"/>
<rect x="450.3" y="362.4" class="st1" width="27.1" height="5.5"/>
<rect x="445.7" y="362.4" class="st0" width="27.1" height="5.5"/>
<rect x="499.5" y="246.7" class="st3" width="26" height="9.7"/>
<rect x="435" y="85.1" class="st1" width="4.9" height="4.3"/>
<rect x="431.6" y="85.1" class="st1" width="4.9" height="4.3"/>
<circle class="st1" cx="435.7" cy="75.3" r="10.1"/>
<path class="st1" d="M435.6,75.3c0,2-1.2,3.8-3.1,4.5c-0.6,0.2-1.2,0.4-1.8,0.3c-2.7,0-4.9-2.2-4.9-4.9c0-2.7,2.2-4.9,4.9-4.9
c0.6,0,1.2,0.1,1.8,0.3C434.4,71.5,435.6,73.3,435.6,75.3z"/>
<path class="st0" d="M435.6,75.3c-0.7,1.7-2.6,2.5-4.3,1.8c-1.7-0.7-2.5-2.6-1.8-4.3c0.5-1.3,1.7-2.1,3.1-2.1
C434.4,71.5,435.6,73.3,435.6,75.3z"/>
<line class="st2" x1="507.9" y1="195.6" x2="496.5" y2="195.6"/>
<path class="st0" d="M465.4,396.4l4.7,30h-54.2c-2.6,0-4.7-2.1-4.7-4.7l0,0v-25.3c0-6,4.8-10.8,10.8-10.8c0,0,0,0,0,0h32.6
C460.5,385.6,465.4,390.4,465.4,396.4z"/>
<path class="st0" d="M474.7,390v5.7c0-2.6-2.1-4.7-4.6-4.7c-0.2,0-0.3,0-0.5,0c-2.4,0.3-4.2,2.4-4.2,4.8v4.7
c0,6-4.8,10.8-10.8,10.8H417c-6,0-10.8-4.8-10.8-10.8l0,0v-5c0-5.6,4.5-10.1,10.1-10.1h0h54C472.8,385.6,474.7,387.6,474.7,390
C474.7,390,474.7,390,474.7,390z"/>
<path class="st0" d="M470,385.5L470,385.5c2.6,0,4.7,2.1,4.7,4.7v31.7c0,2.6-2.1,4.7-4.7,4.7l0,0c-2.6,0-4.7-2.1-4.7-4.7v-31.7
C465.4,387.6,467.5,385.5,470,385.5z"/>
<path class="st0" d="M431.1,411.5h14.4l0,0l0,0c0,2.8-2.2,5-5,5h-4.4C433.3,416.5,431.1,414.3,431.1,411.5L431.1,411.5
L431.1,411.5z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,319 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 702 431.4" style="enable-background:new 0 0 702 431.4;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;stroke:#E5E5E5;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st1{fill:#E5E5E5;}
.st2{fill:none;stroke:#E5E5E5;stroke-width:2;stroke-miterlimit:10;}
.st3{fill:#E5E5E5;stroke:#14223C;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st4{fill:#FFFFFF;stroke:#14223C;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st5{fill:none;stroke:#14223C;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st6{fill:none;stroke:#14223C;stroke-width:1.74;stroke-linecap:round;stroke-linejoin:round;}
.st7{fill:#14223C;}
.st8{fill:none;stroke:#14223C;stroke-width:2;stroke-linejoin:round;}
.st9{fill:#FFFFFF;stroke:#14223C;stroke-width:1.84;stroke-linecap:round;stroke-linejoin:round;}
.st10{fill:#EEEEEE;}
.st11{fill:none;}
.st12{fill:#FFFFFF;}
.st13{opacity:0.48;fill:#E5E5E5;enable-background:new ;}
.st14{opacity:0.36;}
.st15{opacity:0.3;fill:#E5E5E5;enable-background:new ;}
.st16{opacity:0.5;fill:none;stroke:#E5E5E5;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;enable-background:new ;}
.st17{opacity:0.4;fill:#E5E5E5;enable-background:new ;}
.st18{opacity:0.21;fill:#E5E5E5;enable-background:new ;}
.st19{fill:#FFFFFF;stroke:#14223C;stroke-width:1.97;stroke-linecap:round;stroke-linejoin:round;}
.st20{fill:#E5E5E5;stroke:#FFFFFF;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.st21{fill:none;stroke:#E5E5E5;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;}
.st22{fill:#CECECE;stroke:#14223C;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
</style>
<title>Normal</title>
<g id="Layer_2_1_">
<g id="Layer_1-2">
<path class="st0" d="M170.2,308.2H278c6.1,0,11-4.9,11-11l0,0"/>
<path class="st0" d="M276.9,268h46.6c1.1,0,2,0.9,2,2v24.8c0,1.1-0.9,2-2,2h-46.6c-1.1,0-2-0.9-2-2V270
C274.9,268.8,275.8,268,276.9,268z"/>
<path class="st0" d="M315.3,274.6h3.6c0.6,0,1,0.4,1,1v13.5c0,0.6-0.4,1-1,1h-3.6c-0.6,0-1-0.4-1-1v-13.5
C314.3,275,314.7,274.6,315.3,274.6z"/>
<path class="st0" d="M304,274.6h3.6c0.6,0,1,0.4,1,1v13.5c0,0.6-0.4,1-1,1H304c-0.6,0-1-0.4-1-1v-13.5
C303,275,303.5,274.6,304,274.6z"/>
<path class="st0" d="M297.1,286.6L297.1,286.6l-6-10.6l0,0c-0.5-1.2-2-1.8-3.2-1.2c-0.6,0.3-1,0.7-1.3,1.3l-5.9,10.5l0,0
c-0.2,0.3-0.2,0.7-0.2,1.1c0,1.4,1.1,2.5,2.4,2.5h0h12c1.3,0,2.4-1.1,2.4-2.4C297.4,287.3,297.3,287,297.1,286.6L297.1,286.6z"/>
<line class="st0" x1="289" y1="297.2" x2="289" y2="290.1"/>
<path class="st1" d="M502.6,430.4L502.6,430.4L502.6,430.4h-99.5l0,0l0,0c0-6.5,5.3-11.7,11.7-11.7h76.1
C497.3,418.7,502.6,423.9,502.6,430.4z"/>
<path class="st1" d="M440,316.5h24.7l0,0l0,0c0,6.1-4.9,11-11,11H451C445,327.5,440,322.5,440,316.5L440,316.5L440,316.5z"/>
<rect x="446.5" y="316.5" class="st1" width="11.7" height="108.5"/>
<path class="st1" d="M424.5,329.8h14.7c1.2,0,2.2,1,2.2,2.2v0c0,1.2-1,2.2-2.2,2.2h-14.7c-1.2,0-2.2-1-2.2-2.2v0
C422.4,330.8,423.3,329.8,424.5,329.8z"/>
<line class="st2" x1="431.9" y1="332" x2="449.4" y2="332"/>
<path class="st3" d="M523,192.1l-20,124.3H396.7c-3,0-5.5-2.5-5.5-5.5s2.5-5.5,5.5-5.5h65.5l27.4-113.4L523,192.1z"/>
<path class="st3" d="M503,316.5L503,316.5z"/>
<path class="st4" d="M525,192.1h-2l-17.2,107.2c-0.6,3.6-3.6,6.2-7.2,6.2h-37.6c-2.9,0-5.4,2.1-5.7,5c-0.3,3,2,5.7,5,6
c0.2,0,0.3,0,0.5,0h41.9h0.4l0,0h0.3h0.6l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2l0.6-0.3
l0.2-0.1c1.9-1.2,3.5-2.9,4.5-4.9c0.6-1.2,1.1-2.5,1.3-3.8c0-0.1,0-0.2,0.1-0.3l0,0l16.2-105.7c0.6-3.6-1.8-7-5.4-7.6
C525.7,192.1,525.4,192.1,525,192.1z"/>
<path class="st4" d="M350.3,211.8h-11c-1.7,0-3,1.3-3,3s1.3,3,3,3h6.5"/>
<path class="st4" d="M489.8,172.7l-32.4,31l-7.8,8.4l-3.8,3.9l1.4,21.1l-21.4,0.2l-6.5,0.1c-7.8,0.2-14.2-6-14.4-13.7
c0-0.4-0.1-0.7-0.2-1.1c0.1-1.5,0.5-3,1.1-4.4c0.2-0.4,0.4-0.8,0.6-1.2V217l4.4-4.7l1.1-1.1l28.1-29.7l3-3.3
c3.3-3.5,7.8-5.5,12.6-5.5L489.8,172.7z"/>
<line class="st2" x1="441.5" y1="215.3" x2="423.7" y2="200.1"/>
<path class="st4" d="M450,214.8c0.9-1.6,1.1-3.5,0.4-5.2l-6.9,7.3C446.5,217.2,448.8,216.6,450,214.8z"/>
<path class="st5" d="M506,231.7"/>
<path class="st4" d="M462.5,172.7h29.6c6.6,0,12.4,4.6,13.9,11.1c0.4,1.5,0.5,3,0.3,4.5c0,0.1,5.6,2.5,5.6,2.6l-9.9,46.9
l-2.2,25.7l-0.3,3.1l-0.9,10.4l-0.6,8.3c-0.9,11.5-10.5,20.3-22,20.4h-74.7l13.2-29.8h4.6c0,0,0-0.1,0-0.1c-0.3-3-0.2-6.1,0.4-9.1
c0.5-2.4,1.2-4.8,2.2-7l0.9-2.1L446,205l-1.4-1.4"/>
<ellipse transform="matrix(0.3608 -0.9326 0.9326 0.3608 82.3969 563.3206)" class="st1" cx="452.2" cy="221.5" rx="14.3" ry="9.7"/>
<path class="st4" d="M417.2,275.6"/>
<path class="st5" d="M483.3,231.6"/>
<path class="st5" d="M468.1,246.9"/>
<path class="st4" d="M417.2,275.6"/>
<path class="st3" d="M485.5,172.7h6.6l-29.5,15.8c-0.9,0.5-2,0.2-2.5-0.7c-0.1-0.2-0.2-0.4-0.2-0.6l-0.7-4.3c0,0-1-5.7-1.5-9
l-0.1-0.4v-0.7L485.5,172.7z"/>
<path class="st4" d="M480.6,144.7V173l-14.2,7.7c-0.9,0.5-2,0.2-2.5-0.7c-0.1-0.2-0.2-0.4-0.2-0.6c-0.3-1.9-0.8-4.5-1.1-6.4v-28.3
H480.6z"/>
<path class="st4" d="M470,227.3L470,227.3c0,1.9-1.5,3.4-3.4,3.4h-5.1c-1.9,0-3.4-1.5-3.4-3.4v0c0-1.9,1.5-3.4,3.4-3.4h5.1
C468.5,223.9,470,225.5,470,227.3z"/>
<path class="st4" d="M495.1,203.7l7.8,8.4l3.8,3.9l0.7,0.8l19.3,20.6l6.5,0.1c7.8,0.2,14.2-6,14.4-13.7c0-0.4,0.1-0.7,0.2-1.1
c-0.1-1.5-0.5-3-1.1-4.4c-0.2-0.4-0.4-0.8-0.6-1.2V217l-4.4-4.7l-1.1-1.1l-28.2-29.7l-3-3.3c-3.3-3.5-7.8-5.5-12.6-5.5h-4.7"/>
<path class="st4" d="M523,213.4l-15.1,3.3l-0.5,0.1l-41,10.2l-2.4,10l63.4,0.6l6.4,0.1c7.6,0.2,13.9-5.8,14.1-13.4
c0-0.5,0-1,0-1.5c-0.1-1.7-0.6-3.4-1.4-5c-0.1-0.2-0.2-0.4-0.3-0.6c-1.1-1.9-9.7-10.4-9.7-10.4"/>
<path class="st4" d="M484.5,230.7c-0.6,0.6-1.4,1-2.3,1c-0.9,0-1.7-0.4-2.3-1l-4.7-4.7l-4.7,4.7c-0.6,0.6-1.4,1-2.3,1
c-1.8,0-3.3-1.5-3.3-3.3c0-0.9,0.3-1.7,1-2.3l7.2-7.2c0.6-0.6,1.4-1,2.2-1c0.8,0.1,1.6,0.4,2.2,1l0.9,0.9l6.2,6.2
C485.8,227.4,485.8,229.4,484.5,230.7z"/>
<path class="st4" d="M490.7,230.7c-0.6,0.6-1.4,1-2.3,1c-0.9,0-1.7-0.4-2.3-1l-4.7-4.7l-4.7,4.7c-0.6,0.6-1.4,1-2.3,1
c-1.8,0-3.3-1.5-3.3-3.3c0-0.9,0.3-1.7,1-2.3l7.2-7.2c0.6-0.6,1.4-1,2.2-1c0.8,0.1,1.6,0.4,2.2,1l0.9,0.9l6.2,6.2
C491.9,227.4,491.9,229.4,490.7,230.7z"/>
<path class="st4" d="M494.9,232.8c-0.6,0.6-1.4,1-2.3,1c-0.9,0-1.7-0.4-2.3-1l-4.7-4.7l-4.7,4.7c-0.6,0.6-1.4,1-2.3,1
c-1.8,0-3.3-1.5-3.3-3.3c0-0.9,0.3-1.7,1-2.3l7.2-7.2c0.6-0.6,1.4-1,2.2-1c0.8,0.1,1.6,0.4,2.2,1l0.9,0.9l6.2,6.2
C496.1,229.4,496.1,231.5,494.9,232.8z"/>
<path class="st4" d="M498.8,236.6c-0.6,0.6-1.4,1-2.3,1c-0.9,0-1.7-0.4-2.3-1l-4.7-4.7l-4.7,4.7c-0.6,0.6-1.4,1-2.3,1
c-1.8,0-3.3-1.5-3.3-3.3c0-0.9,0.3-1.7,1-2.3l7.2-7.2c0.6-0.6,1.4-1,2.2-1c0.8,0.1,1.6,0.4,2.2,1l0.9,0.9l6.2,6.2
C500,233.3,500,235.3,498.8,236.6z"/>
<rect x="530.7" y="237.7" class="st3" width="148.6" height="12.9"/>
<path class="st5" d="M541.4,325.6"/>
<line class="st5" x1="97" y1="430.4" x2="70" y2="430.4"/>
<polyline class="st5" points="701,430.4 679.4,430.4 664.3,430.4 643.3,430.4 628.2,430.4 172.9,430.4 157.8,430.4 136.8,430.4
121.7,430.4 103,430.4 "/>
<path class="st5" d="M311.8,435.7"/>
<polygon class="st3" points="423.6,417.1 403.7,417.1 387.4,348.1 407.3,348.1 "/>
<rect x="374.4" y="425.1" class="st4" width="51.2" height="5"/>
<path class="st4" d="M425.6,425.1h-50.5c0-3.5,1.6-5.8,5.7-7.5l21.6-7.5h19.8L425.6,425.1z"/>
<line class="st6" x1="374.4" y1="430.1" x2="374.4" y2="428.1"/>
<line class="st6" x1="381.4" y1="430.1" x2="381.4" y2="428.1"/>
<line class="st6" x1="387.4" y1="430.1" x2="387.4" y2="428.1"/>
<line class="st6" x1="394.4" y1="430.1" x2="394.4" y2="428.1"/>
<line class="st6" x1="400.4" y1="430.1" x2="400.4" y2="428.1"/>
<line class="st6" x1="407.4" y1="430.1" x2="407.4" y2="428.1"/>
<line class="st6" x1="413.4" y1="430.1" x2="413.4" y2="428.1"/>
<line class="st6" x1="420.4" y1="430.1" x2="420.4" y2="428.1"/>
<path class="st3" d="M392.3,425.1h-17.9c-0.1-2.2,0.9-4.3,2.6-5.5c1.3-1,3-1.5,4.6-1.5h3.6C389.2,418.1,392.3,421.2,392.3,425.1z"
/>
<path class="st4" d="M387.9,415.1h3.9c1.9,0,3.7,0.7,5,2.1l0,0"/>
<path class="st4" d="M396.6,412.1h4.8c1.9,0,3.7,0.7,5,2.1l0,0"/>
<path class="st4" d="M421.9,275.5l-40,0.1c-9.6,0-17.3,7.8-17.3,17.4c0,1.3,0.2,2.7,0.5,3.9l25,105.8h30l-23-97.2h59.8"/>
<path class="st2" d="M435.3,298.5h-40.4c-2.9,0-5.2,2.4-5.1,5.2c0,0.4,0.1,0.8,0.1,1.2l23.4,96.8"/>
<polygon class="st3" points="377,419.7 362.9,405.6 405.9,335.7 420,349.8 "/>
<rect x="352.7" y="390.7" transform="matrix(0.4594 -0.8882 0.8882 0.4594 -177.7909 540.502)" class="st4" width="5" height="51.2"/>
<path class="st4" d="M379.1,425.9l-44.9-23.2c1.6-3.1,4.1-4.4,8.5-4.1l22.6,3.3l17.2,8.9L379.1,425.9z"/>
<line class="st6" x1="331.3" y1="406.8" x2="332.2" y2="405"/>
<line class="st6" x1="337.5" y1="410" x2="338.4" y2="408.2"/>
<line class="st6" x1="342.8" y1="412.8" x2="343.7" y2="411"/>
<line class="st6" x1="349" y1="416" x2="349.9" y2="414.2"/>
<line class="st6" x1="354.4" y1="418.8" x2="355.3" y2="417"/>
<line class="st6" x1="360.6" y1="422" x2="361.5" y2="420.2"/>
<line class="st6" x1="365.9" y1="424.7" x2="366.8" y2="423"/>
<line class="st6" x1="372.1" y1="427.9" x2="373" y2="426.2"/>
<path class="st3" d="M349.5,410.6l-15.9-8.2c0.9-2,2.7-3.4,4.9-3.7c1.7-0.3,3.3,0,4.8,0.8l3.2,1.6
C349.9,403,351.3,407.2,349.5,410.6L349.5,410.6z"/>
<path class="st4" d="M350.2,399.7l3.4,1.8c1.7,0.9,2.9,2.3,3.5,4.1l0,0"/>
<path class="st4" d="M359.2,401l4.3,2.2c1.7,0.9,2.9,2.3,3.5,4.1l0,0"/>
<path class="st4" d="M457.2,275.5c-5.5,0.2-12.9-0.3-17.8,0.1c-5.4,0.5-10.2,3.5-13.1,8.1l-61.5,98.8l25.6,14.8l56.9-92h10"/>
<path class="st3" d="M165.1,84.7h154.5c1.2,0,2.2,1,2.2,2.2v115.5c0,1.2-1,2.2-2.2,2.2H165.1c-1.2,0-2.2-1-2.2-2.2V86.9
C162.9,85.7,163.9,84.7,165.1,84.7z"/>
<path class="st4" d="M237.6,84.7h-60.5c-1.2,0-2.2,1-2.2,2.2l0,0v115.5c0,1.2,1,2.2,2.2,2.2c0,0,0,0,0,0h154.5
c1.2,0,2.2-1,2.2-2.2V86.9c0-1.2-1-2.2-2.2-2.2L237.6,84.7"/>
<path class="st4" d="M182.9,92.7h142c1.1,0,2,0.9,2,2v89c0,1.1-0.9,2-2,2h-142c-1.1,0-2-0.9-2-2v-89
C180.9,93.6,181.7,92.7,182.9,92.7z"/>
<path class="st1" d="M187.8,136.3h57.5c0.8,0,1.5,0.7,1.5,1.5v40.7c0,0.8-0.7,1.5-1.5,1.5h-57.5c-0.8,0-1.5-0.7-1.5-1.5v-40.7
C186.4,137,187,136.3,187.8,136.3z"/>
<path class="st4" d="M192.9,131.2h57.5c0.8,0,1.5,0.7,1.5,1.5v40.7c0,0.8-0.7,1.5-1.5,1.5h-57.5c-0.8,0-1.5-0.7-1.5-1.5v-40.7
C191.4,131.9,192.1,131.2,192.9,131.2z"/>
<path class="st3" d="M251.9,132.7v3.6h-60.4v-3.6c0-0.8,0.7-1.5,1.5-1.5h0h57.5C251.2,131.2,251.9,131.9,251.9,132.7z"/>
<path class="st3" d="M218.9,204.7h47l0,0v33l0,0h-42c-2.8,0-5-2.2-5-5V204.7L218.9,204.7z"/>
<path class="st3" d="M282.9,237.7h-47c-2.8,0-5-2.2-5-5v-28h47v28C277.9,235.5,280.1,237.7,282.9,237.7z"/>
<rect x="230.9" y="204.7" class="st7" width="47" height="6"/>
<line class="st5" x1="504.1" y1="213.4" x2="525.4" y2="195.1"/>
<path class="st8" d="M522.6,192.3"/>
<path class="st8" d="M501.3,210.5"/>
<path class="st4" d="M415.8,212.3l-38.8,9.2c-1.2,0.3-2.5-0.2-3.2-1.2l-5.1-7.2c-0.6-0.8-1.5-1.3-2.5-1.3h-7.4l-9.1,2.4
c-1,0.3-1.7,1.2-1.7,2.2l-0.6,17.8c0,1.2,0.4,2.4,1.2,3.4l83.2-0.1"/>
<path class="st4" d="M359.4,201v34.8c0,0.9-0.7,1.6-1.6,1.6c0,0,0,0,0,0H343c-0.9,0-1.6-0.7-1.6-1.6c0,0,0,0,0,0V201
c0-3.5,2.1-6.7,5.2-8.2v-15.4c0-0.9,0.7-1.6,1.6-1.6c0,0,0,0,0,0h4.4c0.9,0,1.6,0.7,1.6,1.6c0,0,0,0,0,0v15.4
C357.4,194.3,359.4,197.5,359.4,201z"/>
<path class="st4" d="M348.9,175.9l3.6,0c1.1,0,2,0.9,2,2l0,1.1l0,0l-7.6-0.1l0,0l0-1.1C346.9,176.7,347.8,175.9,348.9,175.9z"/>
<rect x="341.4" y="204.7" class="st3" width="18" height="20.1"/>
<path class="st4" d="M366.5,211.9h-11c-1.7,0-3,1.3-3,3s1.3,3,3,3h4c-2.7,2.7-2.7,7,0,9.7c1.3,1.3,3,2,4.9,2"/>
<rect x="612.4" y="199.8" transform="matrix(0.318 -0.9481 0.9481 0.318 234.6699 728.791)" class="st3" width="22.9" height="3"/>
<path class="st3" d="M610,202.6h15.6c1.4,0,2.6,1.2,2.6,2.6V235c0,1.4-1.2,2.6-2.6,2.6H610c-1.4,0-2.6-1.2-2.6-2.6v-29.9
C607.5,203.7,608.6,202.6,610,202.6z"/>
<circle class="st4" cx="617.8" cy="220.1" r="5.6"/>
<rect x="121.7" y="237.6" class="st4" width="410.1" height="13"/>
<path class="st4" d="M371.7,214.4"/>
<polyline class="st5" points="431.7,237.4 439.8,219.2 420.1,202.4 "/>
<path class="st4" d="M416.8,229.9h90.9l0,0v7.6l0,0h-98.5l0,0l0,0C409.2,233.3,412.6,229.9,416.8,229.9L416.8,229.9z"/>
<path class="st3" d="M503.9,229.9h13.8c1.3,0,2.3,1.1,2.3,2.4v5.3l0,0h-23.7l0,0l0,0C496.3,233.3,499.7,229.9,503.9,229.9
C503.9,229.9,503.9,229.9,503.9,229.9z"/>
<path class="st4" d="M341.1,237.6h4.8c1.8,0,3.2-1.4,3.2-3.2l0,0V221c0-1.8-1.4-3.2-3.2-3.2l0,0h-6.6L341.1,237.6z"/>
<path class="st3" d="M388.2,229c0,3.2-1.2,6.3-3.3,8.7h-7.6c4.8-1.1,7.8-5.8,6.8-10.6c-0.6-2.6-2.3-4.9-4.8-6.1l5.1-1.2
C386.9,222.2,388.3,225.5,388.2,229z"/>
<polyline class="st4" points="398.8,301.7 397.1,305.5 394.5,303.6 "/>
<line class="st5" x1="447.3" y1="305.5" x2="448.5" y2="303.6"/>
<path class="st4" d="M512,283.7"/>
<path class="st2" d="M493.7,267.6l-1.5,18.8c-0.6,7.3-6.7,12.9-14,13h-28.7c-2.8,0-5.4,1.4-6.9,3.8l-56.5,90.6"/>
<path class="st3" d="M500.4,257.4l-0.5,6l-0.3,3.1h-80c0.5-2.4,1.2-4.8,2.2-7l0.9-2.1L500.4,257.4z"/>
<line class="st5" x1="438.9" y1="261.9" x2="447.8" y2="261.9"/>
<path class="st2" d="M479.1,267.5c0,4.6-0.1,12.5,13.5,12.5"/>
<path class="st2" d="M501.3,210.5"/>
<path class="st2" d="M423.7,200.1"/>
<line class="st2" x1="502.3" y1="209.7" x2="521.8" y2="192.9"/>
<polygon class="st4" points="207.9,250.6 157.8,430.4 121.7,430.4 171.9,250.6 "/>
<polygon class="st3" points="223,250.6 172.9,430.4 136.8,430.4 187,250.6 "/>
<polygon class="st3" points="664.3,430.4 628.2,430.4 578,250.6 614.1,250.6 "/>
<polygon class="st4" points="679.4,430.4 643.3,430.4 593.1,250.6 629.2,250.6 "/>
<path class="st9" d="M586.7,207.4c0.7,2.4-2.6,5.5-4.5,6.1s-1.8-1.6-2.5-4s2.6-5.5,4.5-6.1S585.9,205.1,586.7,207.4z"/>
<path class="st4" d="M558,207.2c3.4,1.3,4.9,5.4,4.3,7s-3.1-0.1-6.4-1.3s-4.9-5.4-4.3-7S554.7,205.9,558,207.2z"/>
<path class="st4" d="M567.6,208.5c-1.8,3.1-6.2,3.9-7.6,3.1s0.6-3,2.4-6.1s6.2-3.9,7.6-3.1S569.4,205.4,567.6,208.5z"/>
<path class="st4" d="M591.1,212.8c-3.3,1.3-7.3-0.8-7.9-2.3s2.4-2,5.7-3.3s7.3,0.8,7.9,2.3S594.4,211.5,591.1,212.8z"/>
<path class="st4" d="M578.1,212.4c-2.8-2.2-3-6.7-2-8s2.9,1,5.7,3.3s3,6.7,2,8S580.9,214.6,578.1,212.4z"/>
<path class="st4" d="M571.8,212c-3.6-0.2-6.3-3.7-6.2-5.3s3-0.9,6.5-0.7s6.3,3.7,6.2,5.3S575.4,212.2,571.8,212z"/>
<path class="st4" d="M599.3,210.5c0,13.4-10.9,24.3-24.3,24.3c-13.4,0-24.3-10.9-24.3-24.3H599.3z"/>
<path class="st4" d="M583,233.4v4.1h-16v-4.1C572.2,235.2,577.8,235.2,583,233.4z"/>
<path class="st4" d="M540.3,231.5c3.8-1.2,6.6,3.1,6.7,4.8s-2.9,1.1-6.5,1.2s-6.6-3.1-6.7-4.8S536.9,232.6,540.3,231.5z"/>
<line class="st5" x1="607.5" y1="206.6" x2="628.2" y2="206.6"/>
<line class="st5" x1="607.5" y1="233.4" x2="628.2" y2="233.4"/>
<line class="st5" x1="496.5" y1="202.6" x2="495.1" y2="203.7"/>
<path class="st10" d="M680.1,171.4V86.9h-56.9v84.5H680.1z M673.1,164.4h-42.9V93.9h42.9L673.1,164.4z"/>
<path class="st10" d="M612.1,128.4V43.9h-56.9v84.5H612.1z M605.1,121.4h-42.9V50.9h42.9L605.1,121.4z"/>
<line class="st5" x1="197" y1="169.5" x2="246" y2="169.5"/>
<circle class="st3" cx="208" cy="169.5" r="2"/>
<polyline class="st11" points="210,151.5 210,151.5 227,151.5 "/>
<path class="st1" d="M239,153.5c2.6,0,4.5,3.4,1.4,6H238c0-2.2-1.8-4-4-4s-4,1.8-4,4h-16c0-2.2-1.8-4-4-4s-4,1.8-4,4h-0.4
c-2.5,0-4.6-2.1-4.6-4.6l0,0v-1.4h6.9l3.1-10h15l3.1,10H239z"/>
<path class="st12" d="M224.5,145.5h-12.1l-2.5,8h17L224.5,145.5z"/>
<circle class="st1" cx="210" cy="159.5" r="3"/>
<circle class="st1" cx="234" cy="159.5" r="3"/>
<path class="st1" d="M266.8,108.4h73.6c1,0,1.9,0.8,1.9,1.9v52.2c0,1-0.8,1.9-1.9,1.9h-73.6c-1,0-1.9-0.8-1.9-1.9v-52.2
C265,109.2,265.8,108.4,266.8,108.4z"/>
<path class="st4" d="M273.4,101.8H347c1,0,1.9,0.8,1.9,1.9v52.2c0,1-0.8,1.9-1.9,1.9h-73.6c-1,0-1.9-0.8-1.9-1.9v-52.2
C271.5,102.7,272.4,101.8,273.4,101.8z"/>
<path class="st3" d="M348.9,103.7v4.7h-77.3v-4.7c0-1,0.8-1.9,1.9-1.9H347C348,101.9,348.8,102.7,348.9,103.7z"/>
<rect x="277.9" y="112.4" class="st1" width="64" height="5.1"/>
<rect x="277.9" y="120.1" class="st13" width="17.9" height="33.3"/>
<rect x="330.4" y="120.1" class="st13" width="11.5" height="11.5"/>
<rect x="330.4" y="134.2" class="st13" width="11.5" height="11.5"/>
<rect x="330.4" y="148.3" class="st13" width="11.5" height="5.1"/>
<rect x="299.7" y="120.1" class="st1" width="26.9" height="16.6"/>
<rect x="299.7" y="139.3" class="st1" width="26.9" height="14.1"/>
<circle class="st3" cx="348.3" cy="102.2" r="6.4"/>
<g class="st14">
<path class="st7" d="M290.6,136.6h-3v10h-3.4v-10h-1.9v-1.6l1.9-0.9v-0.9c-0.1-1.1,0.3-2.3,1.1-3.1c1-0.7,2.2-1.1,3.4-1
c1.1,0,2.1,0.2,3.2,0.5l-0.9,2.5c-0.6-0.2-1.3-0.3-1.9-0.3c-0.4,0-0.8,0.1-1.1,0.4c-0.2,0.3-0.3,0.7-0.3,1.1v0.8h3L290.6,136.6z"
/>
</g>
<rect x="191" y="104.5" class="st1" width="19" height="18"/>
<rect x="214" y="104.5" class="st1" width="19" height="18"/>
<rect x="237" y="104.5" class="st1" width="19" height="18"/>
<rect x="265" y="170.5" class="st1" width="55" height="9"/>
<path class="st15" d="M400.2,0c-18.5,0-33.5,15-33.5,33.5s15,33.5,33.5,33.5s33.5-15,33.5-33.5S418.7,0,400.2,0z M400.2,60.1
c-14.7,0-26.6-11.9-26.6-26.6s11.9-26.6,26.6-26.6c14.7,0,26.6,11.9,26.6,26.6c0,0,0,0,0,0C426.7,48.2,414.8,60.1,400.2,60.1z"/>
<polyline class="st16" points="416.1,24.4 400.6,35.3 391.8,28.2 "/>
<rect y="36.5" class="st17" width="122.3" height="95.3"/>
<rect y="137.8" class="st18" width="122.3" height="51.7"/>
<rect y="22.5" class="st1" width="122.3" height="7"/>
<rect y="196.5" class="st1" width="122.3" height="7"/>
<path class="st3" d="M494.4,130.7c-1.3,3.3-2,6.7-2,10.2v0.2c-1.1-0.2-2.3-0.3-3.4-0.2h-0.9c-8.3,0-26.1,0.3-33.9,0.6
c-2.3,0.1-3.8,0.1-3.8,0.2l0,0c-1-7.8-3.2-14.6-6.1-22.6c-0.9-2.5-1.4-4.9-0.4-7.2c0,0,0.1-0.3,0.3-0.7c1.5-3.7,3.8-6.9,6.7-9.7
c0.1-0.1,0.2-0.2,0.4-0.4l1.6,2.3l1.2,1.8l3.4,4.8c0.2,0.3,0.5,0.7,0.7,1l0.2,0.3c0.1,0.1,0.2,0.2,0.2,0.3l0,0
c6,7.4,15.1,11.4,24.6,10.7c3-0.2,5.9-0.8,8.7-1.9c0.5-0.3,1.1-0.5,1.6-0.7c1.8-0.6,2.9-0.6,3.3,0.2
C497.6,121.3,496.5,124.7,494.4,130.7z"/>
<path class="st19" d="M494.6,141.1l-45.9,0.4c-2.8,0.1-5.2-2.2-5.3-5v-0.3c0-2.8,2.3-5.1,5.2-5.1l45.9-0.4c2.8-0.1,5.2,2.2,5.3,5
v0.3C499.7,138.8,497.4,141.1,494.6,141.1C494.6,141.1,494.6,141.1,494.6,141.1z"/>
<path class="st4" d="M492.2,144.2c0.3,11.6-8.8,21.3-20.5,21.7c-11.6,0.3-21.3-8.8-21.7-20.5c0-0.3,0-0.5,0-0.8l-0.1-5.9l-0.1-7.8
l-0.1-8.1c0-0.9,0-1.7,0.1-2.6c1.2-10.6,10.1-18.6,20.7-18.7h0.2c11.6,0,21,9.3,21.1,20.9l0.1,7.9L492.2,144.2z"/>
<path class="st4" d="M480.6,145.4c-0.2,5.1-4.6,9.1-9.7,8.8c-4.7-0.2-8.5-3.9-8.8-8.7L480.6,145.4z"/>
<path class="st5" d="M455.8,132.1c0.6-3,3.3-5.2,6.3-5.1"/>
<path class="st5" d="M479.2,127c3-0.6,6,1,7.1,3.9"/>
<path class="st7" d="M461.9,134.7c-0.7,0-1.3-0.6-1.3-1.3c0-0.7,0.6-1.3,1.3-1.3s1.3,0.6,1.3,1.3
C463.2,134.1,462.7,134.6,461.9,134.7L461.9,134.7z"/>
<path class="st7" d="M461.9,131.1L461.9,131.1c-1.3,0.1-2.2,1.2-2.2,2.5c0.1,1.2,1,2.1,2.2,2.2l0,0c1.3-0.1,2.2-1.2,2.2-2.5
C464,132,463.1,131.1,461.9,131.1z"/>
<path class="st7" d="M480.5,134.5c-0.7,0-1.3-0.6-1.3-1.3c0-0.7,0.6-1.3,1.3-1.3c0.7,0,1.3,0.6,1.3,1.3
C481.8,133.9,481.2,134.5,480.5,134.5L480.5,134.5z"/>
<path class="st7" d="M480.5,130.9L480.5,130.9c-1.3,0.1-2.2,1.2-2.2,2.5c0.1,1.2,1,2.1,2.2,2.2l0,0c1.3-0.1,2.2-1.2,2.2-2.5
C482.5,131.9,481.6,130.9,480.5,130.9z"/>
<path class="st4" d="M493.5,119.8c-0.5,0.2-1.1,0.5-1.6,0.7C492.4,120.2,493,120,493.5,119.8z"/>
<path class="st3" d="M498.1,112.7c-3.5-9.5-11.6-16.5-21.5-18.5c-0.3-0.1-0.7-0.1-1-0.2c-0.7-0.1-1.4-0.2-2.1-0.3
c-0.8-0.1-1.7-0.1-2.6-0.1h-0.3c-5.7,0-11.4,1.8-16.1,5c-1.2,0.8-2.3,1.7-3.3,2.6c-0.1,0.1-0.2,0.2-0.4,0.4
c-2.9,2.7-5.2,6-6.7,9.7c1-2.6,3.5-4.3,6.4-4.3c4.6,0,8.1,4.8,8.1,4.8c8,10,18.8,14.3,30.4,9.8c4.5-1.6,9.9,1,5.4,9.2
C496.2,126.3,501.1,120.9,498.1,112.7z"/>
<path class="st20" d="M494.8,115.7c-1-2.7-2.4-5.3-4.2-7.6"/>
<path class="st5" d="M481.4,118.5c-4.4,0-8.7-1.2-12.6-3.3"/>
<path class="st5" d="M461.9,121.5c-7.3-7.3-6.1-11.8-6.1-12.6c0,0-3.1,5.1-1.3,9.7"/>
<path class="st5" d="M441.1,113c0.9-3.2,4.4-4.9,4.4-4.9s-0.3-1.9-3-1.9"/>
<line class="st2" x1="468.7" y1="158.8" x2="473.6" y2="158.8"/>
<line class="st21" x1="61.2" y1="139.2" x2="61.2" y2="154.3"/>
<circle class="st21" cx="61.2" cy="160.5" r="6.2"/>
<path class="st4" d="M323.1,227.3h-16.9c-2.7,0-5.4,1.1-7.3,3.1l-7,7.1h31.2L323.1,227.3z"/>
<path class="st4" d="M330.6,237.5c0-5.6-4.6-10.2-10.2-10.2l0,0h-6.7c-2.7,0-5.4,1.1-7.3,3.1l-7,7.1L330.6,237.5L330.6,237.5z"/>
<path class="st3" d="M323.6,227.3h-0.7c-2.7,0-5.4,1.1-7.3,3.1l-7,7.1h25.2C333.8,231.9,329.3,227.3,323.6,227.3z"/>
<line class="st5" x1="201.5" y1="415" x2="325.4" y2="415"/>
<path class="st4" d="M199.9,406.2"/>
<path class="st4" d="M219.6,415h-23.8c-2.1,0-4-0.9-5.4-2.4c-1.6-1.6-3.3-3.4-4.5-4.7c-0.3-0.4-0.3-1.1,0.2-1.4
c0.2-0.1,0.3-0.2,0.5-0.2h20.1c0.9,0,1.9,0.4,2.5,1.1c1.2,1.3,3.2,3.5,5,5.2C215.5,414.1,217.5,415,219.6,415z"/>
<path class="st4" d="M307.3,415H331c2.1,0,4-0.9,5.4-2.4c1.6-1.6,3.3-3.4,4.5-4.7c0.3-0.4,0.2-1.1-0.2-1.4
c-0.1-0.1-0.3-0.2-0.5-0.2h-20.1c-0.9,0-1.8,0.4-2.5,1.1c-1.2,1.3-3.2,3.5-5,5.2C311.3,414.1,309.3,415,307.3,415z"/>
<path class="st7" d="M197.1,410.9c0.2,0.4,0,0.7-0.4,0.7c-0.5,0-0.9-0.3-1.2-0.7c-0.2-0.4,0-0.7,0.4-0.7
C196.4,410.3,196.9,410.5,197.1,410.9z"/>
<path class="st7" d="M201.8,410.9c0.2,0.4,0,0.7-0.4,0.7c-0.5,0-0.9-0.3-1.2-0.7c-0.2-0.4,0-0.7,0.4-0.7
C201.1,410.3,201.5,410.5,201.8,410.9z"/>
<path class="st7" d="M206.4,410.9c0.2,0.4,0,0.7-0.4,0.7c-0.5,0-0.9-0.3-1.2-0.7c-0.2-0.4,0-0.7,0.4-0.7
C205.7,410.3,206.2,410.5,206.4,410.9z"/>
<path class="st3" d="M237.2,426c0,2.4-1.9,4.3-4.3,4.3c0,0,0,0,0,0h-4.3v-8.7h4.3C235.2,421.7,237.2,423.6,237.2,426
C237.2,426,237.2,426,237.2,426z"/>
<circle class="st22" cx="228.5" cy="426" r="4.3"/>
<line class="st5" x1="228.5" y1="426" x2="206.3" y2="426"/>
<path class="st22" d="M214.9,426c0,2.4-1.9,4.3-4.3,4.3c0,0,0,0,0,0h-4.3v-8.7h4.3C213,421.7,214.9,423.6,214.9,426
C214.9,426,214.9,426,214.9,426z"/>
<circle class="st4" cx="206.3" cy="426" r="4.3"/>
<circle class="st7" cx="206.3" cy="426" r="1"/>
<line class="st5" x1="220.5" y1="425.9" x2="220.5" y2="415"/>
<polygon class="st4" points="211.6,418.3 223.6,418.3 225.6,415 209.6,415 "/>
<polygon class="st22" points="215.7,418.3 227.7,418.3 229.7,415 213.7,415 "/>
<path class="st3" d="M324.9,426c0,2.4-1.9,4.3-4.3,4.3c0,0,0,0,0,0h-4.3v-8.7h4.3C323,421.7,324.9,423.6,324.9,426
C324.9,426,324.9,426,324.9,426z"/>
<circle class="st22" cx="316.3" cy="426" r="4.3"/>
<line class="st5" x1="316.3" y1="426" x2="294" y2="426"/>
<path class="st22" d="M302.7,426c0,2.4-1.9,4.3-4.3,4.3c0,0,0,0,0,0H294v-8.7h4.3C300.7,421.6,302.7,423.6,302.7,426
C302.7,426,302.7,426,302.7,426z"/>
<circle class="st4" cx="294" cy="426" r="4.3"/>
<circle class="st7" cx="294" cy="426" r="1"/>
<line class="st5" x1="308.3" y1="425.9" x2="308.3" y2="415"/>
<polygon class="st4" points="299.3,418.3 311.3,418.3 313.3,415 297.3,415 "/>
<polygon class="st22" points="303.4,418.3 315.4,418.3 317.4,415 301.4,415 "/>
<path class="st4" d="M175.8,233.1h27.5c1.2,0,2.2,1,2.2,2.2l0,0c0,1.2-1,2.2-2.2,2.2h-27.5c-1.2,0-2.2-1-2.2-2.2l0,0
C173.6,234.1,174.6,233.1,175.8,233.1z"/>
<path class="st5" d="M147.3,233.2c1-6.5,6.6-11.3,13.1-11.3c0.6,0,1.3,0,1.9,0.1"/>
<path class="st5" d="M161.2,230c-2.9-0.4-5.6,1.6-6,4.5"/>
<path class="st5" d="M147.3,233.2c1-6.5,6.6-11.3,13.1-11.3c0.6,0,1.3,0,1.9,0.1"/>
<path class="st5" d="M151.2,233.9c0.8-5.1,5.5-8.6,10.6-7.9"/>
<path class="st5" d="M161.2,230c-2.9-0.4-5.6,1.6-6,4.5"/>
<path class="st4" d="M160.8,233.1h17.5c1.2,0,2.2,1,2.2,2.2l0,0c0,1.2-1,2.2-2.2,2.2h-17.5c-1.2,0-2.2-1-2.2-2.2l0,0
C158.6,234.1,159.6,233.1,160.8,233.1z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

View File

@@ -0,0 +1,24 @@
<!--
~ Copyright (c) 2020. bmy
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width,initial-scale=1.0" name="viewport">
<link rel="shortcut icon" href="./img/ic_launcher.png">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<% for (var i in htmlWebpackPlugin.options.cdn) { %>
<script src="<%= htmlWebpackPlugin.options.cdn[i] %>"></script>
<% } %>
</body>
</html>

View File

@@ -0,0 +1 @@
d38103c0-1b4f-4056-8f24-e9769593047c

View File

@@ -0,0 +1 @@
7d659fa3-af36-43d8-9a4d-a9c9071622dd

View File

@@ -0,0 +1,19 @@
/*
* Copyright (c) 2020. bmy
*/
import "@less/imports.less"
import { Component } from 'vue-property-decorator';
import { VueCustomize } from "@logic/Base.type";
@Component
export default class App extends VueCustomize {
protected render(): JSX.Element {
return (
<div id={"app"}>
<router-view/>
</div>
)
}
}

View File

@@ -0,0 +1 @@
7ad717d3-5fad-430c-9382-30e07b0ae447

View File

@@ -0,0 +1 @@
6c556179-e51f-4b64-b18f-679334a8c45f

View File

@@ -0,0 +1 @@
6483db00-c72e-4434-92d4-5cfdcb231e5a

View File

@@ -0,0 +1,461 @@
/*
* Copyright (c) 2020. bmy
*/
body,ul,li,p,h1,h2,h3,h4,h5,h6,img,input,button {
margin: 0;
padding: 0;
}
::-webkit-scrollbar { display: none }
html, body, #app {
width: 100%;
height: 100%;
}
html {
font-family: sans-serif; /* 1 */
line-height: 1.15; /* 2 */
-ms-text-size-adjust: 100%; /* 3 */
-webkit-text-size-adjust: 100%; /* 3 */
}
body {
line-height: 1.5;
font-size: 16px;
width: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
background-color: #fafafa;
color: rgba(0, 0, 0, 0.87);
}
li {
list-style: none;
}
article,
aside,
footer,
header,
nav,
section {
display: block;
}
/* Grouping content
========================================================================== */
/**
* Add the correct display in IE 9-.
* 1. Add the correct display in IE.
*/
figcaption,
figure,
main { /* 1 */
display: block;
}
/**
* Add the correct margin in IE 8.
*/
figure {
margin: 1em 40px;
}
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
white-space: pre-wrap;
word-break: break-all;
margin: 0;
}
/* Text-level semantics
========================================================================== */
/**
* 1. Remove the gray background on active links in IE 10.
* 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
*/
a {
text-decoration: none;
background-color: transparent; /* 1 */
-webkit-text-decoration-skip: objects; /* 2 */
user-select: none;
-webkit-user-select: none;
}
/**
* Remove the outline on focused links when they are also active or hovered
* in all browsers (opinionated).
*/
a:active,
a:hover {
outline-width: 0;
}
/**
* 1. Remove the bottom border in Firefox 39-.
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Prevent the duplicate application of `bolder` by the next rule in Safari 6.
*/
b,
strong {
font-weight: inherit;
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font style in Android 4.3-.
*/
dfn {
font-style: italic;
}
/**
* Add the correct background and color in IE 9-.
*/
mark {
background-color: #ff0;
color: #000;
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Add the correct display in IE 9-.
*/
audio,
video {
display: inline-block;
}
/**
* Add the correct display in iOS 4-7.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Remove the border on images inside links in IE 10-.
*/
img {
border-style: none;
}
/**
* Hide the overflow in IE.
*/
svg:not(:root) {
overflow: hidden;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers (opinionated).
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: sans-serif; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
outline: none;
border: none;
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
* controls in Android 4.
* 2. Correct the inability to style clickable types in iOS and Safari.
*/
button,
html [type="button"], /* 1 */
[type="reset"],
[type="submit"] {
-webkit-appearance: button; /* 2 */
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Change the border, margin, and padding in all browsers (opinionated).
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* 1. Add the correct display in IE 9-.
* 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/**
* Remove the default vertical scrollbar in IE.
*/
textarea {
overflow: auto;
resize: vertical;
}
/**
* 1. Add the correct box sizing in IE 10-.
* 2. Remove the padding in IE 10-.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in IE 9-.
* 1. Add the correct display in Edge, IE, and Firefox.
*/
details, /* 1 */
menu {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Scripting
========================================================================== */
/**
* Add the correct display in IE 9-.
*/
canvas {
display: inline-block;
}
/**
* Add the correct display in IE.
*/
template {
display: none;
}
/* Hidden
========================================================================== */
/**
* Add the correct display in IE 10-.
*/
[hidden] {
display: none;
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright (c) 2020. bmy
*/
// 重置ui框架css
.el-header {
padding: 0 !important;
position: fixed;
width: 100%;
left: 0;
top: 0;
right: 0;
z-index: 999;
}
.el-main {
margin-top: 60px;
padding: 0 !important;
}
.el-aside {
height: calc(100vh - 60px);
position: fixed;
top: 60px;
left: 0;
bottom: 0;
ul {
height: 100%;
}
}
.el-menu-item.is-active {
color: #fff !important;
background: #0397ff !important;
}
.is-opened {
.el-menu--inline {
background: #f6f3f3 !important;
}
}
.demo-form-inline {
display: flex;
align-items: center;
height: 60px;
margin-bottom: 22px;
}
.el-form--inline .el-form-item {
margin-right: 20px;
margin-bottom: 0;
}
.el-dialog__body {
padding: 10px 20px;
}
.list {
.el-image__error {
font-size: 12px;
}
}

View File

@@ -0,0 +1 @@
fecce3f1-9507-4380-b0b9-f9f672478d06

View File

@@ -0,0 +1,69 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
@import "../mixin/index";
.ElTabs {
.TabsFather {
overflow-x: scroll;
width: 100%;
position: fixed;
z-index: 101;
white-space: normal;
overflow-y: hidden;
.TabsTitle {
display: flex;
height: 45px;
line-height: 45px;
background: #fff;
border-bottom: 1px solid #dcdfe5;
.active {
background: #fff;
border-bottom: none !important;
height: 46px;
i, span {
color: #0397ff !important;
}
}
li {
flex-shrink: 0;
background-color: #fff;
padding: 0 20px;
border-left: 1px solid #e4e7ed;
cursor: pointer;
&:hover {
i, span {
font-size: 15px;
color: #0397ff !important;
}
}
&:last-child {
border-right: 1px solid #e4e7ed;
}
i {
margin-right: 5px;
transition: all 0.1s;
}
span {
font-size: 14px;
font-weight: 500;
color: #303133;
transition: all 0.3s;
}
.el-icon-close {
margin-left: 8px;
font-size: 12px;
}
}
}
}
.TabsContent {
padding-top: 58px;
padding-left: 15px;
padding-bottom: 15px;
background: #fff;
}
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
.page_header {
display: flex;
align-items: center;
margin: 4px 0;
height: 40px;
border-bottom: 1px solid #eee;
padding-bottom: 10px;
margin-bottom: 15px;
i {
font-size: 16px;
}
h1 {
margin-left: 16px;
font-size: 20px;
margin-right: 12px;
margin-bottom: 0;
color: #000000d9;
}
span {
margin-right: 12px;
color: #00000073;
font-size: 14px;
}
}

View File

@@ -0,0 +1,20 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
.UserVerifyList {
.demo-table-expand {
font-size: 0;
}
.demo-table-expand label {
width: 90px;
color: #99a9bf;
}
.demo-table-expand .el-form-item {
margin-right: 0;
margin-bottom: 0;
width: 25%;
}
}

View File

@@ -0,0 +1,4 @@
// 公共css
@import "./common/normalize";
@import "./common/resetUi";

View File

@@ -0,0 +1 @@
abc73d06-f4f8-4c7b-8470-4d782dea1301

View File

@@ -0,0 +1,312 @@
/*
* Copyright (c) 2020. bmy
*/
// 公共css样式可以在 页面组件中直接使用变量名称
@theme-color: #0397ff;
@test-color: yellow;
@red50: #ffebee;
@red100: #ffcdd2;
@red200: #ef9a9a;
@red300: #e57373;
@red400: #ef5350;
@red500: #f44336;
@red600: #e53935;
@red700: #d32f2f;
@red800: #c62828;
@red900: #b71c1c;
@redA100: #ff8a80;
@redA200: #ff5252;
@redA400: #ff1744;
@redA700: #d50000;
@red: @red500;
@pink50: #fce4ec;
@pink100: #f8bbd0;
@pink200: #f48fb1;
@pink300: #f06292;
@pink400: #ec407a;
@pink500: #e91e63;
@pink600: #d81b60;
@pink700: #c2185b;
@pink800: #ad1457;
@pink900: #880e4f;
@pinkA100: #ff80ab;
@pinkA200: #ff4081;
@pinkA400: #f50057;
@pinkA700: #c51162;
@pink: @pink500;
@purple50: #f3e5f5;
@purple100: #e1bee7;
@purple200: #ce93d8;
@purple300: #ba68c8;
@purple400: #ab47bc;
@purple500: #9c27b0;
@purple600: #8e24aa;
@purple700: #7b1fa2;
@purple800: #6a1b9a;
@purple900: #4a148c;
@purpleA100: #ea80fc;
@purpleA200: #e040fb;
@purpleA400: #d500f9;
@purpleA700: #aa00ff;
@purple: @purple500;
@deepPurple50: #ede7f6;
@deepPurple100: #d1c4e9;
@deepPurple200: #b39ddb;
@deepPurple300: #9575cd;
@deepPurple400: #7e57c2;
@deepPurple500: #673ab7;
@deepPurple600: #5e35b1;
@deepPurple700: #512da8;
@deepPurple800: #4527a0;
@deepPurple900: #311b92;
@deepPurpleA100: #b388ff;
@deepPurpleA200: #7c4dff;
@deepPurpleA400: #651fff;
@deepPurpleA700: #6200ea;
@deepPurple: @deepPurple500;
@indigo50: #e8eaf6;
@indigo100: #c5cae9;
@indigo200: #9fa8da;
@indigo300: #7986cb;
@indigo400: #5c6bc0;
@indigo500: #3f51b5;
@indigo600: #3949ab;
@indigo700: #303f9f;
@indigo800: #283593;
@indigo900: #1a237e;
@indigoA100: #8c9eff;
@indigoA200: #536dfe;
@indigoA400: #3d5afe;
@indigoA700: #304ffe;
@indigo: @indigo500;
@blue50: #e3f2fd;
@blue100: #bbdefb;
@blue200: #90caf9;
@blue300: #64b5f6;
@blue400: #42a5f5;
@blue500: #2196f3;
@blue600: #1e88e5;
@blue700: #1976d2;
@blue800: #1565c0;
@blue900: #0d47a1;
@blueA100: #82b1ff;
@blueA200: #448aff;
@blueA400: #2979ff;
@blueA700: #2962ff;
@blue: @blue500;
@lightBlue50: #e1f5fe;
@lightBlue100: #b3e5fc;
@lightBlue200: #81d4fa;
@lightBlue300: #4fc3f7;
@lightBlue400: #29b6f6;
@lightBlue500: #03a9f4;
@lightBlue600: #039be5;
@lightBlue700: #0288d1;
@lightBlue800: #0277bd;
@lightBlue900: #01579b;
@lightBlueA100: #80d8ff;
@lightBlueA200: #40c4ff;
@lightBlueA400: #00b0ff;
@lightBlueA700: #0091ea;
@lightBlue: @lightBlue500;
@cyan50: #e0f7fa;
@cyan100: #b2ebf2;
@cyan200: #80deea;
@cyan300: #4dd0e1;
@cyan400: #26c6da;
@cyan500: #00bcd4;
@cyan600: #00acc1;
@cyan700: #0097a7;
@cyan800: #00838f;
@cyan900: #006064;
@cyanA100: #84ffff;
@cyanA200: #18ffff;
@cyanA400: #00e5ff;
@cyanA700: #00b8d4;
@cyan: @cyan500;
@teal50: #e0f2f1;
@teal100: #b2dfdb;
@teal200: #80cbc4;
@teal300: #4db6ac;
@teal400: #26a69a;
@teal500: #009688;
@teal600: #00897b;
@teal700: #00796b;
@teal800: #00695c;
@teal900: #004d40;
@tealA100: #a7ffeb;
@tealA200: #64ffda;
@tealA400: #1de9b6;
@tealA700: #00bfa5;
@teal: @teal500;
@green50: #e8f5e9;
@green100: #c8e6c9;
@green200: #a5d6a7;
@green300: #81c784;
@green400: #66bb6a;
@green500: #4caf50;
@green600: #43a047;
@green700: #388e3c;
@green800: #2e7d32;
@green900: #1b5e20;
@greenA100: #b9f6ca;
@greenA200: #69f0ae;
@greenA400: #00e676;
@greenA700: #00c853;
@green: @green500;
@lightGreen50: #f1f8e9;
@lightGreen100: #dcedc8;
@lightGreen200: #c5e1a5;
@lightGreen300: #aed581;
@lightGreen400: #9ccc65;
@lightGreen500: #8bc34a;
@lightGreen600: #7cb342;
@lightGreen700: #689f38;
@lightGreen800: #558b2f;
@lightGreen900: #33691e;
@lightGreenA100: #ccff90;
@lightGreenA200: #b2ff59;
@lightGreenA400: #76ff03;
@lightGreenA700: #64dd17;
@lightGreen: @lightGreen500;
@lime50: #f9fbe7;
@lime100: #f0f4c3;
@lime200: #e6ee9c;
@lime300: #dce775;
@lime400: #d4e157;
@lime500: #cddc39;
@lime600: #c0ca33;
@lime700: #afb42b;
@lime800: #9e9d24;
@lime900: #827717;
@limeA100: #f4ff81;
@limeA200: #eeff41;
@limeA400: #c6ff00;
@limeA700: #aeea00;
@lime: @lime500;
@yellow50: #fffde7;
@yellow100: #fff9c4;
@yellow200: #fff59d;
@yellow300: #fff176;
@yellow400: #ffee58;
@yellow500: #ffeb3b;
@yellow600: #fdd835;
@yellow700: #fbc02d;
@yellow800: #f9a825;
@yellow900: #f57f17;
@yellowA100: #ffff8d;
@yellowA200: #ffff00;
@yellowA400: #ffea00;
@yellowA700: #ffd600;
@yellow: @yellow500;
@amber50: #fff8e1;
@amber100: #ffecb3;
@amber200: #ffe082;
@amber300: #ffd54f;
@amber400: #ffca28;
@amber500: #ffc107;
@amber600: #ffb300;
@amber700: #ffa000;
@amber800: #ff8f00;
@amber900: #ff6f00;
@amberA100: #ffe57f;
@amberA200: #ffd740;
@amberA400: #ffc400;
@amberA700: #ffab00;
@amber: @amber500;
@orange50: #fff3e0;
@orange100: #ffe0b2;
@orange200: #ffcc80;
@orange300: #ffb74d;
@orange400: #ffa726;
@orange500: #ff9800;
@orange600: #fb8c00;
@orange700: #f57c00;
@orange800: #ef6c00;
@orange900: #e65100;
@orangeA100: #ffd180;
@orangeA200: #ffab40;
@orangeA400: #ff9100;
@orangeA700: #ff6d00;
@orange: @orange500;
@deepOrange50: #fbe9e7;
@deepOrange100: #ffccbc;
@deepOrange200: #ffab91;
@deepOrange300: #ff8a65;
@deepOrange400: #ff7043;
@deepOrange500: #ff5722;
@deepOrange600: #f4511e;
@deepOrange700: #e64a19;
@deepOrange800: #d84315;
@deepOrange900: #bf360c;
@deepOrangeA100: #ff9e80;
@deepOrangeA200: #ff6e40;
@deepOrangeA400: #ff3d00;
@deepOrangeA700: #dd2c00;
@deepOrange: @deepOrange500;
@brown50: #efebe9;
@brown100: #d7ccc8;
@brown200: #bcaaa4;
@brown300: #a1887f;
@brown400: #8d6e63;
@brown500: #795548;
@brown600: #6d4c41;
@brown700: #5d4037;
@brown800: #4e342e;
@brown900: #3e2723;
@brown: @brown500;
@blueGrey50: #eceff1;
@blueGrey100: #cfd8dc;
@blueGrey200: #b0bec5;
@blueGrey300: #90a4ae;
@blueGrey400: #78909c;
@blueGrey500: #607d8b;
@blueGrey600: #546e7a;
@blueGrey700: #455a64;
@blueGrey800: #37474f;
@blueGrey900: #263238;
@blueGrey: @blueGrey500;
@grey50: #fafafa;
@grey100: #f5f5f5;
@grey200: #eeeeee;
@grey300: #e0e0e0;
@grey400: #bdbdbd;
@grey500: #9e9e9e;
@grey600: #757575;
@grey700: #616161;
@grey800: #424242;
@grey900: #212121;
@grey: @grey500;
@black: #000000;
@white: #ffffff;
@transparent: rgba(0, 0, 0, 0);
@fullBlack: rgba(0, 0, 0, 1);
@darkBlack: rgba(0, 0, 0, 0.87);
@lightBlack: rgba(0, 0, 0, 0.54);
@minBlack: rgba(0, 0, 0, 0.26);
@faintBlack: rgba(0, 0, 0, 0.12);
@fullWhite: rgba(255, 255, 255, 1);
@darkWhite: rgba(255, 255, 255, 0.87);
@lightWhite: rgba(255, 255, 255, 0.54);

View File

@@ -0,0 +1,8 @@
/*
* Copyright (c) 2023. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
@import "./color";
@import "./mixin";

View File

@@ -0,0 +1,28 @@
.clearfix() {
&:after,
&:before {
content: " ";
display: table;
}
&:after {
clear: both;
}
}
.no-scrollbar() {
&::-webkit-scrollbar {
display: none !important;
width: 0 !important;
height: 0 !important;
-webkit-appearance: none;
opacity: 0 !important;
}
}
.ellipsis() {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
word-wrap: break-word;
}

View File

@@ -0,0 +1 @@
c67fda0b-542b-44a1-ba7c-eb12fea41623

View File

@@ -0,0 +1,11 @@
/*
* Copyright (c) 2020. bmy
*/
@import "../mixin/index";
.home {
h1 {
color: @theme-color;
}
}

View File

@@ -0,0 +1,116 @@
@import "../mixin/index";
/deep/.el-popconfirm__main {
margin-bottom: 15px;
}
.login {
display: flex;
height: 100vh;
.login_img {
flex: 1;
background: @theme-color;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
position: relative;
.circular {
width: 200px;
height: 200px;
background: #36a7f5;
border-radius: 100%;
position: absolute;
top: -30px;
left: -30px;
}
.banner {
width: 400px;
.banner_title {
text-align: center;
color: @red50;
margin-top: 20px;
font-size: 20px;
}
}
}
.login_input {
flex: 2;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
.center {
max-width: 392px;
.login_text {
color: #4a5761;
font-size: 19px;
border: 0;
margin-bottom: 50px;
font-width: 400;
small {
color: #4a5761;
font-size: 15px;
margin-left: 5px;
}
}
.login_form {
position: relative;
input {
width: 100%;
padding: 19px 30px;
border-radius: 100px;
text-align: left;
background-color: #ffffff;
border: 0;
font-size: 15px;
color: @theme-color;
-webkit-box-shadow: 0 6px 12px 0 rgba(18, 113, 179, 0.14);
-moz-box-shadow: 0 6px 12px 0 rgba(18, 113, 179, 0.14);
box-shadow: 0 6px 20px 0 rgba(18, 113, 179, 0.15);
transition: all 0.3s ease 0.0s;
margin-bottom: 20px;
}
.LoginSubmit {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
.login_button {
text-align: center;
border: 0;
color: #ffffff;
font-size: 14px;
font-weight: 400;
padding: 10px 20px;
width: 60px;
border-radius: 100px;
background-color: @theme-color;
box-shadow: 0 12px 32px 0 #008ef2b0;
outline: none;
transition: all 0.3s ease 0.0s;
cursor: pointer;
i {
margin-left: 10px;
font-size: 16px;
}
&:hover {
width: 70px;
background-color: #0080d9;
}
}
.reg_text {
color: #abb4bc;
font-size: 14px;
span {
color: @theme-color;
cursor: pointer;
}
}
}
}
}
}
}

View File

@@ -0,0 +1,45 @@
@import "../mixin/index";
.OpusDialog {
h1 {
padding-bottom: 15px;
border-bottom: 1px solid #dcdfe6;
}
.action {
padding-bottom: 15px;
}
}
.info {
.info_main {
margin-bottom: 15px;
background: #f4f3f3;
padding-top: 10px;
padding-left: 10px;
border-radius: 6px;
padding-bottom: 15px;
.title {
font-size: 18px;
margin-bottom: 25px;
}
.list {
display: flex;
align-items: center;
flex-wrap: wrap;
padding-left: 20px;
li {
width: 25%;
margin-bottom: 15px;
display: flex;
align-items: center;
span {
font-weight: 500;
font-size: 16px;
width: 80px;
display: inline-block;
}
}
}
}
}

View File

@@ -0,0 +1,5 @@
@import "../mixin/index";
.UserAudit {
}

View File

@@ -0,0 +1 @@
fd2dac7f-22d2-4fa7-a925-6e1ca3c6cf69

View File

@@ -0,0 +1 @@
0b70460d-6edd-4320-bbe3-42b7efe8c083

View File

@@ -0,0 +1,71 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Component, Vue, Prop } from "vue-property-decorator";
import { Getter, Mutation } from 'vuex-class';
import { VueCustomize } from "@logic/Base.type";
@Component
export default class ElAside extends VueCustomize {
@Prop() public readonly status!: boolean;
@Getter('GettersAsideMenu') private readonly AsideMenu!: Array<any>
@Getter('GettersTabsActive') private readonly TabsActive!: Array<any>
@Mutation('SET_TABCONTENT') private SetContent!: any;
@Mutation('SET_TABACTIVE') private SetActive!: any;
private OpenMenu(key: string, keyPath: string): void {
this.SetContent(key);
this.SetActive(key);
this.$router.push(key)
}
mounted() {
// 刷新后获取当前路由地址然后激活对应菜单
this.SetActive(this.$route.path)
}
protected render () {
return (
<el-menu
defaultActive={this.TabsActive}
collapse={this.status}
unique-opened={true}
on-select={this.OpenMenu}
class="el-menu-vertical-demo">
{
this.AsideMenu.map((v,i)=>{
return v.children.length == 0
? (
<el-menu-item index={v.web_href}>
<i class={v.icon}></i>
<span slot="title">{v.web_title}</span>
</el-menu-item>
)
: (
<el-submenu index={v.web_href}>
<template slot="title">
<i class={v.icon}></i>
<span>{v.web_title}</span>
</template>
<el-menu-item-group>
{
v.children.map((t:any,j:number) => {
return (
<el-menu-item index={t.web_href}>
<i class={t.icon}></i>
<span>{t.web_title}</span>
</el-menu-item>
)
})
}
</el-menu-item-group>
</el-submenu>
)
})
}
</el-menu>
)
}
}

View File

@@ -0,0 +1,69 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Component } from "vue-property-decorator";
import { LoginResponse } from "@service/User.service";
import { VueCustomize } from "@logic/Base.type";
@Component
export default class ElHeader extends VueCustomize {
private defaultActive: string = '';
private UserInfo!: LoginResponse['user_info'];
private isOpen: boolean = false; // false 展开true 合上
private created() {
this.UserInfo = this.$getStorage("user_info");
}
protected render () {
return (
<el-menu
defaultActive={this.defaultActive}
class="el-menu-demo"
mode="horizontal"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b">
<el-menu-item>
<h3>App管理后台</h3>
</el-menu-item>
<el-menu-item title={this.isOpen ? '展开' : '折叠'} onClick={() => {
this.isOpen = !this.isOpen
this.$emit("openChange", this.isOpen)
}}>
<i style={{ color: '#fff' }}
class={this.isOpen ? 'el-icon-s-unfold' : 'el-icon-s-fold'}></i>
</el-menu-item>
<el-submenu index="2" style={{ float: 'right' }}>
<template slot="title">
<i class="el-icon-user-solid"></i>
{this.UserInfo.admin_user_name}
</template>
<el-menu-item >
<i class="el-icon-edit"></i>
<span slot="title"></span>
</el-menu-item>
<el-menu-item index="3-2" on-click={()=>{
this.$confirm('确定退出当前后台吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
localStorage.clear()
setTimeout(()=>{
this.$router.replace('/login')
},300)
}).catch(() => {});
}}>
<i class="el-icon-switch-button"></i>
<span slot="title">退</span>
</el-menu-item>
</el-submenu>
</el-menu>
)
}
}

View File

@@ -0,0 +1,78 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import "@componentsLess/ElTabs.less"
import { Component, Prop } from "vue-property-decorator";
import { Mutation } from 'vuex-class';
import { VueCustomize } from "@logic/Base.type";
@Component
export default class ElTabs extends VueCustomize {
@Prop({ default: [] }) public readonly tabsData!: Array<any>;
@Mutation('SET_TABACTIVE')
private SetActive!: any;
@Mutation('SET_REMOVETABS')
private RemoveTab!: any;
/**
* 会导致 Computed property was assigned to but it has no setter.
* 所以需要使用computed重写setter即可
* @constructor
*/
get TabsActive() {
return this.$store.getters.GettersTabsActive
}
set TabsActive(val) {}
/**
* 删除tabs
* @param targetName
*/
public async removeTab(targetName: string): Promise<void> {
this.RemoveTab(targetName)
await this.$router.push(this.TabsActive)
}
render () {
return (
<div class="ElTabs">
<div class="TabsFather">
<ul class="TabsTitle">
{
this.tabsData.map((v,index)=>{
return (
<li class={v.url == this.TabsActive ? 'active': ''}
on-click={async ()=> {
this.SetActive(v.url)
await this.$router.push(v.url)
}}>
<i class={v.icon}></i>
<span>{v.title}</span>
{
v.closable
? <i class="el-icon-close" on-click={async (e:Event)=>{
e.stopPropagation()
await this.removeTab(v.url)
}}>
</i>
: null
}
</li>
)
})
}
</ul>
</div>
<div class="TabsContent">
{ this.$slots.default }
</div>
</div>
)
}
}

View File

@@ -0,0 +1,28 @@
/*
* Copyright (c) 2020. bmy
*/
import { Component, Prop, Vue } from 'vue-property-decorator';
import { VueCustomize } from "@logic/Base.type";
@Component
export default class HelloWorld extends VueCustomize {
@Prop({ default : 'default value' }) public readonly msg!: string;
private mounted() {
}
private showAlert() {
alert("showAlert")
}
private render() {
return (
<div class="hello">
<h1>{ this.msg }</h1>
<h2 onClick={ () => this.showAlert() }>HelloWorld组件点击事件{ this.msg }</h2>
</div>
)
}
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Component, Prop, Vue } from 'vue-property-decorator';
import "@componentsLess/PageHeader.less";
import { VueCustomize } from "@logic/Base.type";
@Component
export default class PageHeader extends VueCustomize {
@Prop({ default : '' }) public readonly title!: string;
@Prop({ default : '' }) public readonly subtitle!: string;
private mounted() {
}
private render() {
return (
<div class="page_header">
<i class="el-icon-back"></i>
<h1>{ this.title }</h1>
<span>{ this.subtitle }</span>
</div>
)
}
}

View File

@@ -0,0 +1,336 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Component, Prop, Vue } from 'vue-property-decorator';
import "@componentsLess/PageHeader.less";
import "@componentsLess/UserVerifyList.less";
import PageHeader from "./PageHeader";
import { Autowired } from "@ann/Ioc.annotation";
import { UserServiceImpl } from '@/core/service/impl/User.service.impl';
import { UserVerifyRes } from "@service/type/res/UserVerify.res";
import { OpusRes, UserInfoResponseModel } from "@service/type/res/Opus.res";
import { VueCustomize } from "@logic/Base.type";
@Component
export default class UserVerifyList extends VueCustomize {
@Autowired
public readonly UserServiceImpl!: UserServiceImpl;
@Prop({default: ''}) public readonly title!: string;
@Prop({default: ''}) public readonly subtitle!: string;
@Prop({default: ''}) public readonly type!: string;
public filter: any = {
user_id: null,
user_verify_status: null,
type: this.type,
page: 1,
count: 10,
};
public total_page: number = 0;
public VerifyList: Array<UserVerifyRes> = [];
public userItemInfo!: UserInfoResponseModel;
private created() {
this.GetVerifyList()
}
private async GetVerifyList(): Promise<void> {
let res = await this.UserServiceImpl.UserVerifyList(this.filter);
this.VerifyList = res.result;
this.total_page = res.total_page;
}
private async SetUserReview(user_verify_status: number, row: UserVerifyRes): Promise<void> {
let res = await this.UserServiceImpl.UserReview({
user_verify_status: user_verify_status,
user_verify_id: row.user_verify_id
});
await this.GetVerifyList();
}
private async GetUserItemInfo(row: any): Promise<void> {
this.userItemInfo = await this.UserServiceImpl.UserItemInfo({
user_verify_id: row.user_verify_id
});
this.$forceUpdate();
}
public ShowColumn(): JSX.Element | undefined {
switch (this.type) {
case "avatar":
return <el-table-column
prop="user_head_img"
{
...{
scopedSlots: {
default: (data: any) => {
return <el-image width="100%" preview-src-list={ [data.row.user_head_img] } src={ data.row.user_head_img } alt=""></el-image>
}
}
}
}
label="头像">
</el-table-column>
break;
case "nickname":
return <el-table-column
prop="user_nickname"
{
...{
scopedSlots: {
default: (data: any) => {
return <span>{ data.row.user_nickname }</span>
}
}
}
}
label="昵称">
</el-table-column>
break;
case "signature":
return <el-table-column
prop="user_autograph"
{
...{
scopedSlots: {
default: (data: any) => {
return <span>{ data.row.user_autograph }</span>
}
}
}
}
label="签名">
</el-table-column>
break;
}
}
public render(): JSX.Element {
return (
<div class="UserVerifyList">
<PageHeader title={ this.title } subtitle={ this.subtitle }></PageHeader>
<el-form inline={ true } onInput={ () => {
} } model={ this.filter } class="demo-form-inline">
<el-form-item label="用户id">
<el-input clearable vModel={ this.filter.user_id } placeholder="请输入用户id"></el-input>
</el-form-item>
<el-form-item label="审核状态">
<el-select clearable
onChange={ () => this.filter.page = 1 }
vModel={ this.filter.user_verify_status }
placeholder="请选择审核状态">
<el-option label="等待审核" value="0"></el-option>
<el-option label="审核驳回" value="-1"></el-option>
<el-option label="审核通过" value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" onClick={ () => this.GetVerifyList() }>
</el-button>
</el-form-item>
</el-form>
<el-table
data={ this.VerifyList }
border stripe
row-key={(row:any) => {
return row.user_verify_id
}}
on-expand-change={async (expandedRows: UserVerifyRes, expanded: Array<UserVerifyRes>) => {
if (expanded.length != 0) {
await this.GetUserItemInfo(expandedRows)
}
}}
default-sort={ {prop: 'user_id', order: 'ascending'} }
style="width: 100%">
<el-table-column
type="expand" {
...{
scopedSlots: {
default: (data: any) => {
return (
<el-form label-position="left" inline class="demo-table-expand">
<el-form-item label="用户编号">
<span>{ this.userItemInfo?.user_id }</span>
</el-form-item>
<el-form-item label="用户手机">
<span>{ this.userItemInfo?.user_phone }</span>
</el-form-item>
<el-form-item label="真实姓名">
<span>{ this.userItemInfo?.user_real_name }</span>
</el-form-item>
<el-form-item label="用户头像">
<el-image style="width: 50px; height: 50px" src={ this.userItemInfo?.user_head_img } preview-src-list={[this.userItemInfo?.user_head_img]}>
</el-image>
</el-form-item>
<el-form-item label="用户昵称">
<span>{ this.userItemInfo?.user_nickname }</span>
</el-form-item>
<el-form-item label="用户性别">
<span>{ this.userItemInfo?.user_sex }</span>
</el-form-item>
<el-form-item label="身份证号">
<span>{ this.userItemInfo?.user_id_card }</span>
</el-form-item>
<el-form-item label="个性签名">
<span>{ this.userItemInfo?.user_autograph }</span>
</el-form-item>
<el-form-item label="电子邮箱">
<span>{ this.userItemInfo?.user_email }</span>
</el-form-item>
<el-form-item label="银行卡号">
<span>{ this.userItemInfo?.user_bank_card }</span>
</el-form-item>
<el-form-item label="兴趣爱好">
<span>{ this.userItemInfo?.user_work }</span>
</el-form-item>
<el-form-item label="uid">
<span>{ this.userItemInfo?.user_uid }</span>
</el-form-item>
<el-form-item label="注册时间">
<span>{ this.userItemInfo?.user_reg_time }</span>
</el-form-item>
<el-form-item label="出生日期">
<span>{ this.userItemInfo?.user_birthday }</span>
</el-form-item>
<el-form-item label="用户星座">
<span>{ this.userItemInfo?.user_constellation || '无'}</span>
</el-form-item>
</el-form>
)
}
}
}
}>
</el-table-column>
<el-table-column
label="操作"
width="280"
{
...{
scopedSlots: {
default: (data: any) => {
switch (data.row.user_verify_status) {
case 0:
return (
<span>
<el-tag style={ {marginRight: '5px'} }
effect="dark"
onClick={async () => {
await this.SetUserReview(1, data.row)
}}
type="success">
</el-tag>
<el-tag
effect="dark"
onClick={async () => {
await this.SetUserReview(-1, data.row)
}}
type="danger">
</el-tag>
</span>
)
break;
case -1:
return <el-tag type="danger">
<i class="el-icon-circle-close" style="margin-right: 5px"></i>
</el-tag>
break;
case 1:
return <el-tag type="success">
<i class="el-icon-circle-check" style="margin-right: 5px"></i>
</el-tag>
break;
}
}
}
}
}>
</el-table-column>
<el-table-column
width="140"
{
...{
scopedSlots: {
default: (data: any) => {
switch (data.row.user_verify_status) {
case 0:
return <el-tag type="info">
<i class="el-icon-time" style="margin-right: 5px"></i>
</el-tag>
break;
case -1:
return <el-tag type="danger">
<i class="el-icon-circle-close" style="margin-right: 5px"></i>
</el-tag>
break;
case 1:
return <el-tag type="success">
<i class="el-icon-circle-check" style="margin-right: 5px"></i>
</el-tag>
break;
}
}
}
}
}
label="审核状态">
</el-table-column>
<el-table-column
prop="user_verify_id"
sortable
width="140"
label="编号">
</el-table-column>
{this.ShowColumn()}
<el-table-column
prop="user_verify_time"
label="修改时间">
</el-table-column>
</el-table>
<br/>
<el-pagination background
layout="prev, pager, next"
page-size={ this.filter.count }
current-page={ this.filter.page }
on-current-change={ (page: number) => {
this.filter.page = page;
this.GetVerifyList()
} }
page-count={ this.total_page }>
</el-pagination>
</div>
)
}
}

View File

@@ -0,0 +1 @@
8a01bf21-c8df-46f5-833e-e10765370d79

View File

@@ -0,0 +1,44 @@
/*
* Copyright (c) 2020. bmy
*/
import { Autowired } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
import { VueCustomize } from "@logic/Base.type";
/**
* logic 层的父类
* 主要实现 页面公共参数和ajax方法的地方
*/
export class BaseLogic {
@Autowired
public readonly UserServiceImpl!: UserServiceImpl;
// 保存Vue对象
public _!: VueCustomize;
public page: number = 1;
public total_page: number = 1;
public count: number = 10;
// $refs 类型
public $refs!: { [key: string]: Vue | Element | Vue[] | Element[] };
public $confirm!: any;
public $message!: any;
// 请求的总页数
public TotalCount!: string;
// 请求参数
public PageParams: { limit: number, page: number } = {
limit : 10, page : 1
}
/**
* 【页面中公共的多次被用到的接口】可以在这个父类中定义,
* 子类logic中直接使用避免方法的冗余
* @constructor
*/
public async DepartmentListRequest(): Promise<void> {
}
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright (c) 2023. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Vue } from 'vue-property-decorator';
// 组件中路由元信息的类型
export interface RouterMeta {
title?: string,
isLogin?: boolean
}
// 对 logic 的部分通用变量和方法进行约束的接口
export interface Methods {
StartUp(): Promise<void>;
PageLeave?(): Promise<void>;
}
// tsx组件中一些方法找不到声明文件需要在这里定义
export class VueCustomize extends Vue {
$setToken!: (token: string) => void
$test!: () => string
$formatDate!: (data: number) => string
$isLogin!: () => void
$setStorage!: (key: String, data: any) => void
$getStorage!: (key: String) => any
}

View File

@@ -0,0 +1 @@
dd998a9d-003b-4f90-a1d7-75dc6485a20c

View File

@@ -0,0 +1,72 @@
import { BaseLogic } from "@logic/Base.logic";
import { Autowired } from "@ann/Ioc.annotation";
import { Methods, VueCustomize } from "@logic/Base.type";
import { ToolServiceImpl } from "@impl/Tool.service.impl";
import { UpdateListParams, UpdateListResponseModel } from "@service/type/res/Tool.res";
export class AppVsersionLogic<T extends VueCustomize> extends BaseLogic implements Methods {
@Autowired
public toolServiceImpl!: ToolServiceImpl;
public params: UpdateListParams = {
count: this.count,
page: this.page,
update_version: '',
update_force: ''
}
public updateList: Array<UpdateListResponseModel> = [];
public isShowAddNewUpdate: boolean = false;
public updateForce: boolean = false;
public addNewsuUpdate: UpdateListResponseModel = {
update_version: "",
update_version_code: null,
update_down_url: "",
update_content: "",
update_force: 0
}
constructor(_: T) {
super();
this._ = _;
}
public async StartUp(): Promise<void> {
await this.GetUpdateList();
}
// apk上传接口
public async UploadFile(file: File): Promise<void> {
var formdata = new FormData();
formdata.append("file", file);
let res = await this.toolServiceImpl.UploadFile(formdata);
console.log("====== res: ", res)
this.addNewsuUpdate.update_down_url = res.img_url;
}
// 发布新的app版本
public async SetaddNewsuUpdate(): Promise<void> {
let res = await this.toolServiceImpl.addNewUpdate(this.addNewsuUpdate);
await this.GetUpdateList()
this.isShowAddNewUpdate = false;
}
// 获取app版本列表
public async GetUpdateList(): Promise<void> {
let res = await this.toolServiceImpl.UpdateList(this.params);
this.updateList = res.result;
console.log(res)
}
public async deleteUpdate(item: UpdateListResponseModel): Promise<void> {
console.log(item)
await this.toolServiceImpl.deleteUpdate(item);
await this.GetUpdateList()
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (c) 2020. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Autowired } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
import { BaseLogic } from "@logic/Base.logic";
import { Methods, VueCustomize } from "@logic/Base.type";
export class HomeLogic<T extends VueCustomize> extends BaseLogic implements Methods {
@Autowired
public readonly UserServiceImpl!: UserServiceImpl;
public title: string = "12222";
public List: any = [
{ id : 1, name : '2222' },
{ id : 1, name : '32434' }
];
constructor(_: T) {
super();
this._ = _
}
/**
* 在这里面调用需要打开页面就执行的ajax请求
* @constructor
*/
public async StartUp(): Promise<void> {
}
/**
* 请求首页数据
*/
public async getData(): Promise<void> {
}
}

View File

@@ -0,0 +1,43 @@
import { BaseLogic } from "@logic/Base.logic";
import { Autowired } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
import { LoginParams } from "@service/User.service";
import { Methods, VueCustomize } from "@logic/Base.type";
export class LoginLogic<T extends VueCustomize> extends BaseLogic implements Methods {
public Banner: Array<{ img: string, title: string }> = [
{ img: './img/Main.svg', title: '欢迎登录萌弧App管理后台' },
{ img: './img/Normal.svg', title: '您可以输入账号密码进行登录' },
{ img: './img/Engineer.svg', title: '或者注册一个新的管理员账号' },
]
public UserLoginParams: LoginParams = {
admin_user_name: "moehu",
admin_user_pwd: "111",
}
@Autowired
public readonly UserService!: UserServiceImpl;
constructor(_: T) {
super();
this._ = _;
}
public async StartUp(): Promise<void> {
}
public async UserLogin (): Promise<void> {
// let res = await this.UserService.Login(this.UserLoginParams);
// this._.$setStorage('token', res.user_token);
this._.$setStorage('token', "234323erfdwerfg");
// this._.$setStorage('user_info', res.user_info);
this._.$setStorage('user_info', {
admin_user_name: '张三'
});
await this._.$router.replace("/home")
}
}

View File

@@ -0,0 +1,69 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Autowired } from "@ann/Ioc.annotation";
import { OpusAuditServiceImpl } from "@impl/OpusAudit.service.impl";
import { BaseLogic } from "@logic/Base.logic";
import { Methods, VueCustomize } from "@logic/Base.type";
import { OpusRes } from "@service/type/res/Opus.res";
import { PaginationRes } from "@service/type/res/Pagination.res";
export class OpusAuditLogic<T extends VueCustomize> extends BaseLogic implements Methods {
@Autowired
public opusAuditServiceImpl!: OpusAuditServiceImpl;
public opus: PaginationRes<Array<OpusRes>>['result'] = [];
public dialogVisible: boolean = false;
public OpusInfo!: OpusRes;
public filter: any = {
opus_title : null,
opus_status : null,
opus_type : null,
opus_original: null,
};
constructor(_: T) {
super();
this._ = _
}
public async StartUp(): Promise<void> {
await this.GetOpusAuditList()
}
public async GetOpusAuditList(): Promise<void> {
let res = await this.opusAuditServiceImpl.OpusAudit(Object.assign(
{ page: this.page, count: this.count },
this.filter
));
this.opus = res.result;
this.total_page = res.total_page;
console.log(this.opus)
console.log(this.total_page)
}
public async GetOpusInfo(row: OpusRes): Promise<void> {
let res = await this.opusAuditServiceImpl.OpusInfo({
opus_id: row.opus_id
});
this.OpusInfo = res
this.dialogVisible = true;
console.log(res)
}
public async Approved(id: number, status: number): Promise<void> {
let res = await this.opusAuditServiceImpl.Approved({
opus_id : id,
opus_status: status
});
await this.GetOpusAuditList()
}
}

View File

@@ -0,0 +1 @@
81055864-41a3-4c95-8c2a-f77a23f0849a

View File

@@ -0,0 +1,58 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import "@pageLess/Login.less";
import { Component, Vue } from 'vue-property-decorator';
import { LoginLogic } from "@logic/page/Login.logic";
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import ElHeader from "@components/Element/ElHeader";
import ElAside from "@components/Element/ElAside";
import ElTabs from "@components/Element/ElTabs";
import { Getter } from 'vuex-class';
@Component
export default class Index extends VueCustomize {
private RouterMeta: RouterMeta = {
title: 'layout',
isLogin: false
};
private OpenStatus:boolean = false;
@Getter('GettersTabsContentArr')
private TabsContent!: Array<any>;
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render(): JSX.Element {
return (
<div class="layout">
<el-container>
<el-header>
<ElHeader onOpenChange={(status: boolean) => this.OpenStatus = status}></ElHeader>
</el-header>
<el-container>
<el-aside width={this.OpenStatus ? '66px' : '200px'}>
<ElAside status={this.OpenStatus}></ElAside>
</el-aside>
<el-main style={{ marginLeft: this.OpenStatus ? '64px' : '200px' }}>
<ElTabs tabsData={this.TabsContent} style={{ width: this.OpenStatus ? 'calc(100vw - 64px)' : 'calc(100vw - 200px)' }}>
<router-view/>
</ElTabs>
</el-main>
</el-container>
</el-container>
</div>
)
}
}

View File

@@ -0,0 +1 @@
3182c384-9c79-4c5c-ae6c-c94e10a7e6aa

View File

@@ -0,0 +1 @@
c58aea25-67d9-4744-a639-ee3eb357fb0d

View File

@@ -0,0 +1,515 @@
import "@pageLess/OpusAudit.less";
import { Component, Vue } from 'vue-property-decorator';
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import PageHeader from "@components/PageHeader";
import { OpusAuditLogic } from "@logic/page/OpusAudit.logic";
import { OpusRes, TagsResponseModel } from "@service/type/res/Opus.res";
//TODO 进入详情 + 审核
//TODO 列表页面分页
@Component
export default class OpusAudit extends VueCustomize {
constructor() {
super();
}
private RouterMeta: RouterMeta = {
title: '作品审核',
isLogin: false
};
// 抽离组件所有逻辑到独立类,解耦页面和数据
private logic: OpusAuditLogic<OpusAudit> = new OpusAuditLogic(this);
public async created() {
await this.logic.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
public OpusInfo(): JSX.Element {
return (
<el-dialog
{
...{
scopedSlots: {
title: (data: any) => {
return <div class="OpusDialog">
<h1>{this.logic.OpusInfo?.opus_title}</h1>
{/*<div class="action">*/}
{/* <el-button type="success" size="small" >*/}
{/* 通过审核*/}
{/* </el-button>*/}
{/* <el-button size="small">*/}
{/* 拒绝审核*/}
{/* </el-button>*/}
{/*</div>*/}
</div>
}
}
}
}
show-close={false}
visible={this.logic.dialogVisible}
width="70%">
<div class="info">
<div class="info_main">
<div class="title">1</div>
<ul class="list">
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_title}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_introduce}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_introduce}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_satisfied}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_see}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_follow}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_collection}</div>
</li>
<li>
<span></span>
<div class="content">
<el-image
style="width: 50px;height: 50px; "
src={this.logic.OpusInfo?.opus_img}
preview-src-list={[this.logic.OpusInfo?.opus_img]}>
</el-image>
</div>
</li>
<li>
<span></span>
<div class="content">{
this.logic.OpusInfo?.opus_status == 0
? '等待审核'
: this.logic.OpusInfo?.opus_status - 1
? '审核驳回' : '审核通过'
}</div>
</li>
<li>
<span></span>
<div class="content">{
this.logic.OpusInfo?.opus_type == 1
? '推荐'
: this.logic.OpusInfo?.opus_type == 2
? '排行' : '关注'
}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_original == 1 ? '原创' : '非原创'}</div>
</li>
<li>
<span></span>
<div class="content">{
this.logic.OpusInfo?.opus_jurisdiction == 1
? '所有人'
: this.logic.OpusInfo?.opus_jurisdiction == 2
? '好友' : '不公开'
}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.opus_is_edit == 1 ? '开启编辑' : '关闭编辑'}</div>
</li>
</ul>
</div>
<div class="info_main">
<div class="title">2</div>
<div class="list">
{
this.logic.OpusInfo?.opus_imgs.length == 0 ? '暂无图片' :
this.logic.OpusInfo?.opus_imgs.map((v,i) => {
return (
<el-image
style="width: 50px;margin-right: 10px"
src={v.img_url}
preview-src-list={this.logic.OpusInfo?.opus_imgs.map(v => v.img_url)}>
</el-image>
)
})
}
</div>
</div>
<div class="info_main">
<div class="title">3</div>
<ul class="list">
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_id}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_real_name || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_nickname || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_sex || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_phone || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_id_card || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_email || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_bank_card || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_work || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">
<el-image
style="width: 50px; height: 50px"
src={this.logic.OpusInfo?.user_info?.user_head_img}
preview-src-list={[this.logic.OpusInfo?.user_info?.user_head_img]}>
</el-image>
</div>
</li>
<li>
<span>uid</span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_uid.substring(0,10)+'..' || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_reg_time.substring(0,19) || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_birthday || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_constellation || '用户未填写'}</div>
</li>
<li>
<span></span>
<div class="content">{this.logic.OpusInfo?.user_info?.user_autograph || '用户未填写'}</div>
</li>
</ul>
</div>
<div class="info_main">
<div class="title">4</div>
<div class="list">
{
this.logic.OpusInfo?.tags.length == 0 ? '暂无数据' :
this.logic.OpusInfo?.tags.map((v,i) => {
return (
<el-tag style="margin-right: 10px;" effect="plain">{v.tags_title}</el-tag>
)
})
}
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" onClick={() => {
this.logic.dialogVisible = false
}}> </el-button>
</span>
</el-dialog>
)
}
public InfoLink(row: OpusRes): JSX.Element {
return <el-tag effect="plain" type="info" style={{marginLeft: '5px'}} onClick={
async () => await this.logic.GetOpusInfo(row)
}></el-tag>
}
protected render() {
return (
<div class="OpusAudit">
{ this.OpusInfo() }
<PageHeader title="作品审核" subtitle="对用户发布的作品进行审核管理"></PageHeader>
{/*bug地址https://github.com/ElemeFE/element/issues/20286*/ }
<el-form inline={ true } onInput={ () => {} } model={ this.logic.filter } class="demo-form-inline">
<el-form-item label="作品标题">
<el-input clearable vModel={ this.logic.filter.opus_title } placeholder="作品标题"></el-input>
</el-form-item>
<el-form-item label="作品状态">
<el-select clearable
onChange={() => this.logic.page = 1}
vModel={ this.logic.filter.opus_status }
placeholder="请选择作品状态">
<el-option label="等待审核" value="0"></el-option>
<el-option label="审核驳回" value="-1"></el-option>
<el-option label="审核通过" value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item label="作品分类">
<el-select clearable
vModel={ this.logic.filter.opus_type }
onChange={() => this.logic.page = 1}
placeholder="请选择作品分类">
<el-option label="推荐" value="1"></el-option>
<el-option label="排行" value="2"></el-option>
<el-option label="关注" value="3"></el-option>
</el-select>
</el-form-item>
<el-form-item label="作品原创">
<el-select clearable
vModel={ this.logic.filter.opus_original }
onChange={() => this.logic.page = 1}
placeholder="请选择作品原创">
<el-option label="原创" value="1"></el-option>
<el-option label="非原创" value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
onClick={ () => this.logic.GetOpusAuditList() }>
</el-button>
</el-form-item>
</el-form>
<el-table
data={ this.logic.opus }
border
stripe
default-sort={{prop: 'opus_id', order: 'ascending'}}
style="width: 100%">
<el-table-column
fixed="left"
label="操作"
width="280"
{
...{
scopedSlots: {
default: (data: any) => {
switch (data.row.opus_status) {
case 0:
return (
<span>
<el-tag style={{marginRight: '5px'}}
effect="dark"
onClick={ async () => {
await this.logic.Approved(data.row.opus_id, 1);
}}
type="success">
</el-tag>
<el-tag
effect="dark"
onClick={ async () => {
await this.logic.Approved(data.row.opus_id, -1);
}}
type="danger">
</el-tag>
{ this.InfoLink(data.row) }
</span>
)
break;
case -1:
return this.InfoLink(data.row)
break;
case 1:
return this.InfoLink(data.row)
break;
}
}
}
}
}>
</el-table-column>
<el-table-column
{
...{
scopedSlots: {
default: (data: any) => {
switch (data.row.opus_status) {
case 0:
return <el-tag type="info">
<i class="el-icon-time" style="margin-right: 5px"></i>
</el-tag>
break;
case -1:
return <el-tag type="danger">
<i class="el-icon-circle-close" style="margin-right: 5px"></i>
</el-tag>
break;
case 1:
return <el-tag type="success">
<i class="el-icon-circle-check" style="margin-right: 5px"></i>
</el-tag>
break;
}
}
}
}
}
width="120"
label="审核状态">
</el-table-column>
<el-table-column
prop="opus_id"
sortable
label="编号">
</el-table-column>
<el-table-column
prop="opus_title"
label="标题"
width="180">
</el-table-column>
<el-table-column
prop="opus_introduce"
label="介绍">
</el-table-column>
<el-table-column
{
...{
scopedSlots: {
default: (data: any) => {
return <el-image onClick={ () => {
console.log(data.row.opus_img)
} } width="100%" preview-src-list={ [data.row.opus_img] } src={ data.row.opus_img }
alt=""></el-image>
}
}
}
}
label="封面图">
</el-table-column>
<el-table-column
prop="opus_time"
label="发布时间">
</el-table-column>
<el-table-column
{
...{
scopedSlots: {
default: (data: any) => {
return <span>
{
data.row.opus_type == 1 ? '推荐'
: data.row.opus_type == 2 ? '排行' : '关注'
}
</span>
}
}
}
}
label="作品分类">
</el-table-column>
<el-table-column
prop="opus_original"
{
...{
scopedSlots: {
default: (data: any) => {
return <el-tag type={ data.row.opus_original ? "success" : "danger" }>
{
data.row.opus_original == 1 ? '原创' : '非原创'
}
</el-tag>
}
}
}
}
label="是否原创">
</el-table-column>
<el-table-column
prop="opus_see"
sortable
label="浏览量">
</el-table-column>
<el-table-column
prop="opus_follow"
sortable
label="关注数量">
</el-table-column>
<el-table-column
prop="opus_collection"
sortable
label="收藏数量">
</el-table-column>
<el-table-column
prop="opus_satisfied"
sortable
label="点赞数量">
</el-table-column>
</el-table>
<br />
<el-pagination background
layout="prev, pager, next"
page-size={this.logic.count}
current-page={this.logic.page}
on-current-change={(page: number) => {
this.logic.page = page;
this.logic.GetOpusAuditList()
}}
page-count={this.logic.total_page}>
</el-pagination>
</div>
)
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
// import "@pageLess/OpusAudit.less";
import { Component, Vue } from 'vue-property-decorator';
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
@Component
export default class ReportAudit extends VueCustomize {
private RouterMeta: RouterMeta = {
title: '作品举报审核',
isLogin: false
};
public async created() {
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render(): JSX.Element {
return (
<div class="ReportAudit">
</div>
)
}
}

View File

@@ -0,0 +1 @@
e239ec2b-5e97-41fc-8875-2606f85175ad

View File

@@ -0,0 +1,235 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import "@pageLess/Login.less";
import { Component, Vue } from 'vue-property-decorator';
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import { AppVsersionLogic } from '@/application/logic/page/AppVsersionLogic';
import PageHeader from "@components/PageHeader";
@Component
export default class AppVsersion extends VueCustomize {
private logic: AppVsersionLogic<AppVsersion> = new AppVsersionLogic(this);
private RouterMeta: RouterMeta = {
title: 'App版本管理',
isLogin: true
};
public async created() {
await this.logic.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
public AddNewUpdate(): JSX.Element {
return (
<el-dialog
title="发布新版本"
destroy-on-close={true}
show-close={false}
visible={this.logic.isShowAddNewUpdate}
width="40%">
<el-form ref="form" label-width="100px">
<el-form-item label="App版本号">
<el-input vModel={this.logic.addNewsuUpdate.update_version} placeholder="请输入App版本号例如1.0.2"></el-input>
</el-form-item>
<el-form-item label="版本号整型">
<el-input vModel={this.logic.addNewsuUpdate.update_version_code} placeholder="请输入版本号整型例如102"></el-input>
</el-form-item>
<el-form-item label="App安装地址">
<el-upload
class="upload-demo"
action="/"
on-preview="handlePreview"
multiple={false}
accept = ".apk"
http-request={(param: any) => {
this.logic.UploadFile(param.file)
}}
limit={1}
file-list={[]}>
<el-button type="primary">Apk安装包<i class="el-icon-upload el-icon--right"></i></el-button>
<div slot="tip" class="el-upload__tip">apk文件500MB</div>
</el-upload>
</el-form-item>
<el-form-item label="App更新介绍">
<el-input type="textarea" rows={5} vModel={this.logic.addNewsuUpdate.update_content} placeholder="请输入App更新介绍多行请换行。例如\n1完善XXX功能\n2: 实现xxx功能"></el-input>
</el-form-item>
<el-form-item label="是否强制更新">
<el-switch
on-change={(e:any) => {
e
? this.logic.addNewsuUpdate.update_force = 1
: this.logic.addNewsuUpdate.update_force = 0
console.log(this.logic.addNewsuUpdate.update_force)
}}
vModel={this.logic.updateForce}>
</el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button onClick={() => {this.logic.isShowAddNewUpdate = false}}> </el-button>
<el-button type="primary" onClick={() => this.logic.SetaddNewsuUpdate()}> </el-button>
</span>
</el-dialog>
)
}
protected render() {
return (
<div class="AppVsersion">
{ this.AddNewUpdate() }
<PageHeader title="App版本管理" subtitle="发布删除查看App版本"></PageHeader>
<el-form inline={ true } onInput={ () => {} } class="demo-form-inline">
<el-form-item label="版本号">
<el-input clearable="" vModel={ this.logic.params.update_version } placeholder="请输入App版本号"></el-input>
</el-form-item>
<el-form-item label="是否强制更新">
<el-select clearable=""
onChange={() => this.logic.params.page = 1}
vModel={ this.logic.params.update_force }
placeholder="请选择类型">
<el-option label="强制" value="1"></el-option>
<el-option label="不强制" value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" onClick={ async () => await this.logic.GetUpdateList() }>
</el-button>
<el-button type="success" onClick={() => {this.logic.isShowAddNewUpdate = true}}>
</el-button>
</el-form-item>
</el-form>
<el-table
data={ this.logic.updateList }
border
stripe
default-sort={{prop: 'opus_id', order: 'ascending'}}
style="width: 100%">
<el-table-column
fixed="left"
{
...{
scopedSlots: {
default: (data: any) => {
return <el-popconfirm icon="el-icon-info"
on-confirm={async ()=> {
await this.logic.deleteUpdate(data.row)
}}
icon-color="red"
title="确定删除此版本吗?">
<el-button slot="reference" type="danger" icon="el-icon-delete" ></el-button>
</el-popconfirm>
}
}
}
}
label="操作">
</el-table-column>
<el-table-column
prop="update_id"
sortable
label="版本编号">
</el-table-column>
<el-table-column
prop="update_version"
sortable
label="版本号">
</el-table-column>
<el-table-column
prop="update_version_code"
sortable
label="版本号整型">
</el-table-column>
{/*<el-table-column*/}
{/* prop="update_size"*/}
{/* {*/}
{/* ...{*/}
{/* scopedSlots: {*/}
{/* default: (data: any) => {*/}
{/* return <span>{data.row.update_size / 1000000}MB</span>*/}
{/* }*/}
{/* }*/}
{/* }*/}
{/* }*/}
{/* sortable*/}
{/* label="App大小">*/}
{/*</el-table-column>*/}
<el-table-column
{
...{
scopedSlots: {
default: (data: any) => {
return <el-link type="info" icon="el-icon-download" href={data.row.update_down_url} target="_blank"></el-link>
}
}
}
}
label="App下载地址">
</el-table-column>
<el-table-column
prop="update_content"
label="更新的功能介绍">
</el-table-column>
<el-table-column
prop="update_force"
{
...{
scopedSlots: {
default: (data: any) => {
return data.row.update_force == 1
? <el-link type="danger" underline={false}></el-link>
: <el-link type="warning" underline={false}></el-link>
}
}
}
}
label="是否强制更新">
</el-table-column>
<el-table-column
prop="update_down_count"
sortable
label="下次次数">
</el-table-column>
<el-table-column
prop="update_time"
sortable
label="发布时间">
</el-table-column>
</el-table>
</div>
)
}
}

View File

@@ -0,0 +1 @@
1e3d43e2-c5ae-4809-98bd-13a55a7a7801

View File

@@ -0,0 +1,30 @@
// import "@pageLess/OpusAudit.less";
import { Component, Vue } from 'vue-property-decorator';
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import UserVerifyList from "@components/UserVerifyList";
@Component
export default class AvatarAudit extends VueCustomize {
private RouterMeta: RouterMeta = {
title: '头像审核',
isLogin: false
};
public async created() {
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render(): JSX.Element {
return (
<div class="AvatarAudit">
<UserVerifyList type="avatar" title="头像审核" subtitle="对用户发布的头像进行审核"></UserVerifyList>
</div>
)
}
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
// import "@pageLess/OpusAudit.less";
import { Component, Vue } from 'vue-property-decorator';
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import UserVerifyList from "@components/UserVerifyList";
@Component
export default class NicknameAudit extends VueCustomize {
private RouterMeta: RouterMeta = {
title: '昵称审核',
isLogin: false
};
public async created() {
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render(): JSX.Element {
return (
<div class="NicknameAudit">
<UserVerifyList type="nickname" title="昵称审核" subtitle="对用户添加的昵称进行审核"></UserVerifyList>
</div>
)
}
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
// import "@pageLess/OpusAudit.less";
import { Component, Vue } from 'vue-property-decorator';
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import UserVerifyList from "@components/UserVerifyList";
@Component
export default class SignatureAudit extends VueCustomize {
private RouterMeta: RouterMeta = {
title: '签名审核',
isLogin: false
};
public async created() {
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render(): JSX.Element {
return (
<div class="SignatureAudit">
<UserVerifyList type="signature" title="签名审核" subtitle="对用户修改的签名进行审核"></UserVerifyList>
</div>
)
}
}

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c) 2020. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import "@pageLess/Home.less";
import { Component } from 'vue-property-decorator';
import { HomeLogic } from "@logic/page/Home.logic";
import { Getter } from "vuex-class";
import { RouterMeta, VueCustomize } from "@logic/Base.type";
import { IndexUtils } from "@utils/index.utils";
import { Autowired } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
@Component
export default class Home extends VueCustomize {
// RouterMeta 是 vue-router 路由meta配置信息会被ast提取注入到自动生成的路由配置文件中
public RouterMeta: RouterMeta = {
title: '首页',
isLogin: true
}
@Autowired
public readonly UserServiceImpl!: UserServiceImpl;
@Autowired
public readonly Utils!: IndexUtils;
@Getter('GettersTabsContentArr') public readonly getterFoo!: Array<any>;
// 抽离组件所有逻辑到独立类,解耦页面和数据
private logic: HomeLogic<Home> = new HomeLogic(this);
public async created() {
await this.logic.StartUp();
}
protected render(): JSX.Element {
return (
<div class="home">
</div>
)
}
}

View File

@@ -0,0 +1,76 @@
import "@pageLess/Login.less";
import { Component, Vue } from 'vue-property-decorator';
import { LoginLogic } from "@logic/page/Login.logic";
import { Route, RawLocation } from 'vue-router';
import { RouterMeta, VueCustomize } from "@logic/Base.type";
@Component
export default class Login extends VueCustomize {
private logic: LoginLogic<Login> = new LoginLogic(this);
private RouterMeta: RouterMeta = {
title: '用户登录',
isLogin: false
};
public async created() {
await this.logic.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render(): JSX.Element {
return (
<div class="login">
<div class="login_img">
<div class="circular"></div>
<el-carousel autoplay={false} class="banner" height="340px">
{
this.logic.Banner.map((v,i) => {
return (
<el-carousel-item>
<img src={v.img} alt=""/>
<div class="banner_title">{ v.title }</div>
</el-carousel-item>
)
})
}
</el-carousel>
</div>
<div class="login_input">
<div class="center">
<div class="login_text">
<small></small>
</div>
<div class="login_form">
<input v-model={this.logic.UserLoginParams.admin_user_name}
type="text" placeholder="账户名"/>
<input v-model={this.logic.UserLoginParams.admin_user_pwd}
type="password" placeholder="密码"/>
<div class="LoginSubmit">
<div class="login_button" onClick={() => this.logic.UserLogin() }>
<i class="el-icon-right"></i>
</div>
<div class="reg_text">
<span> </span>
</div>
</div>
<i></i>
</div>
</div>
</div>
</div>
)
}
}

View File

@@ -0,0 +1 @@
19986669-72d0-43ee-897a-2ff23d23bdfc

View File

@@ -0,0 +1 @@
7a8a39a1-5ddb-49d6-a478-c10b30d91a15

View File

@@ -0,0 +1,101 @@
/*
* Copyright (c) 2023. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { ConfigureConfig } from "@config/configure.config";
import AxioDao from "@dao/index.dao";
interface ParamsType {
url?: string
useHandle?: boolean
header?: { [key: string]: any }
}
/**
* GET 请求注解
* @param RequestParams
* @constructor
*/
export function GET(RequestParams?: ParamsType) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
// 参数默认值
let Params: ParamsType = { url: '', useHandle: false, header: {} };
Params.url = RequestParams?.url || ConfigureConfig.AjaxConfig.ApiList[propertyKey]
Params.useHandle = RequestParams?.useHandle || Params.useHandle
Params.header = RequestParams?.header || Params.header
CheckParams('get', target, propertyKey, descriptor, Params)
}
}
/**
* POST 请求注解
* @param RequestParams
* @constructor
*/
export function POST(RequestParams?: { url?: string, useHandle?: boolean, header?: { [key: string]: any } }) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
let Params: ParamsType = { url: '', useHandle: false, header: {} }
Params.url = RequestParams?.url || ConfigureConfig.AjaxConfig.ApiList[propertyKey]
Params.useHandle = RequestParams?.useHandle || Params.useHandle
Params.header = RequestParams?.header || Params.header
CheckParams('post', target, propertyKey, descriptor, Params)
}
}
/**
* PUT 请求注解
* @param RequestParams
* @constructor
*/
export function PUT(RequestParams?: { url?: string, useHandle?: boolean, header?: { [key: string]: any } }) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
let Params: ParamsType = { url: '', useHandle: false, header: {} }
Params.url = RequestParams?.url || ConfigureConfig.AjaxConfig.ApiList[propertyKey]
Params.useHandle = RequestParams?.useHandle || Params.useHandle
Params.header = RequestParams?.header || Params.header
CheckParams('put', target, propertyKey, descriptor, Params)
}
}
/**
* DELETE 请求注解
* @param RequestParams
* @constructor
*/
export function DELETE(RequestParams?: { url?: string, useHandle?: boolean, header?: { [key: string]: any } }) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
let Params: ParamsType = { url: '', useHandle: false, header: {} }
Params.url = RequestParams?.url || ConfigureConfig.AjaxConfig.ApiList[propertyKey]
Params.useHandle = RequestParams?.useHandle || Params.useHandle
Params.header = RequestParams?.header || Params.header
CheckParams('delete', target, propertyKey, descriptor, Params)
}
}
function CheckParams(methods: string, target: any, propertyKey: string, descriptor: PropertyDescriptor, Params: any) {
let OldMethods = descriptor.value;
if (Params.useHandle) {
descriptor.value = async (data: { [key: string]: any }) => {
// @ts-ignore
let res = await AxioDao[methods]({
url : Params.url,
data : data,
header: Params.header
});
await OldMethods.apply(target, [res]);
}
return descriptor
} else {
descriptor.value = async (data: { [key: string]: any }) => {
// @ts-ignore
return await AxioDao[methods]({
url: Params.url, data: data, header: Params.header
})
}
return descriptor
}
}

View File

@@ -0,0 +1,22 @@
/*
* Copyright (c) 2020. bmy
*/
import IocModel from "@ann/Ioc.model";
export function Injectable(constructor: { new(...args: any[]): {}; }) {
if(IocModel.classPool.indexOf(constructor) !== -1) {
throw new Error('No need to repeatedly collect classes');
} else {
IocModel.classPool = [ constructor ]
}
}
export function Autowired(target: any, propertyName: string) {
const propertyType: any = Reflect.getMetadata('design:type', target, propertyName);
if(IocModel.classPool.indexOf(propertyType) == -1) {
throw new Error('The variable type class to which the decorated attribute belongs has not been injected by the decorator @ Injectable(). Please check!');
} else {
target[propertyName] = new (IocModel.classPool[IocModel.classPool.indexOf(propertyType)])()
}
}

View File

@@ -0,0 +1,18 @@
/*
* Copyright (c) 2020. bmy
*/
class IocModel {
private _classPool: Array<{ new(...args: any[]): {}; }> = [];
get classPool(): Array<{ new(...args: any[]): {} }> {
return this._classPool;
}
set classPool(value: Array<{ new(...args: any[]): {} }>) {
this._classPool = [ ...value, ...this._classPool ]
}
}
export default new IocModel();

View File

@@ -0,0 +1,50 @@
/*
* Copyright (c) 2020. bmy
*/
import Vue from 'vue';
import { ConfigureConfig } from "@config/configure.config";
import { CreateElement } from 'vue/types/umd';
export function Start<T extends { new ( ...args: any[] ): { } }>( _ : T ) : T {
// @ts-ignore
return class extends _ {
constructor() {
super();
(new Vue({
// @ts-ignore
router: this.Router, store: this.VueX, render: (h: CreateElement) => h(this.app)
}) as Vue).$mount('#app')
}
}
}
export function RegServiceAndMethods(constructor: { new(...args: any[]): {}; }) {
newInstance(require.context("../service/impl", false, /\.ts$/))
newInstance(require.context("../utils", false, /\.ts$/))
}
function newInstance(context: __WebpackModuleApi.RequireContext) {
context.keys().forEach((key: any) => {
let m = context(key), className: string = Object.keys(m)[0];
new m[className]()
});
}
/**
* 自动注册Vue插件
* @constructor
*/
export function RegVuePlugs(constructor: { new(...args: any[]): {}; }) {
ConfigureConfig.VuePlugs.forEach((v: any) => Vue.use(v))
}
/**
* 自动挂载Vue 全局方法
* @constructor
*/
export function GlobalMethod(target: any, propertyKey: string) {
Vue.prototype[`$${ propertyKey }`] = target[propertyKey]
}

View File

@@ -0,0 +1 @@
018b59fb-c351-48ec-a090-6df45f135099

View File

@@ -0,0 +1,58 @@
/*
* Copyright (c) 2020. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import VueRouter, { RouterOptions } from 'vue-router';
import Vuex from 'vuex';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import { AutoRoutesConfig } from "@config/route.config";
import { PluginObject } from "vue";
export class ConfigureConfig {
/**
* 接口配置: 测试环境基地址,正式环境基地址,具体页面接口
*/
public static AjaxConfig: {
DevUrl: string,
ProdUrl: string,
ApiList: { [ key: string ]: string }
} = {
DevUrl: 'https://moehu.net/admin',
ProdUrl: 'https://moehu.net/admin',
ApiList: {
Login: '/user/Login',
OpusAudit: '/opus/OpusAudit',
OpusInfo: '/opus/OpusInfo',
Approved: '/opus/Approved',
UserVerifyList: '/user/UserVerifyList',
UserReview: '/user/UserReview',
UserItemInfo: '/user/UserItemInfo',
UpdateList: '/tool/UpdateList',
UploadFile: '/tool/UploadFile',
addNewUpdate: '/tool/addNewUpdate',
deleteUpdate: '/tool/deleteUpdate'
}
};
/**
* Vue 插件
*/
public static VuePlugs: PluginObject<never>[] | any = [
VueRouter, Vuex, ElementUI
];
/**
* 路由配置
*/
public static RouterConfigUrl: RouterOptions = {
mode : 'hash',
base : './',
routes : AutoRoutesConfig
};
}

View File

@@ -0,0 +1,62 @@
// 根据page目录结构自动生成的路由配置文件
// 参考Nuxt.jshttps://zh.nuxtjs.org/guide/routing
// @ts-ignore
export const AutoRoutesConfig = [
{
name: "login",
path: "/login",
component: () => import(/* webpackChunkName: 'login' */ '@page/login'),
meta: {title:'用户登录',isLogin:false}
},
{
name: "index",
path: "/",
component: () => import(/* webpackChunkName: 'index' */ '@page/index'),
meta: {title:'layout',isLogin:false},
children: [
{
name: "index-home",
path: "home",
component: () => import(/* webpackChunkName: 'indexhome' */ '@page/index/home'),
meta: {title:'首页',isLogin:true}
},
{
name: "index-OpusManage-OpusAudit",
path: "OpusManage/OpusAudit",
component: () => import(/* webpackChunkName: 'indexOpusManageOpusAudit' */ '@page/index/OpusManage/OpusAudit'),
meta: {title:'作品审核',isLogin:false}
},
{
name: "index-OpusManage-ReportAudit",
path: "OpusManage/ReportAudit",
component: () => import(/* webpackChunkName: 'indexOpusManageReportAudit' */ '@page/index/OpusManage/ReportAudit'),
meta: {title:'作品举报审核',isLogin:false}
},
{
name: "index-OtherManage-AppVsersion",
path: "OtherManage/AppVsersion",
component: () => import(/* webpackChunkName: 'indexOtherManageAppVsersion' */ '@page/index/OtherManage/AppVsersion'),
meta: {title:'App版本管理',isLogin:true}
},
{
name: "index-UserManage-AvatarAudit",
path: "UserManage/AvatarAudit",
component: () => import(/* webpackChunkName: 'indexUserManageAvatarAudit' */ '@page/index/UserManage/AvatarAudit'),
meta: {title:'头像审核',isLogin:false}
},
{
name: "index-UserManage-NicknameAudit",
path: "UserManage/NicknameAudit",
component: () => import(/* webpackChunkName: 'indexUserManageNicknameAudit' */ '@page/index/UserManage/NicknameAudit'),
meta: {title:'昵称审核',isLogin:false}
},
{
name: "index-UserManage-SignatureAudit",
path: "UserManage/SignatureAudit",
component: () => import(/* webpackChunkName: 'indexUserManageSignatureAudit' */ '@page/index/UserManage/SignatureAudit'),
meta: {title:'签名审核',isLogin:false}
}
]
}
];

View File

@@ -0,0 +1 @@
8cd25405-4681-4315-ad91-bf4e0b6ad44b

View File

@@ -0,0 +1,115 @@
/*
* Copyright (c) 2020. bmy
*/
import axios, {AxiosInstance, AxiosRequestConfig, AxiosResponse} from "axios";
import { IndexUtils } from "@utils/index.utils";
import { Notification, Loading } from 'element-ui';
import { ElLoadingComponent } from 'element-ui/types/loading';
let loadingInstance!: ElLoadingComponent;
/**
* axios的封装
*/
export class AxioDao {
private http!: AxiosInstance;
public constructor() {
this.http = axios.create({
baseURL: IndexUtils.CheckAjaxUrl(),
timeout: 10000,
headers: {}
});
this.Interceptor()
}
public async get(params: { url: string, data: Object, header?: object }): Promise<Object> {
return await this.http.get(params.url, {
params : params.data,
headers : Object.assign({
token : localStorage.getItem("moehu_token")
}, params.header)
});
}
public async post(params: { url: string, data: Object, header?: Object }): Promise<Object> {
return await this.http.post(params.url, params.data, {
headers : Object.assign({
token : localStorage.getItem("moehu_token")
}, params.header)
})
}
/**
* Put 请求
* 请求参数请参考接口RequestParams
* @param params
*/
public async put(params: { url: string, data: Object, header?: object }): Promise<Object> {
return await this.http.put(params.url, params.data)
}
/**
* delete 请求
* 请求参数请参考接口RequestParams
* @param params
*/
public async delete(params: { url: string, data: Object, header?: object }): Promise<Object> {
return await this.http.delete(params.url, { params : params.data })
}
/**
* 拦截器
* @constructor
*/
public async Interceptor() {
// 请求拦截器
this.http.interceptors.request.use((config: AxiosRequestConfig) => {
loadingInstance = Loading.service({
fullscreen: true,
text: '加载中,稍后...'
})
return config
}, (error: Error) => {
return Promise.reject(error)
})
// 响应拦截器
this.http.interceptors.response.use((response: AxiosResponse) => {
loadingInstance.close();
switch (response.data.code) {
case 200:
return response.data.data;
case 100:
return;
case 404:
Notification({
title: "操作成功",
message: response.data.message,
type: "error"
});
throw new Error(response.data.message)
case 500:
Notification({
title: "错误",
message: response.data.message,
type: "error"
});
throw new Error(response.data.message)
}
}, (error: Error) => {
return Promise.reject(error)
})
}
}
export default new AxioDao();

View File

@@ -0,0 +1 @@
cfcad232-07cd-4da0-8f19-d48ef02b301f

View File

@@ -0,0 +1,54 @@
/*
* Copyright (c) 2020. bmy
*/
import 'reflect-metadata';
import 'babel-polyfill'
import Es6Promise from 'es6-promise'
import '@types/RouterHooks';
import Vue, { VueConstructor, Component } from 'vue';
import App from '@application/App'
import { ConfigureConfig } from "@config/configure.config";
import NavigationGuards from "@utils/NavigationGuards.utils";
import VueRouter, { RawLocation, Route } from 'vue-router';
import Vuex, { Store } from 'vuex'
import StoreModeule from '@store/index'
import { RegServiceAndMethods, RegVuePlugs, Start } from "@ann/Register.annotation";
import { Autowired } from "@ann/Ioc.annotation";
Es6Promise.polyfill()
@Start
@RegVuePlugs
@RegServiceAndMethods
export class InitRun {
@Autowired
protected NavigationGuards!: NavigationGuards;
protected Router!: VueRouter;
protected VueX!: Store<typeof StoreModeule>;
protected app: Component = App;
constructor() {
Vue.config.productionTip = false;
this.VueRouterAndVuex()
}
private VueRouterAndVuex(): void {
this.Router = new VueRouter(ConfigureConfig.RouterConfigUrl);
this.NavigationGuards.beforeEach(this.Router)
this.NavigationGuards.afterEach(this.Router)
// 重写路由Push
const routerPush: (location: RawLocation) => Promise<Route> = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location: RawLocation): Promise<Route> {
// @ts-ignore
return routerPush.call(this, location).catch((error: Error) => error)
};
this.VueX = new Vuex.Store(StoreModeule)
}
}
new InitRun();

View File

@@ -0,0 +1 @@
1b5f80da-c825-49ca-a486-d5f88d46e645

View File

@@ -0,0 +1,17 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { PaginationRes } from "@service/type/res/Pagination.res"
import { OpusRes } from "@service/type/res/Opus.res"
import { ApprovedParams, OpusAuditParams, OpusInfoParams } from "@service/type/req/Opus.req";
export interface OpusAuditService {
OpusAudit(params: OpusAuditParams): Promise<PaginationRes<Array<OpusRes>>>;
OpusInfo(params: OpusInfoParams): Promise<OpusRes>;
Approved(params: ApprovedParams): Promise<void>;
}

View File

@@ -0,0 +1,15 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { PaginationRes } from "@service/type/res/Pagination.res";
import { UpdateListParams, UpdateListResponseModel } from "@service/type/res/Tool.res";
export interface ToolService {
addNewUpdate(params: UpdateListResponseModel): Promise<String>;
deleteUpdate(params: UpdateListResponseModel): Promise<String>;
UploadFile(params: any): Promise<{ img_url: string }>;
UpdateList(params: UpdateListParams): Promise<PaginationRes<Array<UpdateListResponseModel>>>;
}

View File

@@ -0,0 +1,43 @@
/*
* Copyright (c) 2020. bmy
*/
import { Page } from "@service/type/req/Page.req";
import { PaginationRes } from "@service/type/res/Pagination.res";
import { OpusRes, UserInfoResponseModel } from "@service/type/res/Opus.res";
import { UserVerifyRes } from "@service/type/res/UserVerify.res";
// 登录接口的参数
export interface LoginParams {
admin_user_name: string,
admin_user_pwd: string,
}
// 登录接口返回的数据
export interface LoginResponse {
user_info: {
admin_user_id: number,
admin_user_type: number,
admin_user_name: string,
admin_user_pwd: null,
},
user_token: string
}
// 获取签名,昵称,头像审核的接口参数
export interface UserVerifyListParams extends Page {
user_nickname?: string,
user_verify_status?: string
}
export interface UserReviewParams {
user_verify_id?: number,
user_verify_status?: number
}
export interface UserService {
Login(params: LoginParams): Promise<LoginResponse>;
UserItemInfo(params: { user_verify_id: number }): Promise<UserInfoResponseModel>;
UserReview(params: UserReviewParams): Promise<void>;
UserVerifyList(params: UserVerifyListParams): Promise<PaginationRes<Array<UserVerifyRes>>>;
}

View File

@@ -0,0 +1 @@
cf386bd6-615e-415f-8e49-4cd091f7b2ff

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Injectable } from "@ann/Ioc.annotation";
import { POST } from "@ann/Http.annotation";
import { OpusInfoParams } from "@service/type/req/Opus.req";
import { OpusAuditService } from "@service/OpusAudit.service";
import { PaginationRes } from "@service/type/res/Pagination.res";
import { OpusRes } from "@service/type/res/Opus.res";
import { ApprovedParams, OpusAuditParams, } from "@service/type/req/Opus.req";
@Injectable
export class OpusAuditServiceImpl implements OpusAuditService {
@POST()
// @ts-ignore
public async OpusAudit(params: OpusAuditParams): Promise<PaginationRes<Array<OpusRes>>> {}
@POST()
// @ts-ignore
public async OpusInfo(params: OpusInfoParams): Promise<OpusRes> {}
@POST()
public async Approved(params: ApprovedParams): Promise<void> {}
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Injectable } from "@ann/Ioc.annotation";
import { ToolService } from "@service/Tool.service";
import { PaginationRes } from "@service/type/res/Pagination.res";
import { POST } from "@ann/Http.annotation";
import { UpdateListParams, UpdateListResponseModel } from "@service/type/res/Tool.res";
@Injectable
export class ToolServiceImpl implements ToolService {
@POST()
// @ts-ignore
UpdateList(params: UpdateListParams): Promise<PaginationRes<Array<UpdateListResponseModel>>> {}
@POST({ header: { 'Content-Type': 'multipart/form-data' }})
// @ts-ignore
UploadFile(params: FormData): Promise<{ img_url: string }> {}
@POST()
// @ts-ignore
addNewUpdate(params: UpdateListResponseModel): Promise<String> {}
@POST()
// @ts-ignore
deleteUpdate(params: UpdateListResponseModel): Promise<String> {}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c) 2020. bmy
*/
import { LoginParams, LoginResponse, UserReviewParams, UserService, UserVerifyListParams } from "@service/User.service";
import { Injectable } from "@ann/Ioc.annotation";
import { POST } from "@ann/Http.annotation";
import { PaginationRes } from "@service/type/res/Pagination.res";
import { UserVerifyRes } from "@service/type/res/UserVerify.res";
import { UserInfoResponseModel } from "@service/type/res/Opus.res";
@Injectable
export class UserServiceImpl implements UserService {
@POST()
// @ts-ignore
public async Login(params: LoginParams): Promise<LoginResponse> {}
@POST()
// @ts-ignore
public async UserVerifyList(params: UserVerifyListParams): Promise<PaginationRes<Array<UserVerifyRes>>> {}
@POST()
// @ts-ignore
UserReview(params: UserReviewParams): Promise<void> {}
@POST()
// @ts-ignore
UserItemInfo(params: { user_verify_id: number }): Promise<UserInfoResponseModel> {}
}

View File

@@ -0,0 +1 @@
d71327d4-2730-4fe7-be27-3eca1df2e3a7

View File

@@ -0,0 +1 @@
c71d1dd8-6f10-40cd-96b3-6f481c5ff187

View File

@@ -0,0 +1,22 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
import { Page } from "@service/type/req/Page.req";
export interface OpusInfoParams {
opus_id: number;
}
export interface OpusAuditParams extends Page {
opus_title?: string;
opus_status?: number;
opus_type?: number;
opus_original?: number;
}
export interface ApprovedParams extends OpusInfoParams {
opus_status: number;
}

View File

@@ -0,0 +1,10 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
export interface Page {
page: number;
count: number;
}

View File

@@ -0,0 +1 @@
de6a3fe5-3cb5-4b05-b202-a11e1ba13ef1

View File

@@ -0,0 +1,79 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
// 作品的接口返回数据类型
export interface OpusRes {
opus_id: number;
user_id: number;
opus_title: string;
opus_introduce: string;
opus_time: string;
opus_satisfied: number;
opus_see: number;
opus_follow: number;
opus_collection: number;
opus_img: string;
opus_status: number;
opus_type: number;
opus_original: number;
opus_jurisdiction: number;
opus_is_edit: number;
comment: Array<CommentResponseModel>;
news_opus: Array<OpusRes>;
user_info: UserInfoResponseModel;
opus_imgs: Array<OpusImgsResponseModel>;
tags: Array<TagsResponseModel>
}
// 评论的接口返回数据类型
export interface CommentResponseModel {
comment_id: number;
opus_id: number;
dynamic_id: number;
user_id: number;
comment_content: string;
comment_time: string;
comment_reply_id: number;
comment_to_username: string;
user_nickname: string;
user_head_img: string;
comment_type: number;
child: Array<CommentResponseModel>
}
// 用户信息的接口返回数据类型
export interface UserInfoResponseModel {
user_id: number;
user_phone: string;
user_real_name: string;
user_id_card: string;
user_email: string;
user_bank_card: string;
user_sex: string;
user_work: string;
user_head_img: string;
user_nickname: string;
user_uid: string;
user_reg_time: string;
user_birthday: string;
user_constellation: string;
user_autograph: string
}
export interface OpusImgsResponseModel {
opus_id: number;
img_url: string;
user_id: number;
img_id: number
}
export interface TagsResponseModel {
tags_id: number;
opus_id: number;
tags_title: string;
tags_recommend: number;
user_id: number
}

View File

@@ -0,0 +1,15 @@
/*
* Copyright (c) 2021. bmy
* Email2271608011@qq.com
* Githubhttps://github.com/helpcode
*/
/**
* 分页查询数据的类型
*/
export interface PaginationRes<T> {
next_page: number,
result: T,
total_page: number,
current_page: number
}

Some files were not shown because too many files have changed in this diff Show More