This commit is contained in:
xuyucheng 2022-05-16 16:41:33 +08:00
parent 71e2dc4402
commit 396a39de99
11 changed files with 163 additions and 75 deletions

28
readme.md Normal file
View File

@ -0,0 +1,28 @@
下载安装依赖:
npm install
启动项目:
npm start
文件结构:
config - Webpack配置
node_modules - 依赖
public - 静态公共文件
src - 逻辑代码
assets - 静态资源
style - css
general.css - 全局css样式
editReport.css - Manager > 服务 > 编辑报告 css样式
SourceHanSansK-Normal.ttf - 字体
svg - 静态图片
components - 公共组件
api - 封装axios请求
page - 页面

View File

@ -1,6 +0,0 @@
@mixin flex($wrap) {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: $wrap;
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1652324668353" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4330" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
</style></defs><path d="M719.8 480H304.2c-49.5 0-80.3-53.9-55.1-96.5l207.8-352C469.3 10.5 490.7 0 512 0s42.7 10.5 55.1 31.5l207.8 351.9c25.2 42.7-5.5 96.6-55.1 96.6z" p-id="4331" fill="#bfbfbf"></path></svg>

After

Width:  |  Height:  |  Size: 875 B

View File

@ -0,0 +1,2 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1652324652314" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3952" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
</style></defs><path d="M774.9 640.5l-207.8 352c-12.4 21-33.8 31.5-55.1 31.5s-42.7-10.5-55.1-31.5l-207.8-352c-25.2-42.7 5.6-96.5 55.1-96.5h415.6c49.6 0 80.3 53.9 55.1 96.5z" p-id="3953" fill="#bfbfbf"></path></svg>

After

Width:  |  Height:  |  Size: 882 B

View File

@ -2,8 +2,5 @@ import React from 'react'
import ReactDOM from 'react-dom' import ReactDOM from 'react-dom'
import App from './App' import App from './App'
import './assets/style/general.css' import './assets/style/general.css'
import api from './api/request'
React.$axios = api
ReactDOM.render(<App />, document.getElementById('root')) ReactDOM.render(<App />, document.getElementById('root'))

View File

@ -1,24 +1,19 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import { Input, Select, Row, Form, Button } from 'antd' import { Input, Select, Row, Form, Button, Card, Col, Pagination, Descriptions, Image } from 'antd'
import FeTable from '@/components/table'
import api from "@/api/request" import api from "@/api/request"
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import store from "@/store/index" import store from "@/store/index"
import { operationAction } from "@/action/index" import { operationAction } from "@/action/index"
import sortUp from "@/assets/svg/排序,升序.svg"
import sortDown from "@/assets/svg/排序,降序.svg"
const { Option } = Select const { Option } = Select
var status = {
name: '',
sort: ''
}
class ManageCompany extends Component { class ManageCompany extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
data: [], data: [],
columns: [],
total: 0, total: 0,
form: { form: {
search: {}, search: {},
@ -50,28 +45,15 @@ class ManageCompany extends Component {
onSubmit = () => { onSubmit = () => {
api.post("/admin/company/search", this.state.form).then(res => { api.post("/admin/company/search", this.state.form).then(res => {
if (res.result.records.length !== 0) { if (res.result.records.length !== 0) {
const col = Object.keys(res.result.records[0]).map((key, i) => {
return {
title: key, dataIndex: key, align: 'center', key: i, sorter: (a, b, c) => { this.sort(c, key) },
}
})
col.push({
title: '详 情',
dataIndex: '详 情',
key: col.length,
align: 'center',
render: () => <span style={{ color: '#108ee9', cursor: 'pointer' }}> </span>
})
this.setState({ this.setState({
data: res.result.records, data: res.result.records,
total: res.result.total, total: res.result.total,
columns: col
}) })
} else { } else {
this.setState({ this.setState({
data: [], data: [],
total: 0, total: 0,
columns: []
}) })
} }
}).catch(err => { }).catch(err => {
@ -79,38 +61,37 @@ class ManageCompany extends Component {
}) })
} }
sort = (c, item) => { callback(value) {
if (status.name === item && status.sort === c) { const newPanes = [...this.props.panes]
return false const state = newPanes.every(item => {
return item.title === value["企业名称"] ? false : true
})
if (state) {
newPanes.push({ title: value["企业名称"], content: "/manager/company/details", key: (Number(newPanes[newPanes.length - 1].key) + 1).toString(), id: { cid: value["企业ID"] } });
store.dispatch(operationAction(newPanes, (newPanes[newPanes.length - 1].key)))
} else { } else {
status = { return null
name: item,
sort: c
}
this.setState({
form: Object.assign(this.state.form, {
sort: { [item]: c === 'ascend' ? 'asc' : 'desc' }
})
}, () => {
this.onSubmit()
})
} }
} }
callback(e, value) { setSortUp(name,value){
if (e === '详 情') { this.setState({
const newPanes = [...this.props.panes] form: Object.assign(this.state.form, {
const state = newPanes.every(item => { sort: { [name]:value }
return item.title === value["企业名称"]? false : true
}) })
if (state) { }, () => {
newPanes.push({ title: value["企业名称"], content: "/manager/company/details", key: (Number(newPanes[newPanes.length - 1].key) + 1).toString(), id: { cid: value["企业ID"] } }); this.onSubmit()
store.dispatch(operationAction(newPanes, (newPanes[newPanes.length - 1].key))) })
} else { }
return null
}
}
setSortDown(name,value){
this.setState({
form: Object.assign(this.state.form, {
sort: { [name]:value }
})
}, () => {
this.onSubmit()
})
} }
pageChange = (current, pageSize) => { pageChange = (current, pageSize) => {
@ -142,15 +123,27 @@ class ManageCompany extends Component {
<Row justify='space-between'> <Row justify='space-between'>
<Form layout="inline" onFinish={this.submit} style={{ marginBottom: 20 }}> <Form layout="inline" onFinish={this.submit} style={{ marginBottom: 20 }}>
<Form.Item name="企业ID" label="企业ID"> <Form.Item name="企业ID" label="企业ID">
<Input allowClear /> <Input allowClear style={{ width: 150 }} />
<span style={{marginLeft:10}}>
<Image src={sortUp} width={15} preview={false} onClick={this.setSortUp.bind(this,"企业ID","asc")}></Image>
<Image src={sortDown} width={15} preview={false} onClick={this.setSortDown.bind(this,"企业ID","desc")} style={{ position: "relative", left: -15, top: 5 }}></Image>
</span>
</Form.Item> </Form.Item>
<Form.Item name="企业名称" label="企业名称"> <Form.Item name="企业名称" label="企业名称">
<Input allowClear /> <Input allowClear style={{ width: 150 }} />
<span style={{marginLeft:10}}>
<Image src={sortUp} width={15} preview={false} onClick={this.setSortUp.bind(this,"企业名称","asc")}></Image>
<Image src={sortDown} width={15} preview={false} onClick={this.setSortDown.bind(this,"企业名称","desc")} style={{ position: "relative", left: -15, top: 5 }}></Image>
</span>
</Form.Item> </Form.Item>
<Form.Item name="一级行业" label="一级行业"> <Form.Item name="一级行业" label="一级行业">
<Input allowClear /> <Input allowClear style={{ width: 150 }} />
<span style={{marginLeft:10}}>
<Image src={sortUp} width={15} preview={false} onClick={this.setSortUp.bind(this,"一级行业","asc")}></Image>
<Image src={sortDown} width={15} preview={false} onClick={this.setSortDown.bind(this,"一级行业","desc")} style={{ position: "relative", left: -15, top: 5 }}></Image>
</span>
</Form.Item> </Form.Item>
<Form.Item name="综信评价" label="综信评价"> <Form.Item name="信用等级" label="信用等级">
<Select style={{ width: 150 }} mode="multiple" allowClear> <Select style={{ width: 150 }} mode="multiple" allowClear>
<Option value="AAA">AAA</Option> <Option value="AAA">AAA</Option>
<Option value="AA+">AA+</Option> <Option value="AA+">AA+</Option>
@ -175,22 +168,44 @@ class ManageCompany extends Component {
<Option value="C">C</Option> <Option value="C">C</Option>
<Option value="C-">C-</Option> <Option value="C-">C-</Option>
</Select> </Select>
<span style={{marginLeft:10}}>
<Image src={sortUp} width={15} preview={false} onClick={this.setSortUp.bind(this,"信用等级","asc")}></Image>
<Image src={sortDown} width={15} preview={false} onClick={this.setSortDown.bind(this,"信用等级","desc")} style={{ position: "relative", left: -15, top: 5 }}></Image>
</span>
</Form.Item> </Form.Item>
<Form.Item name="ESG评价" label="ESG评价" > <Form.Item name="ESG等级" label="ESG等级" >
<Select style={{ minWidth: 150 }} mode="multiple" allowClear> <Select style={{ width: 150 }} mode="multiple" allowClear>
<Option value="A">A</Option> <Option value="A">A</Option>
<Option value="B">B</Option> <Option value="B">B</Option>
<Option value="C">C</Option> <Option value="C">C</Option>
<Option value="D">D</Option> <Option value="D">D</Option>
<Option value="E">E</Option> <Option value="E">E</Option>
</Select> </Select>
<span style={{marginLeft:10}}>
<Image src={sortUp} width={15} preview={false} onClick={this.setSortUp.bind(this,"ESG等级","asc")}></Image>
<Image src={sortDown} width={15} preview={false} onClick={this.setSortDown.bind(this,"ESG等级","desc")} style={{ position: "relative", left: -15, top: 5 }}></Image>
</span>
</Form.Item> </Form.Item>
<Button type="primary" htmlType="submit"> <Button type="primary" htmlType="submit">
检索 检索
</Button> </Button>
</Form> </Form>
</Row> </Row>
<FeTable data={this.state.data} columns={this.state.columns} current={this.state.form.page_no} callback={this.callback.bind(this)} total={this.state.total} pageChange={this.pageChange.bind(this)} onShowSizeChange={this.onShowSizeChange.bind(this)} /> <Row gutter={16}>
{this.state.data.map(item => {
return <Col span={24}>
<Card onClick={this.callback.bind(this, item)}>
<Descriptions title={item["企业名称"]} style={{ margin: 0 }}>
<Descriptions.Item label="一级行业">{item["一级行业"]}</Descriptions.Item>
<Descriptions.Item label="企业ID">{item["企业ID"]}</Descriptions.Item>
<Descriptions.Item label="信用等级">{item["信用等级"] ? item["信用等级"] : "-"}</Descriptions.Item>
<Descriptions.Item label="ESG等级">{item["ESG等级"] ? item["ESG等级"] : "-"}</Descriptions.Item>
</Descriptions>
</Card>
</Col>
})}
</Row>
<Pagination style={{ float: 'right' }} current={this.state.form.page_no} total={this.state.total} onChange={this.pageChange.bind(this)} onShowSizeChange={this.onShowSizeChange.bind(this)} showSizeChanger pageSizeOptions={[5, 10]} />
</React.Fragment> </React.Fragment>
) )
} }

View File

@ -18,7 +18,7 @@ function RateProcess1(props) {
.then(res => { .then(res => {
let count = 1 let count = 1
const nodes = [] const nodes = []
const edges = [ const edges_1 = [
{ {
"id": "e1-2", "id": "e1-2",
"source": "1", "source": "1",
@ -92,13 +92,57 @@ function RateProcess1(props) {
"animated": true "animated": true
} }
] ]
const edges_2 = [
{
"id": "e1-2",
"source": "1",
"target": "2",
"animated": true
},
{
"id": "e1-3",
"source": "1",
"target": "3",
"animated": true
},
{
"id": "e2-4",
"source": "2",
"target": "4",
"animated": true
},
{
"id": "e3-4",
"source": "3",
"target": "4",
"animated": true
},
{
"id": "e4-5",
"source": "4",
"target": "5",
"animated": true
},
{
"id": "e5-6",
"source": "5",
"target": "6",
"animated": true
},
{
"id": "e6-7",
"source": "6",
"target": "7",
"animated": true
},
]
res.info.forEach((item, index) => { res.info.forEach((item, index) => {
Object.keys(item).forEach((key, i) => { Object.keys(item).forEach((key, i) => {
nodes.push({ nodes.push({
id: count.toString(), id: count.toString(),
data: { label: key }, data: { label: key },
type: index === 0 ? "input" : index === res.info.length - 1 ? "output" : "default", type: index === 0 ? "input" : index === res.info.length - 1 ? "output" : "default",
position: { x: (i+1) * 200, y: (index + 1) * 100 }, position: { x: (i + 1) * 200, y: (index + 1) * 100 },
style: item[key] === 1 ? { style: item[key] === 1 ? {
background: '#87d068', background: '#87d068',
color: '#fff', color: '#fff',
@ -115,12 +159,16 @@ function RateProcess1(props) {
}) })
}) })
setNodes(nodes) setNodes(nodes)
setEdges(edges) if (props.value.type === "ESG评价流程") {
setEdges(edges_2)
} else {
setEdges(edges_1)
}
}) })
}, [props.value]) }, [props.value])
return ( return (
<div style={{ width: "100%",height:600 }}> <div style={{ width: "100%", height: 600 }}>
<ReactFlow <ReactFlow
nodes={nodes} nodes={nodes}
edges={edges} edges={edges}

View File

@ -25,7 +25,6 @@ class ManageRate extends Component {
this.onSearch("") this.onSearch("")
} }
onSearch = (value) => { onSearch = (value) => {
api.post("/admin/rating/search", { query: value, skip: 0, limit: 10 }).then(res => { api.post("/admin/rating/search", { query: value, skip: 0, limit: 10 }).then(res => {
const col = Object.keys(res.result[0]).map((key, i) => { const col = Object.keys(res.result[0]).map((key, i) => {

View File

@ -13,11 +13,11 @@ class TestCompany extends Component {
super(props) super(props)
this.state = { this.state = {
data: [ data: [
{ title: "企业认证", desc: "根据企业名称、统一社会信用代码、法人姓名进行企业认证", obj: { company: "", code: "", legal_person: "", cid: "" }, label: ["企业名称", "统一社会信用代码", "法人姓名", "企业ID"], url: "/admin/test/enterprise_certification", method: 'post' }, // { title: "企业认证", desc: "根据企业名称、统一社会信用代码、法人姓名进行企业认证", obj: { company: "", code: "", legal_person: "", cid: "" }, label: ["企业名称", "统一社会信用代码", "法人姓名", "企业ID"], url: "/admin/test/enterprise_certification", method: 'post' },
{ title: "级联删除企业ID", desc: "根据cid删除与其有关的所有记录", obj: { cid: "", data: [] }, label: ["企业ID", "企业数据"], url: "/admin/test/delete_cid_cascade", method: 'post' }, // { title: "级联删除企业ID", desc: "根据cid删除与其有关的所有记录", obj: { cid: "", data: [] }, label: ["企业ID", "企业数据"], url: "/admin/test/delete_cid_cascade", method: 'post' },
{ title: "级联删除评价ID", desc: "根据rid删除与其有关的所有记录", obj: { rid: "", record: "", data: [] }, label: ["评价ID", "评价类型", "评价记录"], url: "/admin/test/delete_rid_cascade", method: 'post' }, // { title: "级联删除评价ID", desc: "根据rid删除与其有关的所有记录", obj: { rid: "", record: "", data: [] }, label: ["评价ID", "评价类型", "评价记录"], url: "/admin/test/delete_rid_cascade", method: 'post' },
{ title: "企业认证状态修改", desc: "修改企业认证状态,只能修改为未认证,如需认证则通过认证接口", obj: { cid: "" }, label: ["企业ID"], url: "/admin/test/change_verified", method: 'get' }, // { title: "企业认证状态修改", desc: "修改企业认证状态,只能修改为未认证,如需认证则通过认证接口", obj: { cid: "" }, label: ["企业ID"], url: "/admin/test/change_verified", method: 'get' },
{ title: "级联生成企业主页", desc: "根据rid生成企业主页信息", obj: { rid: "", types: "" }, label: ["评价ID", "评价类型"], url: "/admin/test/generate_rid_information", method: 'post' }, // { title: "级联生成企业主页", desc: "根据rid生成企业主页信息", obj: { rid: "", types: "" }, label: ["评价ID", "评价类型"], url: "/admin/test/generate_rid_information", method: 'post' },
{ title: "新增测试企业", desc: "新增一家测试测试", obj: { email: "", company: "", code: "", legal_person: "" }, label: ["邮箱", "企业", "统一社会信用代码", "法人"], url: "/admin/test/new_company", method: 'post' }, { title: "新增测试企业", desc: "新增一家测试测试", obj: { email: "", company: "", code: "", legal_person: "" }, label: ["邮箱", "企业", "统一社会信用代码", "法人"], url: "/admin/test/new_company", method: 'post' },
], ],
setIsModalVisible: false, setIsModalVisible: false,

View File

@ -1,5 +1,5 @@
import JSEncrypt from "jsencrypt"; import JSEncrypt from "jsencrypt";
// RSA加密
export function rsaKey(args) { export function rsaKey(args) {
var encryptor = new JSEncrypt() var encryptor = new JSEncrypt()
var pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxBnMmUNpreT9AJVkcAjfTLXb+2C2O8VYaFeOUPkMT+OzZfmS6DSg5WCH/MdZHbYh/rrOTUK2JfxLq9qzqjV4w7i/DNDnplnsRekrdi2qO5rTuutTLAE29b0hx83/xNbTn8yrMoTCLCjLOvcnuFQkcfCLNnCU7lhFWWhHheDd1NEznzuItfrqI10kzb+aIWUzBgVl6zxxlC9OH690LZd16q/cI+oBW286Xyl8MmKnjND4P9Y1cm2IRHikz6RLPgilL1iy/QXb4eQX+2oCcL8lvrQOCCMfKHpJdC7fwxbHxTiUlqeMVY4bXLwkUUl1wH2+DUkob/X9CAFPDow536iUywIDAQAB" var pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxBnMmUNpreT9AJVkcAjfTLXb+2C2O8VYaFeOUPkMT+OzZfmS6DSg5WCH/MdZHbYh/rrOTUK2JfxLq9qzqjV4w7i/DNDnplnsRekrdi2qO5rTuutTLAE29b0hx83/xNbTn8yrMoTCLCjLOvcnuFQkcfCLNnCU7lhFWWhHheDd1NEznzuItfrqI10kzb+aIWUzBgVl6zxxlC9OH690LZd16q/cI+oBW286Xyl8MmKnjND4P9Y1cm2IRHikz6RLPgilL1iy/QXb4eQX+2oCcL8lvrQOCCMfKHpJdC7fwxbHxTiUlqeMVY4bXLwkUUl1wH2+DUkob/X9CAFPDow536iUywIDAQAB"

View File

@ -1,4 +1,7 @@
// 用于生成表格数据的column列数组对象
export function getColumn(params, slot) { export function getColumn(params, slot) {
// 参数一表格数据是否数组且长度不为0
// 参数二类插槽填入DOM结构
return Array.isArray(params) && params.length !== 0 ? Object.keys(params[0]).map((key, index) => { return Array.isArray(params) && params.length !== 0 ? Object.keys(params[0]).map((key, index) => {
return { return {
title: key, title: key,