diff --git a/admin-web/config/router.config.js b/admin-web/config/router.config.js
index 840fe8334..429db6aa5 100644
--- a/admin-web/config/router.config.js
+++ b/admin-web/config/router.config.js
@@ -21,6 +21,19 @@ export default [
Routes: ['src/pages/Authorized'],
authority: ['admin', 'user'],
routes: [
+ // admin
+ {
+ path: '/admin',
+ name: 'admin',
+ icon: 'user',
+ routes: [
+ {
+ path: '/admin/admin-list',
+ name: 'admin-list',
+ component: './Admin/AdminList',
+ },
+ ],
+ },
// dashboard
{ path: '/', redirect: '/dashboard/analysis' },
{
diff --git a/admin-web/src/locales/zh-CN/menu.js b/admin-web/src/locales/zh-CN/menu.js
index 5657c6e05..1d4cbc3cc 100644
--- a/admin-web/src/locales/zh-CN/menu.js
+++ b/admin-web/src/locales/zh-CN/menu.js
@@ -1,4 +1,7 @@
export default {
+ // admin
+ 'menu.admin': 'Admin管理',
+ 'menu.admin.admin-list': '管理员列表',
'menu.home': '首页',
'menu.login': '登录',
'menu.register': '注册',
diff --git a/admin-web/src/pages/Admin/AdminList.jsx b/admin-web/src/pages/Admin/AdminList.jsx
new file mode 100644
index 000000000..e984b8361
--- /dev/null
+++ b/admin-web/src/pages/Admin/AdminList.jsx
@@ -0,0 +1,307 @@
+import React, { PureComponent } from 'react';
+import { findDOMNode } from 'react-dom';
+import moment from 'moment';
+import { connect } from 'dva';
+import {
+ List,
+ Card,
+ Input,
+ Progress,
+ Button,
+ Icon,
+ Dropdown,
+ Menu,
+ Avatar,
+ Modal,
+ Form,
+ DatePicker,
+ Select,
+} from 'antd';
+
+import PageHeaderWrapper from '@/components/PageHeaderWrapper';
+import Result from '@/components/Result';
+
+import styles from './AdminList.less';
+
+const FormItem = Form.Item;
+const SelectOption = Select.Option;
+const { Search, TextArea } = Input;
+
+@connect(({ list, loading }) => ({
+ list,
+ loading: loading.models.list,
+}))
+@Form.create()
+class AdminList extends PureComponent {
+ state = { visible: false, done: false };
+
+ formLayout = {
+ labelCol: { span: 7 },
+ wrapperCol: { span: 13 },
+ };
+
+ componentDidMount() {
+ const { dispatch } = this.props;
+ dispatch({
+ type: 'list/fetch',
+ payload: {
+ count: 5,
+ },
+ });
+ }
+
+ showModal = () => {
+ this.setState({
+ visible: true,
+ current: undefined,
+ });
+ };
+
+ showEditModal = item => {
+ this.setState({
+ visible: true,
+ current: item,
+ });
+ };
+
+ handleDone = () => {
+ setTimeout(() => this.addBtn.blur(), 0);
+ this.setState({
+ done: false,
+ visible: false,
+ });
+ };
+
+ handleCancel = () => {
+ setTimeout(() => this.addBtn.blur(), 0);
+ this.setState({
+ visible: false,
+ });
+ };
+
+ handleSubmit = e => {
+ e.preventDefault();
+ const { dispatch, form } = this.props;
+ const { current } = this.state;
+ const id = current ? current.id : '';
+
+ setTimeout(() => this.addBtn.blur(), 0);
+ form.validateFields((err, fieldsValue) => {
+ if (err) return;
+ this.setState({
+ done: true,
+ });
+ dispatch({
+ type: 'list/submit',
+ payload: { id, ...fieldsValue },
+ });
+ });
+ };
+
+ deleteItem = id => {
+ const { dispatch } = this.props;
+ dispatch({
+ type: 'list/submit',
+ payload: { id },
+ });
+ };
+
+ render() {
+ const {
+ list: { list },
+ loading,
+ } = this.props;
+ const {
+ form: { getFieldDecorator },
+ } = this.props;
+ const { visible, done, current = {} } = this.state;
+
+ const editAndDelete = (key, currentItem) => {
+ if (key === 'edit') this.showEditModal(currentItem);
+ else if (key === 'delete') {
+ Modal.confirm({
+ title: '删除任务',
+ content: '确定删除该任务吗?',
+ okText: '确认',
+ cancelText: '取消',
+ onOk: () => this.deleteItem(currentItem.id),
+ });
+ }
+ };
+
+ const modalFooter = done
+ ? { footer: null, onCancel: this.handleDone }
+ : { okText: '保存', onOk: this.handleSubmit, onCancel: this.handleCancel };
+
+ const extraContent = (
+
+
+ ({})} />
+
+ );
+
+ const paginationProps = {
+ showSizeChanger: true,
+ showQuickJumper: true,
+ pageSize: 5,
+ total: 50,
+ };
+
+ const ListContent = ({ data: { owner, createdAt, percent, status } }) => (
+
+
+
+
开始时间
+
{moment(createdAt).format('YYYY-MM-DD HH:mm')}
+
+
+
+ );
+
+ const MoreBtn = props => (
+ editAndDelete(key, props.current)}>
+ 编辑
+ 删除
+
+ }
+ >
+
+ 更多
+
+
+ );
+
+ const getModalContent = () => {
+ if (done) {
+ return (
+
+ 知道了
+
+ }
+ className={styles.formResult}
+ />
+ );
+ }
+ return (
+
+ );
+ };
+ return (
+
+
+
+ (
+ {
+ e.preventDefault();
+ this.showEditModal(item);
+ }}
+ >
+ 编辑
+ ,
+ ,
+ ]}
+ >
+ }
+ title={{item.title}}
+ description={item.subDescription}
+ />
+
+
+ )}
+ />
+
+
+
+ {getModalContent()}
+
+
+ );
+ }
+}
+
+export default AdminList;
diff --git a/admin-web/src/pages/Admin/AdminList.less b/admin-web/src/pages/Admin/AdminList.less
new file mode 100644
index 000000000..fd226b0f4
--- /dev/null
+++ b/admin-web/src/pages/Admin/AdminList.less
@@ -0,0 +1,195 @@
+@import '~antd/lib/style/themes/default.less';
+@import '~@/utils/utils.less';
+
+.standardList {
+ :global {
+ .ant-card-head {
+ border-bottom: none;
+ }
+ .ant-card-head-title {
+ padding: 24px 0;
+ line-height: 32px;
+ }
+ .ant-card-extra {
+ padding: 24px 0;
+ }
+ .ant-list-pagination {
+ margin-top: 24px;
+ text-align: right;
+ }
+ .ant-avatar-lg {
+ width: 48px;
+ height: 48px;
+ line-height: 48px;
+ }
+ }
+ .headerInfo {
+ position: relative;
+ text-align: center;
+ & > span {
+ display: inline-block;
+ margin-bottom: 4px;
+ color: @text-color-secondary;
+ font-size: @font-size-base;
+ line-height: 22px;
+ }
+ & > p {
+ margin: 0;
+ color: @heading-color;
+ font-size: 24px;
+ line-height: 32px;
+ }
+ & > em {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 1px;
+ height: 56px;
+ background-color: @border-color-split;
+ }
+ }
+ .listContent {
+ font-size: 0;
+ .listContentItem {
+ display: inline-block;
+ margin-left: 40px;
+ color: @text-color-secondary;
+ font-size: @font-size-base;
+ vertical-align: middle;
+ > span {
+ line-height: 20px;
+ }
+ > p {
+ margin-top: 4px;
+ margin-bottom: 0;
+ line-height: 22px;
+ }
+ }
+ }
+ .extraContentSearch {
+ width: 272px;
+ margin-left: 16px;
+ }
+}
+
+@media screen and (max-width: @screen-xs) {
+ .standardList {
+ :global {
+ .ant-list-item-content {
+ display: block;
+ flex: none;
+ width: 100%;
+ }
+ .ant-list-item-action {
+ margin-left: 0;
+ }
+ }
+ .listContent {
+ margin-left: 0;
+ & > div {
+ margin-left: 0;
+ }
+ }
+ .listCard {
+ :global {
+ .ant-card-head-title {
+ overflow: visible;
+ }
+ }
+ }
+ }
+}
+
+@media screen and (max-width: @screen-sm) {
+ .standardList {
+ .extraContentSearch {
+ width: 100%;
+ margin-left: 0;
+ }
+ .headerInfo {
+ margin-bottom: 16px;
+ & > em {
+ display: none;
+ }
+ }
+ }
+}
+
+@media screen and (max-width: @screen-md) {
+ .standardList {
+ .listContent {
+ & > div {
+ display: block;
+ }
+ & > div:last-child {
+ top: 0;
+ width: 100%;
+ }
+ }
+ }
+ .listCard {
+ :global {
+ .ant-radio-group {
+ display: block;
+ margin-bottom: 8px;
+ }
+ }
+ }
+}
+
+@media screen and (max-width: @screen-lg) and (min-width: @screen-md) {
+ .standardList {
+ .listContent {
+ & > div {
+ display: block;
+ }
+ & > div:last-child {
+ top: 0;
+ width: 100%;
+ }
+ }
+ }
+}
+
+@media screen and (max-width: @screen-xl) {
+ .standardList {
+ .listContent {
+ & > div {
+ margin-left: 24px;
+ }
+ & > div:last-child {
+ top: 0;
+ }
+ }
+ }
+}
+
+@media screen and (max-width: 1400px) {
+ .standardList {
+ .listContent {
+ text-align: right;
+ & > div:last-child {
+ top: 0;
+ }
+ }
+ }
+}
+
+.standardListForm {
+ :global {
+ .ant-form-item {
+ margin-bottom: 12px;
+ &:last-child {
+ margin-bottom: 32px;
+ padding-top: 4px;
+ }
+ }
+ }
+}
+
+.formResult {
+ width: 100%;
+ [class^='title'] {
+ margin-bottom: 8px;
+ }
+}