first commit
3
陈海波/投标平台/qiyeduan/.browserslistrc
Normal file
@@ -0,0 +1,3 @@
|
||||
> 1%
|
||||
last 2 versions
|
||||
not ie < 9
|
||||
23
陈海波/投标平台/qiyeduan/.gitignore
vendored
Normal 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?
|
||||
1
陈海波/投标平台/qiyeduan/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
904f434f-9a2f-406d-bfd6-f1acab5b1f25
|
||||
183
陈海波/投标平台/qiyeduan/README.md
Normal 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> 文件类型: [page,logic,service,impl,less]
|
||||
-n, --file-name <name> 被创建的文件名称
|
||||
-i, --is-create <is> 是否为 -t 参数自动创建相关文件类型 (default: false)
|
||||
-v, --version 显示当前的版本
|
||||
-h, --help display help for command
|
||||
```
|
||||
|
||||
参数说明:
|
||||
- -t:需要被创建的文件类型,取值 page(TSX页面),logic(TSX页面的js抽象层),service(请求中间层的接口),impl(实现接口的类),less(css样式文件)。可以多传!
|
||||
- -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:实现对整个项目所有类的收集,然后各个文件不需要多次对各种文件的引入!
|
||||
5
陈海波/投标平台/qiyeduan/babel.config.js
Normal file
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset'
|
||||
]
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/bin/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
7c0d9e22-1922-439e-bd5a-07762a61811c
|
||||
1
陈海波/投标平台/qiyeduan/bin/config/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
6ed708f3-a582-4bbc-a7dd-4bff992d1ee7
|
||||
92
陈海波/投标平台/qiyeduan/bin/config/index.js
Normal 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} {
|
||||
}
|
||||
`
|
||||
}
|
||||
}
|
||||
105
陈海波/投标平台/qiyeduan/bin/tinit
Normal 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>', '文件类型: [page,logic,service,impl,less]')
|
||||
.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)
|
||||
}
|
||||
2
陈海波/投标平台/qiyeduan/global.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
type Class<T> = new () => T
|
||||
type VueComponent<Props> = Class<{ $props: Props | { props: Props } }>
|
||||
25
陈海波/投标平台/qiyeduan/gulpfile.js
Normal 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'));
|
||||
85484
陈海波/投标平台/qiyeduan/package-lock.json
generated
Normal file
49
陈海波/投标平台/qiyeduan/package.json
Normal 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"
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/public/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
61e0d196-f59c-4ba1-8e34-b10ce89f17ee
|
||||
BIN
陈海波/投标平台/qiyeduan/public/favicon.ico
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
1
陈海波/投标平台/qiyeduan/public/img/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
c2591f23-1dd0-4f85-85d2-163ae2f9e11e
|
||||
BIN
陈海波/投标平台/qiyeduan/public/img/2020042842436705.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
1
陈海波/投标平台/qiyeduan/public/img/LeftLogin.svg
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
陈海波/投标平台/qiyeduan/public/img/login_bc.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
陈海波/投标平台/qiyeduan/public/img/pay_wx.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
陈海波/投标平台/qiyeduan/public/img/pay_yl1.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
陈海波/投标平台/qiyeduan/public/img/pay_zfb2.png
Normal file
|
After Width: | Height: | Size: 983 B |
BIN
陈海波/投标平台/qiyeduan/public/img/u2_state0.png
Normal file
|
After Width: | Height: | Size: 139 KiB |
17
陈海波/投标平台/qiyeduan/public/index.html
Normal 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>
|
||||
1
陈海波/投标平台/qiyeduan/src/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
6e8f2bcd-24c5-41e9-8b52-84ad42b1c4b1
|
||||
1
陈海波/投标平台/qiyeduan/src/application/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
79d23f76-7d20-44e3-ae6a-51420e3f7bc0
|
||||
18
陈海波/投标平台/qiyeduan/src/application/App.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/application/assets/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
0bfb5318-7e33-41d6-9847-fa21d6d5510c
|
||||
1
陈海波/投标平台/qiyeduan/src/application/assets/less/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
41738ca9-121e-4563-a426-c6159580aa9b
|
||||
@@ -0,0 +1 @@
|
||||
4ce494e0-02b1-4aa0-96b2-ad442fa5d4c4
|
||||
309
陈海波/投标平台/qiyeduan/src/application/assets/less/color/index.less
Normal 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);
|
||||
@@ -0,0 +1 @@
|
||||
3708ca30-57af-47ef-9d26-ae6e140ba096
|
||||
508
陈海波/投标平台/qiyeduan/src/application/assets/less/common/normalize.less
vendored
Normal 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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
// 重置ui框架css
|
||||
.el-input__icon {
|
||||
height: auto !important;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
bad7fcca-2481-4733-a4ec-7593f4d8df42
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
10
陈海波/投标平台/qiyeduan/src/application/assets/less/imports.less
Normal file
@@ -0,0 +1,10 @@
|
||||
// 公共css
|
||||
@import "./common/normalize";
|
||||
@import "./common/rem";
|
||||
@import "./common/resetUi";
|
||||
|
||||
// 颜色配置
|
||||
@import "./color/index";
|
||||
|
||||
// 公共css 方法
|
||||
@import "./mixin/index";
|
||||
@@ -0,0 +1 @@
|
||||
8b07539f-a486-48bb-a279-42a69d8ccdc9
|
||||
295
陈海波/投标平台/qiyeduan/src/application/assets/less/mixin/index.less
Normal 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;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
c581b0a3-5c65-4f1b-b08c-589f95ce8565
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
182
陈海波/投标平台/qiyeduan/src/application/assets/less/page/Login.less
Normal 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;
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/application/components/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
1b20a809-644c-479b-9130-319f82bbe400
|
||||
@@ -0,0 +1 @@
|
||||
ecfc17a0-13a8-4bfb-b594-790733062c8f
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
0475e18f-5570-4acd-b577-29661c8e5745
|
||||
23
陈海波/投标平台/qiyeduan/src/application/components/Title/Title.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/application/layout/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
a3bbf516-8a09-4ac9-80a9-384b5eb851d0
|
||||
25
陈海波/投标平台/qiyeduan/src/application/layout/base.layout.ts
Normal 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
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/application/logic/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
645c1de9-e0a0-40e6-9f61-50299eeafccf
|
||||
38
陈海波/投标平台/qiyeduan/src/application/logic/Base.logic.ts
Normal 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
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/application/logic/page/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
020a7681-ad42-4161-a3a1-cbc95db1e37f
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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'
|
||||
} ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
71
陈海波/投标平台/qiyeduan/src/application/logic/page/Index.logic.ts
Normal 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
|
||||
}
|
||||
}
|
||||
137
陈海波/投标平台/qiyeduan/src/application/logic/page/Login.logic.ts
Normal 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()
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/application/page/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
ab40133a-13eb-4cf0-a18a-d73fef7cf9b9
|
||||
1
陈海波/投标平台/qiyeduan/src/application/page/Logrc/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
edd8cefb-09e1-4cbf-9a90-4c1be980bf5f
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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 >
|
||||
)
|
||||
}
|
||||
}
|
||||
228
陈海波/投标平台/qiyeduan/src/application/page/Logrc/GuaranteeApply.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
}
|
||||
221
陈海波/投标平台/qiyeduan/src/application/page/Logrc/GuaranteeQuery.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
}
|
||||
106
陈海波/投标平台/qiyeduan/src/application/page/Logrc/Index.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/application/page/User/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
92108c4c-add3-446d-8c61-47a4d9ebb634
|
||||
352
陈海波/投标平台/qiyeduan/src/application/page/User/Login.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
}
|
||||
61
陈海波/投标平台/qiyeduan/src/application/page/User/ModifyPass.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/core/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
0624ebc7-0eda-4c04-a95c-afe006b7bd51
|
||||
1
陈海波/投标平台/qiyeduan/src/core/annotation/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
d30adb9d-a26a-4242-8233-d4f36b197946
|
||||
85
陈海波/投标平台/qiyeduan/src/core/annotation/Http.annotation.ts
Normal 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
|
||||
}
|
||||
}
|
||||
36
陈海波/投标平台/qiyeduan/src/core/annotation/Ioc.annotation.ts
Normal 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)
|
||||
// }
|
||||
}
|
||||
}
|
||||
55
陈海波/投标平台/qiyeduan/src/core/annotation/Register.annotation.ts
Normal 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]
|
||||
}
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/core/config/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
1aeb53df-889e-4cfb-9d22-d8350f71ad70
|
||||
69
陈海波/投标平台/qiyeduan/src/core/config/configure.config.ts
Normal 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
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
60
陈海波/投标平台/qiyeduan/src/core/config/route.config.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
// 根据page目录结构,自动生成的路由配置文件
|
||||
// 参考Nuxt.js:https://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}
|
||||
}
|
||||
];
|
||||
1
陈海波/投标平台/qiyeduan/src/core/dao/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
69af8476-15bb-4641-87b3-f584d75d3d61
|
||||
148
陈海波/投标平台/qiyeduan/src/core/dao/index.dao.ts
Normal 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();
|
||||
1
陈海波/投标平台/qiyeduan/src/core/model/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
4d2fadab-6ab2-4a5c-bf8f-20613163c761
|
||||
14
陈海波/投标平台/qiyeduan/src/core/model/Ioc.model.ts
Normal 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();
|
||||
1
陈海波/投标平台/qiyeduan/src/core/run/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
7b57a41d-b36b-45f0-aee3-d3f83454af11
|
||||
67
陈海波/投标平台/qiyeduan/src/core/run/init.run.ts
Normal 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();
|
||||
// }
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
18
陈海波/投标平台/qiyeduan/src/core/run/start.run.ts
Normal 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();
|
||||
1
陈海波/投标平台/qiyeduan/src/core/service/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
61e9a782-0ce1-4270-93f6-5e18664b559b
|
||||
8
陈海波/投标平台/qiyeduan/src/core/service/Bussiness.service.ts
Normal 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>
|
||||
}
|
||||
14
陈海波/投标平台/qiyeduan/src/core/service/Public.Service.ts
Normal 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>
|
||||
}
|
||||
4
陈海波/投标平台/qiyeduan/src/core/service/User.service.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
export interface UserService {
|
||||
BidderLoginReg(params: object): Promise<any>;
|
||||
LoginIndex(params: object): Promise<any>;
|
||||
}
|
||||
1
陈海波/投标平台/qiyeduan/src/core/service/impl/.pydio
Normal file
@@ -0,0 +1 @@
|
||||
0ac916c0-e9b9-426d-9d7e-0a568bd09887
|
||||