first commit

This commit is contained in:
编码猿
2024-09-27 01:28:38 +08:00
commit a9bde91e8e
2653 changed files with 701970 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
> 1%
last 2 versions
not ie < 9

View File

@@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View File

@@ -0,0 +1 @@
904f434f-9a2f-406d-bfd6-f1acab5b1f25

View File

@@ -0,0 +1,183 @@
## TsxVueClassApi
基于`Vue Class Api``TypeScript``JSX`,搭建的一套项目脚手架,实现了很多常用的注解,同时基于`babel`插件通过`Ast`语法树进行路由配置文件的自动生成等。
如果你喜欢`JSX`,那么这套脚手架你应该会十分喜欢,代码语法如下:
```tsx
import "@pageLess/Home.less";
import { Component, Vue } from 'vue-property-decorator';
import HelloWorld from '@components/HelloWorld';
import { HomeLogic } from "@logic/page/Home.logic";
import { Route, RawLocation } from 'vue-router';
import { Getter } from "vuex-class";
import { BaseLayout, RouterMeta } from "@layout/base.layout";
@Component
export default class Home extends BaseLayout {
// 抽离tsx页面组件中所有js业务逻辑到独立的类中tsx组件只负责页面
// 因为tsx内部this指向Vue而logic.ts 中this默认指向类本身但是这里需要this指向Vue和类本身
// 所以这里传入tsx中的this对象
private HomeLogic: HomeLogic = new HomeLogic(this);
// RouterMeta 是 vue-router 的路由 meta 配置信息,
// 会被我的插件通过ast语法树提取注入到自动生成的路由配置
// 文件中,所以名字不要随意改动,值请随便!
private RouterMeta: RouterMeta = {
title: '首页',
showNav: true,
isLogin: true
}
@Getter('GettersTabsContentArr') public readonly getterFoo!: Array<any>;
public async created() {
// utils/文件夹下中所有类中的方法,只要使用了装饰器 @GlobalMethod()
// 那么被装饰方法就会自动 prototype 到vue中的全局方法中
console.log(this.$setToken())
await this.HomeLogic.StartUp();
}
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
console.log('beforeRouteEnter')
next()
}
// 按钮组件
public ClickButton(): JSX.Element {
return (
<el-button type="danger" onclick={async ()=>{
await this.HomeLogic.getData()
}}>发送请求</el-button>
)
}
protected render() {
return (
<div class="home">
<HelloWorld msg="向HelloWorld props传参"/>
<input type="text" v-model={this.HomeLogic.title}/>
<h2>{this.HomeLogic.title}</h2>
{this.ClickButton()}
<ul>
{
this.HomeLogic.List.map((v:any)=>{
return <li>{v.name}</li>
})
}
</ul>
</div>
)
}
}
```
**这个脚手架我们正在项目中使用也在支持开发和完善阶段**
## 1安装
> git clone https://gitee.com/bmycode/vue-class-api-tsx.git
> npm i
> npm run start
**注意**
`Vue`官方原生底层就支持`JSX`语法,但是官方没有关于`Vue`中使用`JSX`的文档,而且很多`Vue`ui框架和第三方插件都没有相关语法但是这不影响我们在`Vue`中正常使用`JSX`。很多语法需要特殊注意和改造一下!!
## 2使用
下面说下这个脚手架的使用和注意事项。
### 2.1:项目结构
```txt
├── README.md
├── babel.config.js babel配置文件
├── bin 终端NewFile工具
│   ├── config
│   │   └── index.js
│   └── tinit
├── dist 打包后的文件夹
├── gulpfile.js gulp配置文件实现监听page自动生成路由文件
├── package.json 核心依赖配置文件
├── public 公共的资源文件
├── src 存放核心源码
│   ├── application 页面相关
│   │   ├── App.tsx 最外层顶级父组件
│   │   ├── assets 静态资源回合webpack打包进源码
│   │   ├── components 公共组件
│   │   ├── layout TSX组件的父类
│   │   ├── logic TSX组件中的js逻辑抽象层
│   │   │   ├── Base.logic.ts 所有TSX组件的js逻辑父类
│   │   │   └── page 对应页面的TSX组件逻辑抽象
│   │   └── page 存放TSX页面组件
│   └── core 核心JS层
│   ├── annotation 存放自己开发的装饰器
│   │   ├── Http.annotation.ts 请求装饰器
│   │   ├── Ioc.annotation.ts IOC依赖装饰器
│   │   └── Register.annotation.ts 启动装饰器
│   ├── config 站点配置文件
│   │   ├── configure.config.ts 核心配置文件
│   │   └── route.config.ts 自动生成的路由配置文件
│   ├── dao axios的封装
│   ├── model TS存取器
│   ├── run 项目的启动类
│   │   ├── init.run.ts 初始化Vue各种配置
│   │   └── start.run.ts 初始化Vue
│   ├── service 请求的service层封装
│   │   └── impl 请求service的具体类
│   ├── store Vuex的配置
│   ├── types 自定义的声明文件
│   └── utils 工具函数
├── tsconfig.json TS的配置文件
└── vue.config.js Vue-cli3 的配合文件
```
### 2.2:使用注意事项
**1** 项目中的路由使用的是`vue-router`,同时我借鉴了`Nuxt.js`的思想,自己开发了路由配置文件自动生成的插件,这个插件是`Vue-cli 3`的插件,所以不能在`Vue cli 2`的项目中使用!!
插件源码已经提交`npm`包市场!请完整阅读下面的插件文档,路由的配置文件让插件帮我们自动生成就好了!!!
[vue-cli-plugin-tsx-autorouter](https://www.npmjs.com/package/vue-cli-plugin-tsx-autorouter)
**2** 同时借鉴`PHP`开发框架`Laravel`开发终端命令行工具,通过命令帮我们创建带有模板代码能直接运行的文件!代码放在 `bin/` 文件夹中!
使用手册:
```bash
╭─bmy@MacBook-Pro /Applications/Source/TsxVueClassApi master*
╰─$ ./bin/tinit -h
Usage: tinit [options]
Options:
-t, --file-type <type> 文件类型: [pagelogicserviceimplless]
-n, --file-name <name> 被创建的文件名称
-i, --is-create <is> 是否为 -t 参数自动创建相关文件类型 (default: false)
-v, --version 显示当前的版本
-h, --help display help for command
```
参数说明:
- -t需要被创建的文件类型取值 pageTSX页面logicTSX页面的js抽象层service请求中间层的接口impl实现接口的类lesscss样式文件。可以多传
- -n需要被创建的文件名
- -i如果数值为true那么会自动创建 -t 参数所有的文件类型
使用案例:
```bash
╭─bmy@MacBook-Pro /Applications/Source/TsxVueClassApi master*
╰─$ ./bin/tinit -t page logic -n Test
成功创建文件...
```
上面命令执行后会分别在`src/application/page`中创建创建文件`Text.tsx`页面组件,同时在`src/application/logic/page`中创建`Test.logic.ts`的逻辑层文件。
多试几次,请自行熟练掌握!!
## 3开发中功能
- [ ] 1实时监听`configure.config.ts`配置文件,然后根据`ApiList`中的对象`key`名称自动在`service`层的类中生成对应的方法,降低手动复制的低效率!
- [ ] 2实现对整个项目所有类的收集然后各个文件不需要多次对各种文件的引入

View File

@@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

View File

@@ -0,0 +1 @@
7c0d9e22-1922-439e-bd5a-07762a61811c

View File

@@ -0,0 +1 @@
6ed708f3-a582-4bbc-a7dd-4bff992d1ee7

View File

@@ -0,0 +1,92 @@
module.exports = {
pageConfig: (name) => {
return `
import "@pageLess/${name}.less";
import { Component, Vue } from 'vue-property-decorator';
import { ${name}Logic } from "@logic/page/${name}.logic";
import { Route, RawLocation } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
@Component
export default class ${name} extends BaseLayout {
private service: ${name}Logic = new ${name}Logic(this);
private RouterMeta: RouterMeta = {
title: '${name}',
showNav: true,
isLogin: true
};
created() {
this.service.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, VueType, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
import { Vue } from "vue-property-decorator";
import { MessageBox } from 'element-ui';
export class ${name}Logic extends BaseLogic implements Methods {
@Inject()
public readonly UserServiceImpl!: UserServiceImpl;
constructor(point: any) {
super();
this.VueApp = point;
}
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 "../color/index";
@import "../mixin/index";
.${name} {
}
`
}
}

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");
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
console.log("programOptions: ", programOptions)
console.log("OtherFileType: ", OtherFileType)
// tsx 页面路径
let PagePath = pathJoin(`../src/application/page/${UpperCase(programOptions.fileName)}.tsx`);
// logic 页面路径
let LogicPath = pathJoin(`../src/application/logic/page/${UpperCase(programOptions.fileName)}.logic.ts`);
// service 页面路径
let ServicePath = pathJoin(`../src/core/service/${UpperCase(programOptions.fileName)}.service.ts`);
// Impl 页面路径
let ImplPath = pathJoin(`../src/core/service/impl/${UpperCase(programOptions.fileName)}.service.impl.ts`);
// Less 页面路径
let LessPath = pathJoin(`../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,2 @@
type Class<T> = new () => T
type VueComponent<Props> = Class<{ $props: Props | { props: Props } }>

View File

@@ -0,0 +1,25 @@
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'));

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,49 @@
{
"name": "vue2tsx",
"version": "0.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",
"route": "vue-cli-service route"
},
"dependencies": {
"ant-design-vue": "^1.6.5",
"axios": "^0.20.0",
"core-js": "^3.6.5",
"e-icon-picker": "^1.0.7",
"element-ui": "^2.13.2",
"vue": "^2.6.11",
"vue-class-component": "^7.2.3",
"vue-property-decorator": "^8.4.2",
"vue-router": "^3.2.0",
"vuex-class": "^0.3.2"
},
"devDependencies": {
"@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.1.0",
"compression-webpack-plugin": "^5.0.1",
"concurrently": "^5.3.0",
"cross-env": "^7.0.2",
"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",
"typescript": "~3.9.3",
"uglifyjs-webpack-plugin": "^2.2.0",
"vue-cli-plugin-tsx-autorouter": "^1.3.6",
"vue-template-compiler": "^2.6.11",
"webpack-bundle-analyzer": "^3.8.0"
}
}

View File

@@ -0,0 +1 @@
61e0d196-f59c-4ba1-8e34-b10ce89f17ee

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1 @@
c2591f23-1dd0-4f85-85d2-163ae2f9e11e

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<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>
<!-- built files will be auto injected -->
</body>
</html>

View File

@@ -0,0 +1 @@
6e8f2bcd-24c5-41e9-8b52-84ad42b1c4b1

View File

@@ -0,0 +1 @@
79d23f76-7d20-44e3-ae6a-51420e3f7bc0

View File

@@ -0,0 +1,18 @@
import "@less/imports.less"
import { Component } from 'vue-property-decorator';
import { BaseLayout } from "@layout/base.layout";
@Component
export default class App extends BaseLayout {
mounted() {
}
protected render() {
return (
<div id="app">
<router-view/>
</div>
)
}
}

View File

@@ -0,0 +1 @@
0bfb5318-7e33-41d6-9847-fa21d6d5510c

View File

@@ -0,0 +1 @@
41738ca9-121e-4563-a426-c6159580aa9b

View File

@@ -0,0 +1 @@
4ce494e0-02b1-4aa0-96b2-ad442fa5d4c4

View File

@@ -0,0 +1,309 @@
// 公共css样式可以在 页面组件中直接使用变量名称
// 具体看 components/home.styl
@theme-color: red;
@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 @@
3708ca30-57af-47ef-9d26-ae6e140ba096

View File

@@ -0,0 +1,508 @@
html,body,
#app, .Login{
width: 100%;
height: 100%;
}
h1,h2,h3,h4,h5,h6,p,ul,li {
margin: 0;
padding: 0;
}
.cneter {
background: #fff;
h2 {
text-align: center;
margin: 20px 0;
font-size: 30px;
letter-spacing: 5px;
border-bottom: 4px solid #3387ff;
padding-bottom: 20px;
}
}
.avatar-uploader {
display: inline-block;
vertical-align: middle;
}
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
margin-left: 11px;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px !important;
text-align: center;
}
.avatar {
width: 80px;
height: 80px;
display: block;
}
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);
margin: 0;
}
li {
list-style: none;
}
article,
aside,
footer,
header,
nav,
section {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* 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 */
}
/**
* 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,16 @@
@vm_fontsize: 75;
@vm_design: 750;
.rem(@px) {
@result: (@px / @vm_fontsize ) * 1rem;
}
html {
font-size: (@vm_fontsize / (@vm_design / 2) ) * 100vw;
@media screen and (max-width: 320px) {
font-size: 64px;
}
@media screen and (min-width: 540px) {
font-size: 108px;
}
}

View File

@@ -0,0 +1,4 @@
// 重置ui框架css
.el-input__icon {
height: auto !important;
}

View File

@@ -0,0 +1 @@
bad7fcca-2481-4733-a4ec-7593f4d8df42

View File

@@ -0,0 +1,52 @@
.Header{
}
.HeaderTop{
// padding: 0 300px;
width: 1200px;
margin: 0 auto;
background-color: #fff;
height: 45px;
line-height: 45px;
margin-bottom: 10px;
.left{
float: left;
width: 50%;
height: 45px;
line-height: 45px;
}
.logo{
// width: 180px;
height: 45px;
margin: 0;
padding: 0;
}
.right{
float: left;
width: 50%;
.phone{
margin-right: 10px;
}
.line{
margin-right: 10px;
}
.close{
cursor: pointer;
}
}
}
.HeaderBreadColor{
background-color: #3487ff;
.HeaderBread{
width: 1200px;
margin: 0 auto;
padding: 15px 0;
.Bread{
color: #fff;
}
}
}
.el-breadcrumb__inner,.el-breadcrumb__separator{
color: #fff !important;
}

View File

@@ -0,0 +1,18 @@
.Title{
.TitleLabel{
font-size: 18px;
font-weight: bold;
text-align: center;
padding-top: 30px;
}
.TitleValue{
text-align: center;
margin-top: 10px;
}
.TitleLine{
width: 100%;
height: 2px;
background-color: #e8e8e8;
margin-top: 20px;
}
}

View File

@@ -0,0 +1,10 @@
// 公共css
@import "./common/normalize";
@import "./common/rem";
@import "./common/resetUi";
// 颜色配置
@import "./color/index";
// 公共css 方法
@import "./mixin/index";

View File

@@ -0,0 +1 @@
8b07539f-a486-48bb-a279-42a69d8ccdc9

View File

@@ -0,0 +1,295 @@
.cneter{
width: 1200px;
margin: 0 auto;
}
.floatRight{
float: right;
}
.floatLeft{
float: left;
}
.flex{
display: flex;
}
.align_items{
align-items: center
}
.left {
float: left;
}
.clearfix() {
&:after,
&:before {
content: " ";
display: table;
}
&:after {
clear: both;
}
}
.hairline(@position, @color) when (@position = top) {
&:before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: auto;
right: auto;
height: 1px;
width: 100%;
background-color: @color;
display: block;
z-index: 15;
// .transform-origin(50% 0%);
html.pixel-ratio-2 & {
.transform(scaleY(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleY(0.33));
}
}
}
.hairline(@position, @color) when (@position = left) {
&:before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: auto;
right: auto;
width: 1px;
height: 100%;
background-color: @color;
display: block;
z-index: 15;
// .transform-origin(0% 50%);
html.pixel-ratio-2 & {
.transform(scaleX(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleX(0.33));
}
}
}
.hairline(@position, @color) when (@position = bottom) {
&:after {
content: '';
position: absolute;
left: 0;
bottom: 0;
right: auto;
top: auto;
height: 1px;
width: 100%;
background-color: @color;
display: block;
z-index: 15;
html.pixel-ratio-2 & {
.transform(scaleY(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleY(0.33));
}
}
}
.hairline(@position, @color) when (@position = right) {
&:after {
content: '';
position: absolute;
right: 0;
top: 0;
left: auto;
bottom: auto;
width: 1px;
height: 100%;
background-color: @color;
display: block;
z-index: 15;
// .transform-origin(100% 50%);
html.pixel-ratio-2 & {
.transform(scaleX(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleX(0.33));
}
}
}
// For right and bottom
.hairline-remove(@position) when not (@position = left) and not (@position = top) {
&:after {
display: none;
}
}
// For left and top
.hairline-remove(@position) when not (@position = right) and not (@position = bottom) {
&:before {
display: none;
}
}
// For right and bottom
.hairline-color(@position, @color) when not (@position = left) and not (@position = top) {
&:after {
background-color: @color;
}
}
// For left and top
.hairline-color(@position, @color) when not (@position = right) and not (@position = bottom) {
&:before {
background-color: @color;
}
}
// Encoded SVG Background
.encoded-svg-background(@svg) {
@url: `encodeURIComponent(@{svg})`;
background-image: url("data:image/svg+xml;charset=utf-8,@{url}");
}
// Preserve3D
.preserve3d() {
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transform-style: preserve-3d;
}
// Shadow
.depth(@level:1) {
& when (@level = 0) {
box-shadow: none;
}
& when (@level = 1) {
box-shadow: 0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);
}
& when (@level = 2) {
box-shadow: 0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);
}
& when (@level = 3) {
box-shadow: 0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12);
}
& when (@level = 4) {
box-shadow: 0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);
}
& when (@level = 5) {
box-shadow: 0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12);
}
& when (@level = 6) {
box-shadow: 0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);
}
& when (@level = 7) {
box-shadow: 0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12);
}
& when (@level = 8) {
box-shadow: 0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);
}
& when (@level = 9) {
box-shadow: 0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12);
}
& when (@level = 10) {
box-shadow: 0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12);
}
& when (@level = 11) {
box-shadow: 0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12);
}
& when (@level = 12) {
box-shadow: 0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);
}
& when (@level = 13) {
box-shadow: 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);
}
& when (@level = 14) {
box-shadow: 0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12);
}
& when (@level = 15) {
box-shadow: 0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12);
}
& when (@level = 16) {
box-shadow: 0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);
}
& when (@level = 17) {
box-shadow: 0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12);
}
& when (@level = 18) {
box-shadow: 0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12);
}
& when (@level = 19) {
box-shadow: 0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12);
}
& when (@level = 20) {
box-shadow: 0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12);
}
& when (@level = 21) {
box-shadow: 0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12);
}
& when (@level = 22) {
box-shadow: 0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12);
}
& when (@level = 23) {
box-shadow: 0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12);
}
& when (@level = 24) {
box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);
}
// & when (@level = 1) {
// box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 6px, rgba(0, 0, 0, 0.117647) 0px 1px 4px;
// }
// & when (@level = 2) {
// box-shadow: rgba(0, 0, 0, 0.156863) 0px 3px 10px, rgba(0, 0, 0, 0.227451) 0px 3px 10px;
// }
// & when (@level = 3) {
// box-shadow: rgba(0, 0, 0, 0.188235) 0px 10px 30px, rgba(0, 0, 0, 0.227451) 0px 6px 10px;
// }
// & when (@level = 4) {
// box-shadow: rgba(0, 0, 0, 0.247059) 0px 14px 45px, rgba(0, 0, 0, 0.219608) 0px 10px 18px;
// }
// & when (@level = 5) {
// box-shadow: rgba(0, 0, 0, 0.298039) 0px 19px 60px, rgba(0, 0, 0, 0.219608) 0px 15px 20px;
// }
}
// Highlighted Links
.active-highlight(@color:rgba(255, 255, 255, 0.15)){
&:before {
content: '';
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
background-color: @color;
background-repeat: no-repeat;
background-position: center;
background-size: 100% 100%;
opacity: 0;
pointer-events: none;
.transition(600ms);
}
&.active-state:before,
html:not(.watch-active-state) &:active:before {
opacity: 1;
.transition(150ms);
}
}
.active-highlight-color(@color) {
&:before {
background-image: -webkit-radial-gradient(center, circle cover, @color 66%, rgba(red(@color),green(@color),blue(@color),0) 66%);
background-image: radial-gradient(circle at center, @color 66%, rgba(red(@color),green(@color),blue(@color),0) 66%);
}
}
// No Scrollbar
.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 @@
c581b0a3-5c65-4f1b-b08c-589f95ce8565

View File

@@ -0,0 +1,20 @@
.Authentication{
.AuthenticationIcon{
text-align: center;
margin-top: 40px;
}
.renzhen{
margin-top: 60px;
font-weight: 600;
font-size: 16px;
text-align: center;
}
.tips{
margin: 10px 0 40px;
color: #ccc;
text-align: center;
}
.button{
text-align: center;
}
}

View File

@@ -0,0 +1,55 @@
.EnterpriseCertificationCen{
// margin-top: 50px;
.EnterpriseRow{
margin-top: 30px;
}
.label{
padding: 10px;
background-color: #f1f1f1;
padding: 10px;
background-color: #f1f1f1;
font-weight: bold;
font-size: 16px;
border-bottom: 1px solid #ccc;
}
.value{
margin-top: 20px;
padding: 10px;
.InputItem{
display: inline-block;
width: 40%;
padding: 0 20px;
margin-top: 15px;
.InputItemLabel{
float: left;
vertical-align: middle;
line-height: 40px;
margin-right: 20px;
width: 120px;
text-align: right;
}
.InputItemValue{
float: left;
width: 270px;
}
}
.InputItem1{
display: inline-block;
width: 80%;
padding: 0 20px;
margin-top: 15px;
.InputItem1Img{
display: inline-block;
margin-right: 30px;
width: 28%;
text-align: center;
p{
margin-top: 15px;
}
}
}
}
}
.ant-upload-list-picture-card .ant-upload-list-item-info::before {
left: 0;
}

View File

@@ -0,0 +1,62 @@
@import "../color/index";
@import "../mixin/index";
.GuaranteeApply {
.list {
margin-top: 20px;
overflow: hidden;
padding-bottom: 20px;
.item {
margin-bottom: 30px;
.itemTitle {
font-size: 19px;
margin-bottom: 10px;
// padding-bottom: 15px;
border-bottom: 1px solid #ded9d9;
background: #f1f1f1;
// height: 35px;
line-height: 52px;
padding-left: 15px;
p{
margin-bottom: 0;
display: inline-block;
margin-right: 20px;
}
}
.itemText {
overflow: hidden;
margin-top: 20px;
padding-left: 16px;
li {
width: 33%;
float: left;
margin-bottom: 10px;
color: #737373;
margin-top: 10px;
span{
text-align: right;
width: 160px;
display: inline-block;
}
}
}
}
}
.InputItem{
display: inline-block;
width: 40%;
padding: 0 20px;
margin-top: 15px;
.InputItemLabel{
float: left;
vertical-align: middle;
line-height: 40px;
margin-right: 20px;
width: 120px;
text-align: right;
}
.InputItemValue{
float: left;
width: 270px;
}
}
}

View File

@@ -0,0 +1,45 @@
.GuaranteeDetails{
.GuaranteeDetailsCen{
width: 1200px;
margin: 0 auto;
.headTitle{
padding: 10px;
font-weight: bold;
font-size: 18px;
}
.GuaranteeDetailsRow{
padding: 10px 15px;
.GuaranteeDetailsItem{
margin-bottom: 20px;
width: 33.33%;
float: left;
.title,.text{
float: left;
}
.title{
width: 40%;
// padding-right: 20px;
// text-align: right;
}
.text{
width: 60%;
padding-right: 10px;
}
}
}
.GuaranteeDetailsItemImg{
width: 100%;
padding-left: 15px;
margin-bottom: 20px;
.title,.text{
float: left;
}
.title{
width: 120px;
}
}
}
}
.clear{
clear: both
}

View File

@@ -0,0 +1,23 @@
@import "../color/index";
@import "../mixin/index";
.GuaranteeQuery {
}
.payitem {
text-align: center;
cursor: pointer;
padding-top: 15px;
padding-bottom: 9px;
img {
width: 55px;
}
}
.active {
color: red;
border: 1px solid #e4e2e2;
border-radius: 4px;
}

View File

@@ -0,0 +1,36 @@
@import "../mixin/index";
@import "../color/index";
.Index {
.cneter {
.list {
margin-top: 40px;
// overflow: hidden;
li {
float: left;
width: 22.4%;
box-shadow: 0px 5px 16px #e2e1e1;
margin-right: 40px;
margin-bottom: 40px;
cursor: pointer;
&:nth-child(4n) {
margin-right: 0;
}
.listTop {
height: 190px;
text-align: center;
line-height: 190px;
i {
font-size: 50px;
color: #3487ff;
}
}
.listText {
text-align: center;
background: #3487ff;
color: #fff;
padding: 15px;
}
}
}
}
}

View File

@@ -0,0 +1,182 @@
@import "../mixin/index";
@import "../color/index";
// .Login{
// .side {
// position: fixed;
// top: 0;
// left: 0;
// height: 100%;
// width: 480px;
// float: left;
// overflow: hidden;
// // background-repeat: no-repeat;
// // background-position: center;
// // background-size: cover;
// // background: "../";
// }
// .mainWraper {
// // margin-left: 480px;
// position: relative;
// height: 100%;
// .fromLogin {
// width: 480px;
// position: relative;
// margin: 0 auto;
// padding-top: 16%;
// box-sizing: border-box;
// input {
// margin-bottom: 15px;
// }
// h2 {
// font-size: 35px;
// margin-bottom: 20px;
// }
// .LoginSubmit {
// height: 50px;
// line-height: 50px;
// text-align: center;
// background: @pink50;
// background: #3487ff;
// color: #fff;
// font-size: 18px;
// border-radius: 4px;
// cursor: pointer;
// }
// }
// .fromReg {
// .SmsCode {
// position: relative;
// .SendCode {
// position: absolute;
// right: 0;
// }
// }
// .agreement {
// margin-top: -10px;
// margin-bottom: 15px;
// }
// }
// .Action {
// overflow: hidden;
// width: 480px;
// margin: 0 auto;
// margin-top: 20px;
// a {
// color: #aaa;
// cursor: pointer;
// }
// .Reg {
// float: left;
// }
// .ForgetPassword {
// float: right;
// }
// }
// }
// }
.Login {
position: relative;
height: 100%;
width: 100%;
.loginFrom {
position: absolute;
height: 600px;
width: 860px;
left: 50%;
top: 50%;
margin-top: -300px;
margin-left: -430px;
box-shadow: 0 8px 8px rgba(10, 16, 20, .24), 0 0 8px rgba(10, 16, 20, .12);
text-decoration: none;
border-radius: 5px;
overflow: hidden;
.logo {
position: absolute;
align-self: center;
padding: 0px 0px 0px 0px;
box-sizing: border-box;
width: 100%;
top: 80px;
text-align: center;
}
.loginImg {
height: 100%;
width: 370px;
float: left;
background-color: rgb(64, 158, 255);
position: relative;
.loginImgBootom {
border-width: 0px;
position: absolute;
left: 0px;
top: 245px;
width: 370px;
height: 370px;
img {
height: 100%;
width: 100%;
}
}
}
.loginRight {
float: left;
width: 490px;
height: 100%;
padding: 20px 70px;
.loginRightTitle {
margin-top: 40px;
text-align: center;
font-size: 18px;
font-weight: bold;
}
.loginRightCen {
margin-top: 60px;
.but {
width: 100%;
}
}
.loginBootom {
margin-top: 10px;
.loginBootomTips {
width: 50%;
float: left;
&:last-child {
text-align: right;
}
span {
color: #409EFF;
cursor: pointer;
}
}
}
.SmsCode {
position: relative;
.SendCode {
position: absolute;
right: 0;
}
}
}
}
}
.mb20 {
margin-bottom: 20px;
}

View File

@@ -0,0 +1,72 @@
@import "../color/index";
@import "../mixin/index";
.PersonalCenter {
.cneter {
.list {
li {
width: 23.7%;
float: left;
border: 1px solid #d9d9d9;
border-radius: 4px;
margin-right: 20px;
padding: 10px 0;
padding-left: 30px;
box-sizing: border-box;
margin-bottom: 20px;
cursor: pointer;
&:nth-child(4) {
margin-right: 0;
}
img {
width: 53px;
height: 53px;
border-radius: 100%;
vertical-align: middle;
}
span {
font-size: 18px;
color: #8d8d8d;
margin-left: 17px;
}
}
}
}
}
.headTitle{
padding: 10px;
font-weight: bold;
font-size: 18px;
}
.GuaranteeDetailsRow{
padding: 10px 15px;
.GuaranteeDetailsItem{
margin-bottom: 20px;
width: 33.33%;
float: left;
.title,.text{
float: left;
}
.title{
width: 40%;
}
.text{
width: 60%;
padding-right: 10px;
}
}
}
.GuaranteeDetailsItemImg{
width: 100%;
padding-left: 15px;
margin-bottom: 20px;
.title,.text{
float: left;
}
.title{
width: 120px;
}
}
.clear{
clear: both
}

View File

@@ -0,0 +1 @@
1b20a809-644c-479b-9130-319f82bbe400

View File

@@ -0,0 +1 @@
ecfc17a0-13a8-4bfb-b594-790733062c8f

View File

@@ -0,0 +1,75 @@
import "@/application/assets/less/components/Header.less"
import { UserServiceImpl } from '@/core/service/impl/User.service.impl';
import { Component, Prop, Vue } from 'vue-property-decorator';
import { Inject } from "@ann/Ioc.annotation";
import { Modal } from 'ant-design-vue'
interface breadcrumb {
label: string
path: string
}
@Component
export default class Header extends Vue {
@Inject()
public readonly UserServiceImpl!: UserServiceImpl;
@Prop({ default: [] }) readonly breadcrumb!: breadcrumb[]
private info: any = {
username: ''
};
created() {
this.userGetUserInfo()
}
public async userGetUserInfo() {
let res = await this.UserServiceImpl.userGetUserInfo({})
this.info = res
}
private async userLogout() {
Modal.confirm({
title: '是否退出当前账号?',
okText: '确定',
cancelText: '取消',
onOk: async () => {
let res = await this.UserServiceImpl.userLogout({})
if (res === null) {
this.$router.replace('/User/Login')
}
}
})
}
render(): JSX.Element {
return (
<div class='Header'>
<div class="HeaderTop">
<div class="left">
<img class='logo' src={require('../../../../public/img/2020042842436705.png')} />
</div>
<div class="right">
<span class="floatRight close" onClick={() => this.userLogout()}>退</span>
<span class="floatRight line">|</span>
<span class="floatRight phone">{this.info.username || ''}</span>
</div>
</div>
<div class="HeaderBreadColor">
<div class="HeaderBread">
<el-breadcrumb class="Bread" separator="/">
{
this.breadcrumb.map((v, i) => {
return <el-breadcrumb-item key={i} to={v.path}>{v.label}</el-breadcrumb-item>
})
}
</el-breadcrumb>
</div>
</div>
</div>
)
}
}

View File

@@ -0,0 +1 @@
0475e18f-5570-4acd-b577-29661c8e5745

View File

@@ -0,0 +1,23 @@
import "@/application/assets/less/components/Title.less"
import { Component, Prop, Vue } from 'vue-property-decorator';
@Component
export default class Title extends Vue {
@Prop({ default: 'title' }) public readonly title!: string;
@Prop({ default: '' }) public readonly value!: string;
render() {
return (
<div class="Title">
<div class="TitleLabel">{this.title}</div>
{
this.value !== ''
? <div class="TitleValue">{this.value}</div>
: null
}
<div class="TitleLine"></div>
</div>
)
}
}

View File

@@ -0,0 +1 @@
a3bbf516-8a09-4ac9-80a9-384b5eb851d0

View File

@@ -0,0 +1,25 @@
import { Vue } from 'vue-property-decorator';
export interface RouterMeta {
title?: string,
isLogin?: boolean,
showNav?: boolean
}
// VueType 继承 Vue实现对全局方法的类型定义
export interface VueType extends Vue {
$setToken: (token: string) => void
$formatDate: (data: number) => string
$isLogin: () => void
}
/**
* 所有页面公共参数和方法的地方
*/
export class BaseLayout extends Vue {
protected $SendSmsCode: ((self: any) => void) | undefined
protected $formatDate!: Function
protected $conversionMoney!: Function
}

View File

@@ -0,0 +1 @@
645c1de9-e0a0-40e6-9f61-50299eeafccf

View File

@@ -0,0 +1,38 @@
import { Vue } from "vue-property-decorator";
import { ElNotification } from 'element-ui/types/notification';
export interface KeyParams {
[ key: string ] : any
}
// VueType 继承 Vue实现对全局方法的类型定义
export interface VueType extends Vue {
$setToken: (token: string) => void
$formatDate: (data: number) => string
$isLogin: () => void
$DateToString: (date: Date, fmt?: string) => string
RsetAsideMenu: (data: {[key:string]: any}[]) => void
}
export interface Methods {
StartUp(): Promise<void>;
}
/**
* 基础逻辑父类
*/
export class BaseLogic {
// 保存Vue对象
protected VueApp!: VueType;
// $refs 类型
protected $refs!: any;
protected $confirm!: any;
protected $message!: any;
protected $notify!: ElNotification;
// 请求的总页数
public TotalCount!: string;
// 请求参数
protected PageParams: { limit: number, page: number } = {
limit: 10, page: 1
}
}

View File

@@ -0,0 +1 @@
020a7681-ad42-4161-a3a1-cbc95db1e37f

View File

@@ -0,0 +1,18 @@
import { BaseLogic, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
export class AuthenticationLogic extends BaseLogic implements Methods {
@Inject()
public readonly UserServiceImpl!: UserServiceImpl;
constructor(point: any) {
super();
this.VueApp = point;
}
public async StartUp(): Promise<void> {
}
}

View File

@@ -0,0 +1,161 @@
import { BaseLogic, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { PublicServiceImpl } from '@/core/service/impl/Public.Service.impl';
import { BussinessServiceImpl } from '@/core/service/impl/Bussiness.service.impl';
export interface Enterprise {
name: string
credit_code: string
business_term: string | number
reg_address: string
legal_name: string
legal_cellphone: string
id_card_num: string
telnum: string
bank: string
bank_num: string
front_image_id: string
bank_image_id: string
business_license: string
front_image: string
bank_image: string
license_image: string
}
export class EnterpriseCertificationLogic extends BaseLogic implements Methods {
@Inject()
public readonly PublicServiceImpl!: PublicServiceImpl;
@Inject()
public readonly BussinessServiceImpl!: BussinessServiceImpl;
constructor(point: any) {
super();
this.VueApp = point;
}
public async StartUp(): Promise<void> {
await this.getBussinessDetail()
}
public param: Enterprise = {
name : "",
credit_code : "",
business_term : "",
reg_address : "",
legal_name : "",
legal_cellphone : "",
id_card_num : "",
telnum : "",
bank : "",
bank_num : "",
front_image_id : "",
bank_image_id : "",
business_license : "",
front_image : "",
bank_image : "",
license_image : ""
}
public fileList1: { url: string, uid: string, name: string }[] = []
public fileList2: { url: string, uid: string, name: string }[] = []
public fileList3: { url: string, uid: string, name: string }[] = []
public placeholderText: string = "长期有效,无需选择时间";
public textaa: string = ""
private async getBussinessDetail() {
let res = await this.BussinessServiceImpl.getBussinessDetail();
if (res.business_term != 0) {
res.business_term = res.business_term * 1000
this.textaa = this.formateDate(res.business_term)
}
if(res) {
// res.business_term = res.business_term * 1000
this.param = res
this.fileList1 = [ {
uid : res.front_image_id,
url : res.front_image,
name : '1.png'
} ]
this.fileList2 = [ {
uid : res.bank_image_id,
url : res.bank_image,
name : '1.png'
} ]
this.fileList3 = [ {
uid : res.business_license,
url : res.license_image,
name : '1.png'
} ]
}
}
private formateDate(datetime: any) {
// let = "2019-11-06T16:00:00.000Z"
function addDateZero(num: any) {
return (num < 10 ? "0" + num : num);
}
let d = new Date(datetime);
let formatdatetime = d.getFullYear() + '-' + addDateZero(d.getMonth() + 1) + '-' + addDateZero(d.getDate());
return formatdatetime;
}
public async bussinessSetBussiness() {
let param = this.param
let { fileList1, fileList2, fileList3 } = this
if(fileList1.length > 0) {
param.front_image_id = fileList1[0].uid
}
if(fileList2.length > 0) {
param.bank_image_id = fileList2[0].uid
}
if(fileList3.length > 0) {
param.business_license = fileList3[0].uid
}
console.log("this.textaa ",this.textaa);
if (this.textaa == null || this.textaa.length === 0) {
param.business_term = '0'
} else {
param.business_term = this.textaa;
param.business_term = this.formateDate(param.business_term)
}
console.log(param);
await this.BussinessServiceImpl.bussinessSetBussiness(param)
}
public async httpImage(data: httpRequestImg, type: number) {
let formData = new FormData()
formData.append('file', data.file)
formData.append('file_type', type == 3 ? 'business_license' : 'id_card')
let res = await this.PublicServiceImpl.uploadFile(formData)
if(res) {
if(type === 1) {
this.fileList1 = [ {
uid : res.id,
url : res.path,
name : '1.png'
} ]
}
if(type === 2) {
this.fileList2 = [ {
uid : res.id,
url : res.path,
name : '1.png'
} ]
}
if(type === 3) {
this.fileList3 = [ {
uid : res.id,
url : res.path,
name : '1.png'
} ]
}
}
}
}

View File

@@ -0,0 +1,186 @@
import { BaseLogic, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { PublicServiceImpl } from '@/core/service/impl/Public.Service.impl';
import { BussinessServiceImpl } from '@/core/service/impl/Bussiness.service.impl';
import { Enterprise } from './EnterpriseCertification.logic';
export class GuaranteeApplyLogic extends BaseLogic implements Methods {
@Inject()
public readonly BussinessServiceImpl!: BussinessServiceImpl;
@Inject()
public readonly PublicServiceImpl!: PublicServiceImpl;
constructor(point: any) {
super();
this.VueApp = point;
}
public async StartUp(): Promise<void> {
this.getBussinessDetail()
}
/**
* 身份证正面图
*/
public fileList1: UploadFile[] = []
/**
* 身份证反面图
*/
public fileList2: UploadFile[] = []
/**
* 法人授权书
*/
public fileList3: UploadFile[] = []
/**
* 资质信息
*/
public fileList4: UploadFile[] = []
/**
* 招标类型
*/
public options = [
{
value: '1',
label: '公开招标'
}, {
value: '2',
label: '邀请招标'
}, {
value: '3',
label: '竞争性谈判'
}, {
value: '4',
label: '单一来源'
}, {
value: '5',
label: '询价'
}, {
value: '6',
label: '竞争性磋商'
}, {
value: '7',
label: '比选'
}, {
value: '8',
label: '其他'
}
]
/**
* 接口参数
*/
public param = {
is_same: '1',
operator: '',
cellphone: '',
front_image_id: '',
bank_image_id: '',
operate_letter_id: '',
enterprise_qualification: [''],
tender_company: '',
project_name: '',
project_type: '',
bdst: '',
}
/**
* 企业信息
*/
public enterprise: Enterprise = {
name: "",
credit_code: "",
business_term: "",
reg_address: "",
legal_name: "",
legal_cellphone: "",
id_card_num: "",
telnum: "",
bank: "",
bank_num: "",
front_image_id: "",
bank_image_id: "",
business_license: "",
front_image: "",
bank_image: "",
license_image: ""
}
private async getBussinessDetail() {
let res = await this.BussinessServiceImpl.getBussinessDetail()
if (res) {
this.enterprise = res
}
}
public async guaranteeApply() {
let param = this.param
let { fileList1, fileList2, fileList3, fileList4 } = this
if (fileList1.length >= 1) {
param.bank_image_id = fileList1[0].uid
}
if (fileList2.length >= 1) {
param.front_image_id = fileList2[0].uid
}
if (fileList3.length >= 1) {
param.operate_letter_id = fileList3[0].uid
}
if (fileList4.length >= 1) {
param.enterprise_qualification = fileList4.map((v, i) => (v.uid))
}
let res = await this.BussinessServiceImpl.guaranteeApply(this.param)
if(res === null) {
this.VueApp.$router.push('/Logrc/GuaranteeQuery')
}
}
public async httpImage(data: httpRequestImg, type: number) {
let formData = new FormData()
let imgType = ''
if (type == 1) {
imgType = 'id_card'
}
if (type == 2) {
imgType = 'id_card'
}
if (type == 3) {
imgType = 'business_license'
}
if (type == 4) {
imgType = 'bidding_qualification'
}
formData.append('file', data.file)
formData.append('file_type', imgType)
let res = await this.PublicServiceImpl.uploadFile(formData)
if (res) {
let data: UploadFile = {
uid: res.id,
url: res.path,
name: '1.png'
}
if (type === 1) {
this.fileList1.push(data)
}
if (type === 2) {
this.fileList2.push(data)
}
if (type === 3) {
this.fileList3.push(data)
}
if (type === 4) {
this.fileList4.push(data)
}
}
}
public async delImage(data: UploadFile) {
this.fileList4 = this.fileList4.filter((v, i) => {
return v.uid !== data.uid
})
}
}

View File

@@ -0,0 +1,53 @@
import { BaseLogic, KeyParams, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { BussinessServiceImpl } from '@/core/service/impl/Bussiness.service.impl';
export class GuaranteeDetailsLogic extends BaseLogic implements Methods {
@Inject()
public readonly BussinessServiceImpl!: BussinessServiceImpl;
/**
* tabs选择
*/
public tabs: string = '1'
/**
* 详情信息
*/
public info: KeyParams = {
company: {
operator: ""
},
qualification_image_list: [],
tender: {
tender_company: '',
project_name: '',
project_text: ''
},
head: {
apply_num: '',
pay_time: '',
},
order_info: {
order_num: ''
}
}
constructor(point: any) {
super();
this.VueApp = point;
}
public async StartUp(): Promise<void> {
await this.guaranteeDetail()
}
/**
* 获取详情
*/
private async guaranteeDetail() {
let res = await this.BussinessServiceImpl.guaranteeDetail({
id : this.VueApp.$route.query.id
})
this.info = res
}
}

View File

@@ -0,0 +1,250 @@
import { BaseLogic, KeyParams, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { BussinessServiceImpl } from '@/core/service/impl/Bussiness.service.impl';
import { Modal, notification } from 'ant-design-vue';
import { Loading } from 'element-ui';
import { IndexUtils } from "@utils/index.utils";
export class GuaranteeQueryLogic extends BaseLogic implements Methods {
@Inject()
public readonly BussinessServiceImpl!: BussinessServiceImpl;
@Inject()
public readonly Utils!: IndexUtils;
constructor(point: any) {
super();
this.VueApp = point;
}
/**
* 支付弹出层
*/
public isPay: boolean = false
/**
* 用户条款弹出层
*/
public isPayChecked: boolean = false
/**
* 支付tabs
*/
public tabs: string = '1'
/**
* 选中的数据
*/
public orderInfo: any = {}
// 是否展示支付弹窗
public isShowPayStatus: boolean = false;
// 默认选中的激活方式
public activeIndex: number = -1;
public chioosePay: KeyParams[] = [
{ type: 3, img: 'img/pay_wx.png', title: '微信支付' },
{ type: 2, img: 'img/pay_zfb2.png', title: '支付宝支付' },
{ type: 1, img: 'img/pay_yl1.png', title: '银联支付' },
];
// 是否同意用户协议
public checked: boolean = true;
public PayImgUrl: string = "";
public list: any[] = []
public page: number = 1
public count: number = 0
public unPay!: number;
public async StartUp(): Promise<void> {
await this.guaranteeList()
}
public async guaranteeList() {
let res: any = await this.BussinessServiceImpl.guaranteeList({
page: this.page,
limit: 10
})
if (res) {
this.list = res.list
this.count = res.count
}
}
// 去支付按钮被点击后
public async StartPay() {
if (!this.checked) {
Modal.info({
title: '请同意用户条款',
okText: '确定'
})
} else {
if (this.activeIndex == -1) {
Modal.info({
title: '请点选支付方式!',
okText: '确定'
})
} else {
switch (this.chioosePay[this.activeIndex].type) {
case 3:
this.PayImgUrl = this.guaranteeScanPay('3')
await this.guaranteePayCheck()
console.log("微信支付: ", this.PayImgUrl);
break
case 2:
this.PayImgUrl = this.guaranteeScanPay('2')
await this.guaranteePayCheck()
console.log("支付宝支付: ", this.PayImgUrl);
break
case 1:
await this.guaranteePay()
console.log("银联支付");
break
}
}
}
}
/**
* 点击不同按钮
*/
public butType(type: string, data: any) {
console.log("data ======: ", data.row)
switch (type) {
case 'guarantee_detail':
// 详情
this.VueApp.$router.push(`/Logrc/GuaranteeDetails?id=${data.row.id}`)
break;
case 'guarantee_pay':
// 支付
this.orderInfo = data.row
this.isShowPayStatus = true
// this.isPayChecked = true
break;
case 'recept_apply':
// 申请发票
this.orderInfo = data.row
this.guaranteeReceptApply()
break;
case 'recept_download':
// 下载发票
this.orderInfo = data.row
this.guaranteeReceptDownload('recept')
break;
case 'guarantee_download':
// 保函下载
this.orderInfo = data.row;
this.guaranteeReceptDownload('guarantee')
break;
}
}
/**
* 【网银支付】保函支付
*/
public async guaranteePay() {
let orderInfo = this.orderInfo;
let res = await this.BussinessServiceImpl.guaranteePay({
apply_id: orderInfo.id,
order_num: orderInfo && orderInfo.order_info.order_num
})
// this.isPay = false
window.open(res.pay_url)
Modal.confirm({
title: '是否支付成功?',
okText: '支付成功',
cancelText: '支付失败',
onOk: () => {
this.guaranteePayCheck(true)
},
onCancel: () => {
console.log(2);
}
})
}
/**
* 支付宝和微信二维码获取
*/
public guaranteeScanPay(type: string = '2') {
let orderInfo = this.orderInfo;
return `${IndexUtils.CheckAjaxUrl()}/guarantee/scanPay?Authorization=${localStorage.getItem("token")}&apply_id=${orderInfo.id}&order_num=${orderInfo.order_info && orderInfo.order_info.order_num}&pay_type=${type}`
}
/**
* 查询支付是否成功
*/
public async guaranteePayCheck(isOpen?: boolean) {
let orderInfo = this.orderInfo
if (this.unPay) {
clearInterval(this.unPay)
}
this.unPay = setInterval(async () => {
let res = await this.BussinessServiceImpl.guaranteePayCheck({
apply_id: orderInfo.id,
order_num: orderInfo && orderInfo.order_info.order_num
});
console.log("支付结果:", res);
if (isOpen) {
clearInterval(this.unPay)
}
//
// res.pay_status = 9
if (res.pay_status === 9) {
clearInterval(this.unPay)
this.isShowPayStatus = false
notification.open({
message: '支付通知',
description: '支付成功!!',
});
await this.guaranteeList();
return;
}
}, 1000)
}
/**
* 申请发票
*/
public async guaranteeReceptApply() {
let orderInfo = this.orderInfo
let res = await this.BussinessServiceImpl.guaranteeReceptApply({
id: orderInfo.id
});
await this.guaranteeList()
}
/**
* 下载发票
* @param type 下载类型 默认发票
*/
public async guaranteeReceptDownload(type = "recept") {
let url = "", size = 0;
let orderInfo = this.orderInfo;
let loadingInstance = Loading.service({
text: '请耐心等待,文件正在生成中...'
})
if (type == "recept") {
url = `${this.Utils.GetUrl()}/guarantee/receptDownload?Authorization=${localStorage.getItem("token")}&apply_id=${orderInfo.id}`;
console.log("发票地址:", url)
location.href = url
loadingInstance.close();
} else {
url = `${this.Utils.GetUrl()}/guarantee/provideDownload?Authorization=${localStorage.getItem("token")}&provide_id=${this.orderInfo.provide_time}`;
console.log("保函地址:", url)
location.href = url
loadingInstance.close();
}
}
}

View File

@@ -0,0 +1,71 @@
import { BaseLogic, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
export class IndexLogic extends BaseLogic implements Methods {
@Inject()
public readonly UserServiceImpl!: UserServiceImpl;
public info = {
"id" : 0,
"username" : "",
"role_id" : 0,
"status" : 0,
"company_status" : 0,
"reg_ip" : {
"ip" : "",
"country" : "",
"province" : "",
"city" : "",
"county" : "",
"isp" : "",
"area" : ""
},
"login_ip" : null,
"login_time" : null,
"last_login_ip" : {
"ip" : "",
"country" : "",
"province" : "",
"city" : "",
"county" : "",
"isp" : "",
"area" : ""
},
"last_login_time" : null,
"delete_time" : 0,
"create_time" : 0,
"update_time" : 0,
"route" : [],
"user" : {
"id" : 0,
"full_name" : "",
"cellphone" : "",
"update_time" : 0
},
"role_info" : {
"role" : {
"id" : 0,
"title" : ""
},
"department" : {
"id" : 0,
"title" : ""
}
}
}
constructor(point: any) {
super();
this.VueApp = point;
}
public async StartUp(): Promise<void> {
this.userGetUserInfo()
}
public async userGetUserInfo() {
let res = await this.UserServiceImpl.userGetUserInfo({})
this.info = res
}
}

View File

@@ -0,0 +1,137 @@
import { BaseLogic, KeyParams, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
import { PublicServiceImpl } from '@/core/service/impl/Public.Service.impl';
export class LoginLogic extends BaseLogic implements Methods {
@Inject()
public readonly UserServiceImpl!: UserServiceImpl;
@Inject()
public readonly PublicServiceImpl!: PublicServiceImpl;
// 用户登录需要的参数
public UserLogin: KeyParams = {
username: '',
password: ''
}
// 注册用户需要的参数
public UserReg: KeyParams = {
cellphone: '',
password: '',
verify_code: '',
true_name: ''
}
// 忘记密码接口需要的参数
public UserForget: KeyParams = {
cellphone: '',
verify_code: '',
password: ''
}
// 注册的时候是否同意协议
public isAgreeReg: boolean = false
// 短信验证码
public SmsStatus: KeyParams = {
NoStartText: '发送验证码',
ButtonDisabled: false,
StartText: 60,
timer: null,
}
// 1 登录 2 注册 3 忘记密码
public ShowAction: number = 1;
constructor(point: any) {
super();
this.VueApp = point;
}
public async StartUp(): Promise<void> {
console.log(111)
}
/**
* 清除发送验证码的定时器
*/
public clearSendCode() {
clearInterval(this.SmsStatus.timer);
this.SmsStatus.NoStartText = "发送验证码";
this.SmsStatus.ButtonDisabled = false;
this.SmsStatus.StartText = 60
}
/**
* 点击发送验证码
* @constructor
*/
public SendCode(): void {
//倒计时
let time = 60;
this.SmsStatus.timer = setInterval(() => {
if (time == 0) {
clearInterval(this.SmsStatus.timer);
this.SmsStatus.ButtonDisabled = false;
this.SmsStatus.NoStartText = "获取验证码";
} else {
this.SmsStatus.NoStartText = time + '秒后重试';
this.SmsStatus.ButtonDisabled = true;
time--
}
}, 1000)
}
/**
* 重置密码
* @constructor
*/
public async ResetPassword(): Promise<void> {
let res = await this.UserServiceImpl.ForgetPassword(this.UserForget)
this.ShowAction = 1
}
/**
* 用户登录
* @constructor
*/
public async UserLoginRequest(): Promise<void> {
let res = await this.UserServiceImpl.LoginIndex(this.UserLogin);
localStorage.setItem("token", res.token);
setTimeout(() => {
this.VueApp.$router.replace("/Logrc/Index")
}, 500);
}
/**
* 用户注册
* @constructor
*/
public async UserRegRequest(): Promise<void> {
if (this.isAgreeReg) {
let res = await this.UserServiceImpl.BidderLoginReg(this.UserReg);
this.ShowAction = 1;
} else {
this.VueApp.$notify.error({
title: '提示',
message: '请先勾选《用户协议》!!'
});
}
}
/**
* 获取手机验证码
* @param scene
*/
public async getSmsCode(scene: string) {
let cellphone = scene !== 'reg' ? this.UserForget.cellphone : this.UserReg.cellphone
let res = await this.PublicServiceImpl.getSmsCode({
cellphone: cellphone || '',
scene: scene
})
Promise.resolve()
}
}

View File

@@ -0,0 +1,84 @@
import { BaseLogic, Methods } from "@logic/Base.logic";
import { Inject } from "@ann/Ioc.annotation";
import { UserServiceImpl } from "@impl/User.service.impl";
export class PersonalCenterLogic extends BaseLogic implements Methods {
@Inject()
public readonly UserServiceImpl!: UserServiceImpl;
constructor(point: any) {
super();
this.VueApp = point;
}
public info = {
"id": 0,
"username": "",
"role_id": 0,
"status": 0,
"reg_ip": {
"ip": "",
"country": "",
"province": "",
"city": "",
"county": "",
"isp": "",
"area": ""
},
"login_ip": null,
"login_time": null,
"last_login_ip": {
"ip": "",
"country": "",
"province": "",
"city": "",
"county": "",
"isp": "",
"area": ""
},
"last_login_time": null,
"delete_time": 0,
"create_time": 0,
"update_time": 0,
"route": [],
"user": {
"id": 0,
"full_name": "",
"cellphone": "",
"update_time": 0
},
"role_info": {
"role": {
"id": 0,
"title": ""
},
"department": {
"id": 0,
"title": ""
}
}
}
public oldPass: string = ''
public newPass: string = ''
public async StartUp(): Promise<void> {
this.userGetUserInfo()
}
public async userGetUserInfo() {
let res = await this.UserServiceImpl.userGetUserInfo({})
this.info = res
}
public async setPassword() {
let res = await this.UserServiceImpl.setPassword({
origin_password: this.oldPass,
new_password: this.newPass,
repeat_password: this.newPass
})
console.log(res);
}
}

View File

@@ -0,0 +1 @@
ab40133a-13eb-4cf0-a18a-d73fef7cf9b9

View File

@@ -0,0 +1 @@
edd8cefb-09e1-4cbf-9a90-4c1be980bf5f

View File

@@ -0,0 +1,51 @@
import '@pageLess/Authentication.less'
import { Component, Vue } from 'vue-property-decorator';
import { AuthenticationLogic } from "@logic/page/Authentication.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import Header from "@components/Header/Header"
import Title from '@/application/components/Title/Title';
@Component
export default class Authentication extends BaseLayout {
private service: AuthenticationLogic = new AuthenticationLogic(this);
private RouterMeta: RouterMeta = {
title : '企业认证',
showNav : true,
isLogin : true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
return (
<div class="Authentication">
<Header breadcrumb={ [ { label : '首页', path : '/Logrc/Index' }, {
label : '企业认证', path : '/Logrc/Authentication'
} ] }/>
<div class="cneter">
<Title title="企业认证" value="应监管要求,您需要完成下面认证"/>
<div>
<div class='AuthenticationIcon'>
<img width="150"
src='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599898963388&di=a31c152be2b07c9f1d5f1db8351cf915&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fbaike%2Fpic%2Fitem%2F0d729944a63cf375500ffe5b.jpg'/>
</div>
<div class="renzhen"></div>
<div class="tips"></div>
<div class="button">
<el-button type="info" on-click={ () => this.$router.push('/Logrc/EnterpriseCertification') }>
</el-button>
</div>
</div>
</div>
</div>
)
}
}

View File

@@ -0,0 +1,210 @@
import '@pageLess/EnterpriseCertification.less'
import { Component, Vue } from 'vue-property-decorator';
import { EnterpriseCertificationLogic } from "@logic/page/EnterpriseCertification.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import Header from "@components/Header/Header"
import { Upload } from 'ant-design-vue';
@Component
export default class EnterpriseCertification extends BaseLayout {
private service: EnterpriseCertificationLogic = new EnterpriseCertificationLogic(this);
private RouterMeta: RouterMeta = {
title: '企业认证',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
let { param, fileList1, fileList2, fileList3 } = this.service
return (
<div class="EnterpriseCertification">
<Header breadcrumb={[{ label: '首页', path: '/Logrc/Index' }, { label: '我的企业', path: '/Logrc/EnterpriseCertification' }]} />
<div class="cneter">
{/* <Title title="企业认证" /> */}
<div class="EnterpriseCertificationCen">
<div class="EnterpriseRow">
<el-alert
closable={false}
style="margin-bottom: 20px;font-size:19px;"
title="请与贵公司开具发票信息一致"
show-icon
type="warning">
</el-alert>
<div class="label"></div>
<div class="value">
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.name} placeholder="请输入企业名称"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.credit_code} placeholder="请输入统一信用编码"></el-input>
</div>
</div>
{/*<div class="InputItem">*/}
{/* <span class="InputItemLabel">企业税号</span>*/}
{/* <div class="InputItemValue">*/}
{/* <el-input v-model={param.tax_number} placeholder="请输入内容"></el-input>*/}
{/* </div>*/}
{/*</div>*/}
{/*<div class="InputItem">*/}
{/* <span class="InputItemLabel">企业组织机构代码</span>*/}
{/* <div class="InputItemValue">*/}
{/* <el-input v-model={param.organization_code} placeholder="请输入企业组织机构代码"></el-input>*/}
{/* </div>*/}
{/*</div>*/}
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-date-picker
style="width:270px"
v-model={this.service.textaa}
type="date"
placeholder={this.service.placeholderText}>
</el-date-picker>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.reg_address} placeholder="请输入企业注册地址"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.bank} placeholder="请输入开户行名称"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.telnum} placeholder="座机格式0551-73***27"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.bank_num} placeholder="请输入开户行账户"></el-input>
</div>
</div>
</div>
</div>
<div class="EnterpriseRow">
<div class="label"></div>
<div class="value">
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.legal_name} placeholder="请输入法人姓名"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.legal_cellphone} placeholder="请输入法人手机号"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input v-model={param.id_card_num} placeholder="请输入法人身份证"></el-input>
</div>
</div>
</div>
</div>
<div class="EnterpriseRow">
<div class="label"></div>
<div class="value">
<div class="InputItem1">
{/* <div style={{ width: '140px', 'text-align': 'right' }}>图片上传</div> */}
<div style={{ 'margin-left': '100px', 'margin-top': '20px' }}>
<div key="1" class="InputItem1Img">
<div style={{ width: '104px', margin: '0 auto' }}>
<Upload
action=""
list-type="picture-card"
fileList={fileList1}
customRequest={(res: httpRequestImg) => this.service.httpImage(res, 1)}
remove={(res: any) => this.service.fileList1 = []}>
{
fileList1.length <= 0
? < div class="ant-upload-text">
</div>
: null
}
</Upload>
</div>
<p></p>
</div>
<div key="2" class="InputItem1Img">
<div style={{ width: '104px', margin: '0 auto' }}>
<Upload
action=""
list-type="picture-card"
fileList={fileList2}
customRequest={(res: httpRequestImg) => this.service.httpImage(res, 2)}
remove={(res: any) => this.service.fileList2 = []}>
{
fileList2.length <= 0
? < div class="ant-upload-text">
</div>
: null
}
</Upload>
</div>
<p></p>
</div>
<div key="3" class="InputItem1Img">
<div style={{ width: '104px', margin: '0 auto' }}>
<Upload
action=""
list-type="picture-card"
fileList={fileList3}
customRequest={(res: httpRequestImg) => this.service.httpImage(res, 3)}
remove={(res: any) => this.service.fileList3 = []}>
{
fileList3.length <= 0
? < div class="ant-upload-text">
</div>
: null
}
</Upload>
</div>
<p></p>
</div>
</div>
</div>
</div>
</div>
</div>
<div style={{ width: '100%', 'text-align': 'center', margin: '60px 0 120px' }}>
<el-button
style={{ width: '240px' }}
type="primary"
on-click={() => this.service.bussinessSetBussiness()}></el-button>
</div>
</div>
</div >
)
}
}

View File

@@ -0,0 +1,228 @@
import "@pageLess/GuaranteeApply.less";
import { Component, Vue } from 'vue-property-decorator';
import { GuaranteeApplyLogic } from "@logic/page/GuaranteeApply.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import Header from "@components/Header/Header"
import { Upload } from 'ant-design-vue';
@Component
export default class GuaranteeApply extends BaseLayout {
private service: GuaranteeApplyLogic = new GuaranteeApplyLogic(this);
private RouterMeta: RouterMeta = {
title: '保函申请',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
let { fileList1, fileList2, fileList3, fileList4, param, options, enterprise } = this.service
return (
<div class="GuaranteeApply">
<Header breadcrumb={[{ label: '首页', path: '/Logrc/Index' }, { label: '保函申请', path: '/Logrc/GuaranteeApply' }]} />
<div class="cneter">
<h2></h2>
<div class="list">
<div class="item">
<div class="itemTitle">
<p></p>
</div>
<ul class="itemText">
<li><span></span> {enterprise.name}</li>
<li><span></span> {enterprise.credit_code}</li>
<li><span></span> {enterprise.legal_name}</li>
<li><span></span> {enterprise.legal_cellphone}</li>
<li><span></span> {enterprise.id_card_num}</li>
<li><span></span> {enterprise.bank}</li>
<li><span></span> {enterprise.bank_num}</li>
</ul>
</div>
<div class="item">
<div class="itemTitle">
<p></p>
</div>
<div>
<div class="InputItem">
<span class="InputItemLabel">:</span>
<div class="InputItemValue">
<el-input v-model={param.tender_company} placeholder="请输入内容"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel">:</span>
<div class="InputItemValue">
<el-input v-model={param.project_name} placeholder="请输入内容"></el-input>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel">:</span>
<div class="InputItemValue">
<el-select style={{ width: '100%' }} v-model={param.project_type} placeholder="请选择">
{
options.map((v, i) => {
return <el-option
label={v.label}
value={v.value}>
</el-option>
})
}
</el-select>
</div>
</div>
<div class="InputItem">
<span class="InputItemLabel">:</span>
<div class="InputItemValue">
<el-input v-model={param.bdst} placeholder="请输入内容"></el-input>
</div>
</div>
</div>
</div>
<div class="item">
<div class="itemTitle">
<p></p>
<el-radio v-model={param.is_same} label="1"></el-radio>
<el-radio v-model={param.is_same} label="0">()</el-radio>
</div>
{
param.is_same == '0'
? (
<div class="itemText">
<el-row>
<el-col span={24} style="margin-bottom: 15px">
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input
v-model={param.operator}
style="width: 91.5%"
placeholder="请输入经办人电话">
</el-input>
</div>
</div>
</el-col>
<el-col span={24} style="margin-bottom: 15px">
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<el-input
v-model={param.cellphone}
style="width: 91.5%"
placeholder="请输入经办人电话">
</el-input>
</div>
</div>
</el-col>
<el-col span={24} style="margin-bottom: 15px">
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<Upload
action=""
list-type="picture-card"
fileList={fileList1}
customRequest={(res: httpRequestImg) => this.service.httpImage(res, 1)}
remove={(res: any) => this.service.fileList1 = []}>
{
fileList1.length <= 0
? < div class="ant-upload-text">
</div>
: null
}
</Upload>
</div>
</div>
</el-col>
<el-col span={24} style="margin-bottom: 15px">
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<Upload
action=""
list-type="picture-card"
fileList={fileList2}
customRequest={(res: httpRequestImg) => this.service.httpImage(res, 2)}
remove={(res: any) => this.service.fileList2 = []}>
{
fileList2.length <= 0
? < div class="ant-upload-text">
</div>
: null
}
</Upload>
</div>
</div>
</el-col>
<el-col span={24} style="margin-bottom: 15px">
<div class="InputItem">
<span class="InputItemLabel"></span>
<div class="InputItemValue">
<Upload
action=""
list-type="picture-card"
fileList={fileList3}
customRequest={(res: httpRequestImg) => this.service.httpImage(res, 3)}
remove={(res: any) => this.service.fileList3 = []}>
{
fileList3.length <= 0
? < div class="ant-upload-text">
</div>
: null
}
</Upload>
</div>
</div>
</el-col>
</el-row>
</div>
)
: null
}
</div>
<div class="item">
<div class="itemTitle">
<p></p>
</div>
<ul class="itemText">
<Upload
action=""
list-type="picture-card"
fileList={fileList4}
customRequest={(res: httpRequestImg) => this.service.httpImage(res, 4)}
remove={(res: any) => this.service.delImage(res)}>
{
fileList4.length < 5
? < div class="ant-upload-text">
</div>
: null
}
</Upload>
</ul>
</div>
<div class="item">
<el-button
style="float: right"
type="primary"
on-click={() => this.service.guaranteeApply()}> </el-button>
</div>
</div>
</div>
</div>
)
}
}

View File

@@ -0,0 +1,246 @@
import "@pageLess/GuaranteeDetails.less";
import { Component, Vue } from 'vue-property-decorator';
import { GuaranteeDetailsLogic } from "@logic/page/GuaranteeDetails.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import Header from "@components/Header/Header"
import Title from '@/application/components/Title/Title';
import { Tabs } from 'ant-design-vue';
const { TabPane } = Tabs
@Component
export default class GuaranteeDetails extends BaseLayout {
private service: GuaranteeDetailsLogic = new GuaranteeDetailsLogic(this);
private RouterMeta: RouterMeta = {
title: '保函详情',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
let { info, tabs } = this.service
let operator = info.company&&info.company.operator
let operatorAll = [
info.company.operator.operator_bank_image, info.company.operator.operator_front_image,
info.company.operator.operator_letter_image
].filter(v => v !== null)
let company = info.company
let companyAll = [info.company.front_image, info.company.bank_image, info.company.license_image].filter((v) => v !== null)
return (
<div class="GuaranteeDetails">
<Header breadcrumb={[
{ label: '首页', path: '/Logrc/Index' },
{ label: '保函查询', path: '/Logrc/GuaranteeQuery' },
{ label: '保函详情', path: '/Logrc/GuaranteeDetails' }]} />
<div class="GuaranteeDetailsCen">
<Title title="保函详情" />
<div style="margin-top: 20px;">
<div class="headTitle"></div>
<div class="GuaranteeDetailsRow">
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.head.apply_num || '暂无'}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.head.pay_time == 0 ? '暂无' : this.$formatDate(info.head.pay_time)}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.head.pay_status == 0 ? '未支付' : '已支付'}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{this.$conversionMoney(info.head.amount)}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.order_info == null ? '暂无':info.order_info.order_num}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.head.status_text}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{this.$formatDate(info.head.create_time)}</div>
</div>
<div class="clear"></div>
</div>
</div>
<div>
<div class="headTitle"></div>
<div class="GuaranteeDetailsRow">
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{ info.company.name }</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{ info.company.credit_code }</div>
</div>
{/*<div class="GuaranteeDetailsItem">*/ }
{/* <div class="title">企业税号</div>*/ }
{/* <div class="text">{info.company.tax_number}</div>*/ }
{/*</div>*/ }
{/*<div class="GuaranteeDetailsItem">*/ }
{/* <div class="title">企业组织机构代码</div>*/ }
{/* <div class="text">{info.company.organization_code}</div>*/ }
{/*</div>*/ }
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{ this.$formatDate(info.company.business_term) }</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{ info.company.reg_address }</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.company.telnum}</div>
</div>
<div class="clear"></div>
</div>
<div class="GuaranteeDetailsRow">
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.company.legal_name}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.company.legal_cellphone}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.company.id_card_num}</div>
</div>
<div class="clear"></div>
</div>
</div>
<div>
<div class="headTitle"></div>
{
info.company.operator.is_same !== 1
? (
<div>
<div class="GuaranteeDetailsRow">
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{ info.company.operator.operator }</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{ info.company.operator.cellphone }</div>
</div>
<div class="clear"></div>
</div>
</div>
)
: <div style="padding-left: 15px;margin-bottom: 20px;"></div>
}
</div>
<div>
<div class="headTitle"></div>
<div class="GuaranteeDetailsRow">
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.tender.tender_company}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.tender.project_name}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.tender.project_text}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.tender.bdst}</div>
</div>
<div class="clear"></div>
</div>
</div>
<div style="margin-bottom: 100px;">
<Tabs
activeKey={tabs}
onChange={(res: string) => {
this.service.tabs = res
}}>
<TabPane key="1" tab="企业信息">
<el-image
style="width: 100px; height: 100px;margin-right: 10px;"
src={company.front_image}
preview-src-list={companyAll}>
</el-image>
<el-image
style="width: 100px; height: 100px;margin-right: 10px;"
src={company.bank_image}
preview-src-list={companyAll}>
</el-image>
<el-image
style="width: 100px; height: 100px;margin-right: 10px;"
src={company.license_image}
preview-src-list={companyAll}>
</el-image>
</TabPane>
<TabPane key="2" tab="招标资质">
{
info.qualification_image_list.map((v:any, i:number) => {
return (
<el-image
key={ i }
style="width: 100px; height: 100px;margin-right: 10px;"
src={ v }
preview-src-list={ info.qualification_image_list.filter((v: any) => v !== null) }>
</el-image>
)
})
}
</TabPane>
<TabPane key="3" tab="经办人资质">
<el-image
style="width: 100px; height: 100px;margin-right: 10px;"
src={ operator.operator_bank_image }
preview-src-list={ operatorAll }>
</el-image>
<el-image
style="width: 100px; height: 100px;margin-right: 10px;"
src={ operator.operator_front_image }
preview-src-list={ operatorAll }>
</el-image>
{
operator.is_same == 1 && operator.operator_letter_image == null
? <span></span>
: (
<el-image
style="width: 100px; height: 100px;margin-right: 10px;"
src={ operator.operator_letter_image }
preview-src-list={ operatorAll }>
</el-image>
)
}
</TabPane>
</Tabs>
</div>
</div>
</div>
)
}
}

View File

@@ -0,0 +1,221 @@
import "@pageLess/GuaranteeQuery.less"
import { Component, Vue } from 'vue-property-decorator';
import { GuaranteeQueryLogic } from "@logic/page/GuaranteeQuery.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import Header from "@components/Header/Header"
import { Modal, Pagination, Tabs } from 'ant-design-vue';
Vue.use(Modal)
const { TabPane } = Tabs;
@Component
export default class GuaranteeQuery extends BaseLayout {
private service: GuaranteeQueryLogic = new GuaranteeQueryLogic(this);
private RouterMeta: RouterMeta = {
title: '保函查询',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
private checked: boolean = false;
protected render() {
let { list, tabs, isPay, page, count, isPayChecked } = this.service
return (
<div class="GuaranteeQuery">
<Header breadcrumb={[{ label: '首页', path: '/Logrc/Index' }, { label: '保函查询', path: '/Logrc/GuaranteeQuery' }]} />
<div class="cneter">
<h2></h2>
<el-table
stripe
style="width: 100%"
data={list}>
<el-table-column
prop="tender.tender_company"
label="招标公司">
</el-table-column>
<el-table-column
prop="tender.project_name"
label="招标项目">
</el-table-column>
<el-table-column
prop="tender.project_text"
label="招标类型">
</el-table-column>
<el-table-column
prop="tender.bdst"
label="标段"
width='90'>
</el-table-column>
<el-table-column
label="审核状态"
{...{
scopedSlots: {
default: (data: any) => {
return (
<span>{data.row.status_text}</span>
)
}
}
}}>
</el-table-column>
<el-table-column
prop="pay_status"
label="支付状态"
{...{
scopedSlots: {
default: (data: any) => {
return (
<span>{data.row.pay_status == 0 ? '未支付' : '已支付'}</span>
)
}
}
}}>
</el-table-column>
<el-table-column
label="保费"
{...{
scopedSlots: {
default: (data: any) => {
return (
<span>{this.$conversionMoney(data.row.amount)}</span>
)
}
}
}}>
</el-table-column>
<el-table-column
prop="create_time"
label="申请时间"
width="140"
{...{
scopedSlots: {
default: (data: any) => {
return (
<span>{this.$formatDate(data.row.create_time)}</span>
)
}
}
}}>
</el-table-column>
<el-table-column
prop="address"
label="操作"
width="200"
{...{
scopedSlots: {
default: (data: any) => {
return (
<div style="display: flex;">
{
data.row.button.map((v: any, i: number) => {
return (
<div
onClick={() => {
this.service.butType(v.name, data)
}}>
<span style={`color:${v.text_color};margin: 0 2px;cursor: pointer;`}>{v.title}</span>
<span>{data.row.button.length - 1 === i ? '' : '|'}</span>
</div>
)
})
}
</div>
)
}
}
}}>
</el-table-column>
</el-table>
<div style='text-align: right;margin-top: 20px;'>
<Pagination
current={page}
background
layout="prev, pager, next"
total={count}
onChange={(res: any) => {
this.service.page = res
this.service.guaranteeList()
}}>
</Pagination>
</div>
</div>
<Modal
destroyOnClose={true}
visible={this.service.isShowPayStatus}
title="请选择支付方式"
okText="去支付"
width={"40%"}
cancelText='取消'
onCancel={() => {
this.service.isShowPayStatus = false;
clearInterval(this.service.unPay);
}}
onOk={()=>{
this.service.StartPay()
}}>
<el-row class="PayChioose">
{
this.service.chioosePay.map((v,i)=>{
return (
<el-col class={`payitem ${i == this.service.activeIndex ? 'active' : ''}`}
title={v.title} span={8}>
<div on-click={()=>{
this.service.activeIndex = i;
this.service.PayImgUrl = "";
clearInterval(this.service.unPay);
}}>
<img src={v.img} alt={v.title}/>
<p>{ v.title }</p>
</div>
</el-col>
)
})
}
</el-row>
<el-row style="margin-top: 25px;">
<el-col span={24}>
<el-checkbox v-model={this.service.checked}></el-checkbox>
<span style="color: #1890ff;cursor: pointer;" onClick={(e: any) => {
e.stopPropagation()
}}>
</span>
</el-col>
</el-row>
{
this.service.PayImgUrl.length != 0
? (
<el-row style="margin-top: 25px;text-align: center;">
<p style="border-top: 1px solid #e8e8e8;padding-top: 20px;">使</p>
<el-image
style="width: 200px; height: 200px"
src={this.service.PayImgUrl}
preview-src-list={[this.service.PayImgUrl]}>
</el-image>
</el-row>
)
: null
}
</Modal>
</div>
)
}
}

View File

@@ -0,0 +1,106 @@
import '@pageLess/Index.less'
import { Component, Vue } from 'vue-property-decorator';
import { IndexLogic } from "@logic/page/Index.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import Header from "@components/Header/Header"
import { Modal } from 'ant-design-vue'
@Component
export default class Index extends BaseLayout {
private service: IndexLogic = new IndexLogic(this);
private RouterMeta: RouterMeta = {
title: '首页',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
let { info } = this.service
return (
<div class="Index">
<Header breadcrumb={[{ label: '首页', path: '/Logrc/Index' }]} />
<div class="cneter">
<h2></h2>
<ul class="list">
<li>
<div onClick={() => {
if (info.company_status == 0) {
Modal.info({
title: '请先去我的企业填写企业信息!',
okText: '确认'
})
return
}
this.$router.push('/Logrc/GuaranteeApply')
}}>
<div class="listTop">
<i class="el-icon-document"></i>
</div>
<div class="listText"></div>
</div>
</li>
<li>
<div onClick={() => {
if (info.company_status == 0) {
Modal.info({
title: '请先去我的企业填写企业信息!',
okText: '确认'
})
return
}
this.$router.push('/Logrc/GuaranteeQuery')
}}>
<div class="listTop">
<i class="el-icon-search"></i>
</div>
<div class="listText">&</div>
</div>
</li>
<li>
<div onClick={() => {
this.$router.push('/User/PersonalCenter')
}}>
<div class="listTop">
<i class="el-icon-user"></i>
</div>
<div class="listText"></div>
</div>
</li>
<li>
<div onClick={() => {
this.$router.push('/Logrc/EnterpriseCertification')
}}>
<div class="listTop">
<i class="el-icon-office-building"></i>
</div>
<div class="listText"></div>
</div>
</li>
<li>
<div onClick={() => {
this.$router.push('/User/ModifyPass')
}}>
<div class="listTop">
<i class="el-icon-edit"></i>
</div>
<div class="listText"></div>
</div>
</li>
</ul>
</div>
</div>
)
}
}

View File

@@ -0,0 +1 @@
92108c4c-add3-446d-8c61-47a4d9ebb634

View File

@@ -0,0 +1,352 @@
import '@pageLess/Login.less'
import { Component, Vue } from 'vue-property-decorator';
import { LoginLogic } from "@logic/page/Login.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
@Component
export default class Login extends BaseLayout {
private service: LoginLogic = new LoginLogic(this);
private RouterMeta: RouterMeta = {
title: '登录',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
render() {
return (
<div class="Login">
{
this.service.ShowAction == 1
? <div class="loginFrom">
<div class="loginImg">
<div class="logo">
<img src={require('../../../../public/img/2020042842436705.png')} alt="" />
</div>
<div class="loginImgBootom">
<img src={require('../../../../public/img/u2_state0.png')} alt="" />
</div>
</div>
<div class="loginRight">
<div class="loginRightTitle"></div>
<div class="loginRightCen">
<el-input
class="mb20"
v-model={this.service.UserLogin.username}
prefix-icon="el-icon-user"
clearable
placeholder="请输入手机号">
</el-input>
<el-input
class="mb20"
v-model={this.service.UserLogin.password}
prefix-icon="el-icon-lock"
clearable
show-password
placeholder="请输入密码">
</el-input>
<el-button
class="but"
type="primary"
onClick={() => {
this.service.UserLoginRequest()
}}></el-button>
</div>
<div class="loginBootom">
<div class="loginBootomTips"><span onClick={() => this.service.ShowAction = 2}></span></div>
<div class="loginBootomTips"><span onClick={() => this.service.ShowAction = 3}></span></div>
</div>
</div>
</div>
: this.service.ShowAction == 2
? <div class="loginFrom">
<div class="loginImg">
<div class="logo">
<img src={require('../../../../public/img/2020042842436705.png')} alt="" />
</div>
<div class="loginImgBootom">
<img src={require('../../../../public/img/u2_state0.png')} alt="" />
</div>
</div>
<div class="loginRight">
<div class="loginRightTitle"></div>
<div class="loginRightCen">
<el-input
class="mb20"
v-model={this.service.UserReg.cellphone}
prefix-icon="el-icon-user"
clearable
placeholder="请输入手机号">
</el-input>
<div class="SmsCode mb20">
<el-input
type="number"
v-model={this.service.UserReg.verify_code}
prefix-icon="el-icon-chat-line-round"
clearable
placeholder="请输验证码">
</el-input>
<el-button
class="SendCode"
type="primary"
disabled={this.service.SmsStatus.ButtonDisabled}
on-click={() => {
this.service.getSmsCode('reg')
.then(() => {
this.service.SendCode()
})
}}>
{this.service.SmsStatus.NoStartText}
</el-button>
</div>
<el-input
class="mb20"
v-model={this.service.UserReg.password}
prefix-icon="el-icon-lock"
clearable
show-password
placeholder="请输入密码">
</el-input>
<el-input
class="mb20"
v-model={this.service.UserReg.true_name}
prefix-icon="el-icon-user"
clearable
placeholder="请输入姓名">
</el-input>
<div>
<el-checkbox class="mb20" v-model={this.service.isAgreeReg}></el-checkbox>
<span style="color: #409EFF;cursor: pointer;"></span>
</div>
<el-button
class="but"
type="primary"
onClick={() => {
this.service.UserRegRequest()
}}></el-button>
</div>
<div class="loginBootom">
<div class="loginBootomTips"><span onClick={() => this.service.ShowAction = 1}></span></div>
<div class="loginBootomTips"><span onClick={() => this.service.ShowAction = 3}></span></div>
</div>
</div>
</div>
: <div class="loginFrom">
<div class="loginImg">
<div class="logo">
<img src={require('../../../../public/img/2020042842436705.png')} alt="" />
</div>
<div class="loginImgBootom">
<img src={require('../../../../public/img/u2_state0.png')} alt="" />
</div>
</div>
<div class="loginRight">
<div class="loginRightTitle"></div>
<div class="loginRightCen">
<el-input
class="mb20"
v-model={this.service.UserForget.cellphone}
prefix-icon="el-icon-user"
clearable
placeholder="请输入手机号">
</el-input>
<div class="SmsCode mb20">
<el-input
type="number"
v-model={this.service.UserForget.verify_code}
prefix-icon="el-icon-chat-line-round"
clearable
placeholder="请输验证码">
</el-input>
<el-button
class="SendCode"
type="primary"
disabled={this.service.SmsStatus.ButtonDisabled}
on-click={() => {
this.service.getSmsCode('resetPassword')
.then(() => {
this.service.SendCode()
})
}}>
{this.service.SmsStatus.NoStartText}
</el-button>
</div>
<el-input
class="mb20"
v-model={this.service.UserForget.password}
prefix-icon="el-icon-lock"
clearable
show-password
placeholder="请输入密码">
</el-input>
<el-button
class="but"
type="primary"
onClick={() => {
this.service.ResetPassword()
}}> </el-button>
</div>
<div class="loginBootom">
<div class="loginBootomTips"><span onClick={() => this.service.ShowAction = 2}></span></div>
<div class="loginBootomTips"><span onClick={() => this.service.ShowAction = 1}></span></div>
</div>
</div>
</div>
}
{/* <div class="mainWraper">
{
this.service.ShowAction == 1
? (
<div class="fromLogin">
<h2>欢迎登录电子保函管理平台</h2>
<el-input
v-model={this.service.UserLogin.cellphone}
prefix-icon="el-icon-user"
clearable
placeholder="请输入手机号">
</el-input>
<el-input
v-model={this.service.UserLogin.password}
prefix-icon="el-icon-lock"
clearable
show-password
placeholder="请输入密码">
</el-input>
<div class="LoginSubmit" on-click={async () => {
await this.service.UserLoginRequest()
}}>立 即 登 录</div>
</div>
)
: this.service.ShowAction == 2
? (
<div class="fromReg fromLogin">
<h2>注册电子保函管理平台</h2>
<el-input
v-model={this.service.UserReg.cellphone}
prefix-icon="el-icon-phone-outline"
clearable
placeholder="请输手机号">
</el-input>
<div class="SmsCode">
<el-input
type="number"
v-model={this.service.UserReg.verify_code}
prefix-icon="el-icon-chat-line-round"
clearable
placeholder="请输验证码">
</el-input>
<el-button
class="SendCode"
type="primary"
disabled={this.service.SmsStatus.ButtonDisabled}
on-click={() => {
this.service.getSmsCode('reg')
.then(() => {
this.service.SendCode()
})
}}>
{this.service.SmsStatus.NoStartText}
</el-button>
</div>
<el-input
v-model={this.service.UserReg.password}
prefix-icon="el-icon-lock"
clearable
show-password
placeholder="请输入密码">
</el-input>
<el-input
v-model={this.service.UserReg.true_name}
prefix-icon="el-icon-user"
clearable
placeholder="请输入姓名">
</el-input>
<div class="agreement">
<el-checkbox v-model={this.service.isAgreeReg}>我已阅读并同意《用户协议》</el-checkbox>
</div>
<div class="LoginSubmit" on-click={async () => {
await this.service.UserRegRequest()
}}>立 即 注 册</div>
</div>
)
: (
<div class="fromReg fromLogin">
<h2>忘记密码</h2>
<el-input
v-model={this.service.UserForget.cellphone}
prefix-icon="el-icon-phone-outline"
clearable
placeholder="请输手机号">
</el-input>
<div class="SmsCode">
<el-input
type="number"
v-model={this.service.UserForget.verify_code}
prefix-icon="el-icon-chat-line-round"
clearable
placeholder="请输验证码">
</el-input>
<el-button
class="SendCode"
type="primary"
disabled={this.service.SmsStatus.ButtonDisabled}
on-click={() => {
this.service.getSmsCode('resetPassword')
.then(() => {
this.service.SendCode()
})
}}>
{this.service.SmsStatus.NoStartText}
</el-button>
</div>
<el-input
v-model={this.service.UserForget.password}
prefix-icon="el-icon-lock"
clearable
show-password
placeholder="请输入新密码">
</el-input>
<div class="LoginSubmit" on-click={async () => {
await this.service.ResetPassword()
}}>确 认 重 置</div>
</div>
)
}
<div class="Action">
<a class="Reg" onclick={() => {
this.service.clearSendCode()
if (this.service.ShowAction == 1) {
this.service.ShowAction = 2
} else {
this.service.ShowAction = 1
}
}}>
{
this.service.ShowAction == 1
? '注册'
: this.service.ShowAction == 2
? '登录'
: '返回登录'
}
</a>
<a class="ForgetPassword" on-click={() => {
this.service.clearSendCode()
this.service.ShowAction = 3;
}}>忘记密码</a>
</div>
</div> */}
</div>
)
}
}

View File

@@ -0,0 +1,61 @@
import "@pageLess/PersonalCenter.less";
import { Component, Vue } from 'vue-property-decorator';
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import { Button } from 'ant-design-vue'
import { PersonalCenterLogic } from '@/application/logic/page/PersonalCenter.logic';
import Header from "@components/Header/Header"
@Component
export default class ModifyPass extends BaseLayout {
private service: PersonalCenterLogic = new PersonalCenterLogic(this);
private RouterMeta: RouterMeta = {
title: '修改密码',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
return (
<div class="PersonalCenter">
<Header breadcrumb={[{ label: '首页', path: '/Logrc/Index' }, { label: '修改密码', path: '/User/ModifyPass' }]} />
<div style="width: 1200px;margin: 0 auto;">
<div class="headTitle" style="text-align: center;"></div>
<div class="GuaranteeDetailsRow" style="width: 430px; margin: 0 auto;">
<div class="GuaranteeDetailsItem" style="width: 400px;">
<el-input
v-model={this.service.oldPass}
prefix-icon="el-icon-lock"
clearable
// show-password
placeholder="原密码">
</el-input>
<el-input
v-model={this.service.newPass}
style="margin-top: 10px;"
prefix-icon="el-icon-lock"
clearable
// show-password
placeholder="新密码">
</el-input>
<Button
style="width:100%;margin-top: 10px;"
type="primary"
onClick={() => this.service.setPassword()}></Button>
</div>
<div class="clear"></div>
</div>
</div>
</div>
)
}
}

View File

@@ -0,0 +1,75 @@
import "@pageLess/PersonalCenter.less";
import { Component, Vue } from 'vue-property-decorator';
import { PersonalCenterLogic } from "@logic/page/PersonalCenter.logic";
import { RawLocation, Route } from 'vue-router';
import { BaseLayout, RouterMeta } from "@layout/base.layout";
import Header from "@components/Header/Header"
@Component
export default class PersonalCenter extends BaseLayout {
private service: PersonalCenterLogic = new PersonalCenterLogic(this);
private RouterMeta: RouterMeta = {
title: '个人中心',
showNav: true,
isLogin: true
};
created() {
this.service.StartUp();
};
// 路由拦截器
beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
next();
}
protected render() {
let { info } = this.service
return (
<div class="PersonalCenter">
<Header breadcrumb={[{ label: '首页', path: '/Logrc/Index' }, { label: '个人中心', path: '/Logrc/PersonalCenter' }]} />
<div class="cneter">
<h2></h2>
<div style="margin-top: 20px;">
<div class="headTitle"></div>
<div class="GuaranteeDetailsRow">
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.username}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{this.$formatDate(info.create_time)}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title">ip</div>
<div class="text">{info.reg_ip.ip || '暂无'}({info.reg_ip.province || ''}-{info.reg_ip.city || ''})</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title">ip</div>
<div class="text">{info.last_login_ip.ip || '暂无'}({info.last_login_ip.province || ''}-{info.last_login_ip.city || ''})</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{this.$formatDate(info.last_login_time)}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.user.full_name}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.role_info.department.title}</div>
</div>
<div class="GuaranteeDetailsItem">
<div class="title"></div>
<div class="text">{info.status == 9 ? '正常' : '禁用'}</div>
</div>
<div class="clear"></div>
</div>
</div>
</div>
</div>
)
}
}

View File

@@ -0,0 +1 @@
0624ebc7-0eda-4c04-a95c-afe006b7bd51

View File

@@ -0,0 +1 @@
d30adb9d-a26a-4242-8233-d4f36b197946

View File

@@ -0,0 +1,85 @@
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?: { url?: string, useHandle?: boolean }) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
let Params: ParamsType = { url: '', useHandle: false }
Params.url = RequestParams?.url || ConfigureConfig.AjaxConfig.ApiList[propertyKey]
Params.useHandle = RequestParams?.useHandle || Params.useHandle
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 请求注解 fang
* @param RequestParams
* @constructor
*/
export function PUT (RequestParams?: { url?: string, useHandle?: boolean }) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
let Params: ParamsType = { url: '', useHandle: false }
Params.url = RequestParams?.url || ConfigureConfig.AjaxConfig.ApiList[propertyKey]
Params.useHandle = RequestParams?.useHandle || Params.useHandle
CheckParams('put', target, propertyKey, descriptor, Params)
}
}
/**
* DELETE 请求注解
* @param RequestParams
* @constructor
*/
export function DELETE (RequestParams?: { url?: string, useHandle?: boolean }) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
let Params: ParamsType = { url: '', useHandle: false }
Params.url = RequestParams?.url || ConfigureConfig.AjaxConfig.ApiList[propertyKey]
Params.useHandle = RequestParams?.useHandle || Params.useHandle
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 }) => await OldMethods.apply(target, [
// @ts-ignore
await AxioDao[methods]({
url: Params.url,
data: data,
header: Params.header
})
])
return descriptor
} else {
// @ts-ignore
descriptor.value = async (data: { [key:string]: any }) => await AxioDao[methods]({ url: Params.url, data: data, header: Params.header })
return descriptor
}
}

View File

@@ -0,0 +1,36 @@
import "reflect-metadata"
import IocModel from "@model/Ioc.model";
/**
* 收集类依赖
* @constructor
*/
export function Injectable() {
return (_constructor: { new(...args: any[]): {}; }) => {
if (IocModel.classPool.indexOf(_constructor) !== -1) {
throw new Error('无需重复收集类');
} else {
//注册
IocModel.classPool = { name: `${_constructor.name}`, fun: _constructor }
}
}
}
/**
* 将类依赖实例化然后注入到被装饰的属性中
* @constructor
*/
export function Inject(type?: any): (target: any, propertyName: string) => any {
return function (target: any, propertyName: string): any {
let desgin = Reflect.getMetadata("design:type", target, propertyName)
target[propertyName] = new desgin
// let Current = IocModel.classPool.filter((v: any, i: number) => v.name == propertyName)
// if (Current.length == 0) {
// throw new Error('被装饰的属性所属的变量类型类,没有被装饰器@Injectable()注入,请检查!');
// } else {
// target[propertyName] = Reflect.getMetadata("design:type", target, propertyName)
// }
}
}

View File

@@ -0,0 +1,55 @@
import Vue from 'vue';
import { ConfigureConfig } from "@config/configure.config";
/**
* 使用webpack的require.context
* 去搜索指定的目录,获取所有文件的类
* 然后统一new初始化让装饰器Injectable可以先执行
* 从而第一时间去收集依赖类
* @constructor
*/
export function RegisterService() {
return (_constructor: { new(...args: any[]): {}; }) => {
let r = require.context('../service/impl', false, /\.ts$/);
r.keys().forEach((key:any) => {
let m = r(key), className: string[] = Object.keys(m);
className.forEach(v => new m[v]())
});
}
}
/**
* 扫描utils文件夹下的类然后让
* GlobalMethod 装饰器去 prototype vue的方法
* @constructor
*/
export function RegisterMethods() {
return (_constructor: { new (...args: any[]): {}; }) => {
let r = require.context('../utils', false, /\.ts$/);
r.keys().forEach((key:any) => {
let m = r(key), className: string[] = Object.keys(m);
className.forEach(v => {
new m[v]()
})
});
}
}
/**
* 读取 config 配置自动注册Vue插件
* @constructor
*/
export function RegisterVueMethods() {
return (_constructor: { new (...args: any[]): {}; }) => {
ConfigureConfig.VuePlugs.forEach((v:any) => Vue.use(v))
}
}
/**
* 注册Vue全局方法
*/
export function GlobalMethod() {
return (target: any, propertyKey: string) => {
Vue.prototype[`$${propertyKey}`] = target[propertyKey]
}
}

View File

@@ -0,0 +1 @@
1aeb53df-889e-4cfb-9d22-d8350f71ad70

View File

@@ -0,0 +1,69 @@
import VueRouter, { RouterOptions } from 'vue-router';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// 图标选择插件
// @ts-ignore
import iconPicker from 'e-icon-picker';
import 'e-icon-picker/dist/index.css'; //基础样式
import 'e-icon-picker/dist/main.css'; //fontAwesome 图标库样式
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 : 'http://117.71.58.117:8092',
DevUrl : 'http://www.baohan.test',
ProdUrl : 'http://117.71.58.117:8092',
ApiList : {
BidderLoginReg : 'login/reg',// 用户注册
bussinessSetBussiness : 'bussiness/setBussiness', //企业信息提交
LoginIndex : 'login/index', // 用户登录
uploadFile : 'upload/uploadFile', // 上传图片
getBussinessDetail : 'bussiness/getBussinessDetail', //获取企业信息
guaranteeApply : 'guarantee/guaranteeApply', //申请保函
guaranteeList : 'guarantee/guaranteeList', //保函列表
guaranteePay : 'guarantee/guaranteePay', //【网银支付】保函支付
guaranteeScanPay : 'guarantee/scanPay', // 【扫码支付】保函支付
guaranteePayCheck : 'guarantee/payCheck', // 【支付复核】检查支付是否成功
receptApply : 'guarantee/receptApply', //发票申请
guaranteeDetail : 'guarantee/guaranteeDetail', //【详情】保函详情
guaranteeReceptApply : 'guarantee/receptApply', //发票申请
userGetUserInfo : 'user/getUserInfo', //获取用户信息
setPassword : 'user/setPassword', //修改密码
ForgetPassword : 'login/forget', // 重置密码
getSmsCode : 'getSmsCode', // 获取手机验证码
guaranteeReceptDownload : 'guarantee/receptDownload', //发票下载
userLogout : 'user/logout', //退出登录
ProvideDownload : 'guarantee/provideDownload', // 保函下载
},
};
/**
* Vue 插件
*/
public static VuePlugs: PluginObject<never>[] | any = [
VueRouter,
ElementUI,
iconPicker
];
/**
* 路由配置
*/
public static RouterConfigUrl: RouterOptions = {
mode : 'hash',
base : './',
routes : AutoRoutesConfig
};
}

View File

@@ -0,0 +1,60 @@
// 根据page目录结构自动生成的路由配置文件
// 参考Nuxt.jshttps://zh.nuxtjs.org/guide/routing
// @ts-ignore
export const AutoRoutesConfig = [
{
name: "Logrc-Authentication",
path: "/Logrc/Authentication",
component: () => import(/* webpackChunkName: 'LogrcAuthentication' */ '@page/Logrc/Authentication'),
meta: {title:'企业认证',showNav:true,isLogin:true}
},
{
name: "Logrc-EnterpriseCertification",
path: "/Logrc/EnterpriseCertification",
component: () => import(/* webpackChunkName: 'LogrcEnterpriseCertification' */ '@page/Logrc/EnterpriseCertification'),
meta: {title:'企业认证',showNav:true,isLogin:true}
},
{
name: "Logrc-GuaranteeApply",
path: "/Logrc/GuaranteeApply",
component: () => import(/* webpackChunkName: 'LogrcGuaranteeApply' */ '@page/Logrc/GuaranteeApply'),
meta: {title:'保函申请',showNav:true,isLogin:true}
},
{
name: "Logrc-GuaranteeDetails",
path: "/Logrc/GuaranteeDetails",
component: () => import(/* webpackChunkName: 'LogrcGuaranteeDetails' */ '@page/Logrc/GuaranteeDetails'),
meta: {title:'保函详情',showNav:true,isLogin:true}
},
{
name: "Logrc-GuaranteeQuery",
path: "/Logrc/GuaranteeQuery",
component: () => import(/* webpackChunkName: 'LogrcGuaranteeQuery' */ '@page/Logrc/GuaranteeQuery'),
meta: {title:'保函查询',showNav:true,isLogin:true}
},
{
name: "Logrc-Index",
path: "/Logrc/Index",
component: () => import(/* webpackChunkName: 'LogrcIndex' */ '@page/Logrc/Index'),
meta: {title:'首页',showNav:true,isLogin:true}
},
{
name: "User-Login",
path: "/User/Login",
component: () => import(/* webpackChunkName: 'UserLogin' */ '@page/User/Login'),
meta: {title:'登录',showNav:true,isLogin:true}
},
{
name: "User-ModifyPass",
path: "/User/ModifyPass",
component: () => import(/* webpackChunkName: 'UserModifyPass' */ '@page/User/ModifyPass'),
meta: {title:'修改密码',showNav:true,isLogin:true}
},
{
name: "User-PersonalCenter",
path: "/User/PersonalCenter",
component: () => import(/* webpackChunkName: 'UserPersonalCenter' */ '@page/User/PersonalCenter'),
meta: {title:'个人中心',showNav:true,isLogin:true}
}
];

View File

@@ -0,0 +1 @@
69af8476-15bb-4641-87b3-f584d75d3d61

View File

@@ -0,0 +1,148 @@
import axios from "axios";
import { IndexUtils } from "@utils/index.utils";
import { MessageBox, Notification } from 'element-ui';
/**
* axios的封装
*/
export class AxioDao {
public constructor() {
// 设置接口请求基地址
axios.defaults.baseURL = IndexUtils.CheckAjaxUrl();
this.ResponseInterceptor()
this.RequestInterceptor()
}
/**
* Get 请求
* 请求参数请参考接口RequestParams
* @param params
*/
public async get(params: { url: string, data: Object, header?: Object }): Promise<Object> {
params.url = `${ params.url }?${ this.formatParams({ Authorization : localStorage.getItem("token") }) }`
try {
return await axios.get(params.url, {
params : Object.assign({
date: Date.parse(new Date().toString()),
}, params.data),
});
} catch (e) {
//Notification.error(`GET 请求出错:${ e.message }`)
throw new Error(`GET 请求出错:${ e.message }`)
}
}
/**
* Post 请求
* 请求参数请参考接口RequestParams
* @param params
*/
public async post(params: { url: string, data: Object, header?: Object }): Promise<Object> {
params.url = `${ params.url }?${ this.formatParams({ Authorization : localStorage.getItem("token") }) }`
try {
return await axios.post(
params.url,
Object.assign(params.data,{date: Date.parse(new Date().toString()) }),
{
headers : params.header
})
} catch (e) {
//Notification.error(`POST 请求出错:${ e.message }`)
throw new Error(`POST 请求出错:${ e.message }`)
}
}
/**
* Put 请求
* 请求参数请参考接口RequestParams
* @param params
*/
public async put(params: { url: string, data: Object }): Promise<Object> {
try {
return await axios.put(params.url, params.data)
} catch (e) {
//Notification.error(`PUT 请求出错:${ e.message }`)
throw new Error(`PUT 请求出错:${ e.message }`)
}
}
/**
* delete 请求
* 请求参数请参考接口RequestParams
* @param params
*/
public async delete(params: { url: string, data: Object }): Promise<Object> {
try {
return await axios.delete(params.url, { params : params.data })
} catch (e) {
//Notification.error(`DELETE 请求出错:${ e.message }`)
throw new Error(`DELETE 请求出错:${ e.message }`)
}
}
/**
* 响应拦截器
* @constructor
*/
public async ResponseInterceptor(): Promise<any> {
axios.interceptors.response.use(async (response: any) => {
switch (response.data.code) {
case 0:
switch (response.data.status) {
case 1:
if(response.data.msg == null) return response.data.data;
await MessageBox.alert(response.data.msg, "温馨提示")
return response.data.data;
default:
await MessageBox.alert(`[${ response.data.status }] ${ response.data.msg }`, "错误提示")
throw new Error(`[${ response.data.status }] ${ response.data.msg }`);
break;
}
break;
case 1001:
await MessageBox.alert(
response.data.msg,
"温馨提示",
{}
).then(() => {
localStorage.removeItem("token")
location.href = "#/User/Login"
})
return;
break;
default:
// 处理code错误
return null;
}
return response.data;
}, (error: Error) => {
return Promise.reject(error)
})
}
/**
* 添加请求拦截器
* @constructor
*/
public async RequestInterceptor(): Promise<any> {
axios.interceptors.request.use((config: any) => {
return config
}, function (error: Error) {
return Promise.reject(error)
})
}
public formatParams(data: any) {
let arr = [];
for (let name in data) {
arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
}
arr.push(("v=" + Math.random()).replace(".", ""));
return arr.join("&");
}
}
export default new AxioDao();

View File

@@ -0,0 +1 @@
4d2fadab-6ab2-4a5c-bf8f-20613163c761

View File

@@ -0,0 +1,14 @@
class IocModel {
private _classPool: Array<{ name: string, fun: { new (...args: any[]): {}; } }> = [];
get classPool(): any {
return this._classPool;
}
set classPool(value: any) {
this._classPool.push(value);
}
}
export default new IocModel();

View File

@@ -0,0 +1 @@
7b57a41d-b36b-45f0-aee3-d3f83454af11

View File

@@ -0,0 +1,67 @@
import 'reflect-metadata';
import '@types/RouterHooks';
import Vue, { VueConstructor } from 'vue';
import App from '@application/App'
import { ConfigureConfig } from "@config/configure.config";
import VueRouter from 'vue-router';
import { RegisterMethods, RegisterService, RegisterVueMethods } from "@ann/Register.annotation";
import 'ant-design-vue/dist/antd.css';
@RegisterService()
@RegisterMethods()
@RegisterVueMethods()
export class InitRun {
// 保存Vue对象
protected VueApp: VueConstructor = Vue;
// 保存VueRouter对象
protected Router!: VueRouter;
// 根组件App
protected DomApp: typeof App = App;
constructor() {
this.VueApp.config.productionTip = false;
this.initPlugs();
}
private initPlugs(): void {
this.InitVueRouter()
}
/**
* 初始化 VueRouter
* @constructor
* @private
*/
private InitVueRouter(): void {
this.Router = new VueRouter(ConfigureConfig.RouterConfigUrl);
// 重写路由Push
const routerPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location: any): any {
// @ts-ignore
return routerPush.call(this, location).catch((error: any) => error)
}
this.Router.beforeEach((to: any, from: any, next: any) => {
if (to.meta.title) {
document.title = to.meta.title;
}
next()
// 如果路由需要登录
// if (to.meta.isLogin) {
// // 如果未登录
// if (localStorage.getItem("token") == null) {
// next({
// path: '/User/Login',
// query: { redirect: to.fullPath }
// })
// } else {
// next()
// }
// } else {
// next();
// }
});
}
}

View File

@@ -0,0 +1,18 @@
import { InitRun } from "@run/init.run";
import { CreateElement } from "vue";
class StartRun extends InitRun {
constructor() {
super();
this.Init()
}
Init() {
new this.VueApp({
router: this.Router,
render: (h: CreateElement) => h(this.DomApp)
}).$mount('#app');
}
}
new StartRun();

View File

@@ -0,0 +1 @@
61e9a782-0ce1-4270-93f6-5e18664b559b

View File

@@ -0,0 +1,8 @@
import { Enterprise } from "@/application/logic/page/EnterpriseCertification.logic";
export interface BussinessService {
bussinessSetBussiness(data: Enterprise): Promise<any>
getBussinessDetail(): Promise<Enterprise | null>
guaranteeApply(data: any): Promise<any>
guaranteeList(data: any): Promise<any>
}

View File

@@ -0,0 +1,14 @@
export type uploadFileType = {
file_type: string
file: File
}
export type uploadFileReturn = {
path: string
id: string
}
export interface PublicService {
uploadFile(data: FormData): Promise<uploadFileReturn | null>
}

View File

@@ -0,0 +1,4 @@
export interface UserService {
BidderLoginReg(params: object): Promise<any>;
LoginIndex(params: object): Promise<any>;
}

View File

@@ -0,0 +1 @@
0ac916c0-e9b9-426d-9d7e-0a568bd09887

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