-
{}}>
-
-
- Delete
-
-
-
- Edit
-
-
-
- Close
-
-
- )}>
-
-
+ handleSearchClick = (value)=>{
+ const [cluster, index] = this.indexEl.state.value;
+ let targetIndex = index;
+ if(value != ""){
+ targetIndex = value;
+ }
+ console.log(targetIndex);
+ this.fetchData({
+ cluster,
+ index: targetIndex,
+ pageSize: 10,
+ pageIndex: 1,
+ filter: this.filterEl.state.value,
+ })
+ }
+
+ renderNew = ()=>{
+ const {indices} = this.props.document;
+ if((indices && indices.length > 1)){
+ return;
+ }
+ return (
+
+ {(indices && indices.length > 1) ? () : ''}
+
+
+ )
+ }
+
+ render(){
+ // const {getFieldDecorator} = this.props.form;
+ //console.log(this.props.document);
+ const options =[
+ {
+ value: 'single-es',
+ label: 'single-es',
+ children: [
+ {
+ value: 'infini-test',
+ label: 'infini-test',
+ }
+ ]}];
+ return (
+
-
-
- );
+ )
}
+
}
-export default Document;
+export default Doucment;
\ No newline at end of file
diff --git a/web/src/pages/DataManagement/Index.js b/web/src/pages/DataManagement/Index.js
new file mode 100644
index 00000000..1e17dbbc
--- /dev/null
+++ b/web/src/pages/DataManagement/Index.js
@@ -0,0 +1,610 @@
+import React, { PureComponent, Fragment } from 'react';
+import { connect } from 'dva';
+import {
+ Row,
+ Col,
+ Card,
+ Form,
+ Input,
+ Button,
+ Modal,
+ message,
+ Divider,
+ Drawer,
+ Tabs,
+ Descriptions,
+ Menu,
+ Dropdown,
+ Icon
+} from 'antd';
+import StandardTable from '@/components/StandardTable';
+import PageHeaderWrapper from '@/components/PageHeaderWrapper';
+
+import styles from '../List/TableList.less';
+import JSONPretty from 'react-json-prettify';
+
+const FormItem = Form.Item;
+const { TextArea } = Input;
+const {TabPane} = Tabs;
+
+class JSONWrapper extends PureComponent {
+ state ={
+ height: 400,
+ }
+ componentDidMount(){
+
+ let getElementTop = (elem)=>{
+ var elemTop=elem.offsetTop;
+ elem=elem.offsetParent;
+
+ while(elem!=null){
+ elemTop+=elem.offsetTop;
+ elem=elem.offsetParent;
+ }
+
+ return elemTop;
+
+ }
+ console.log(getElementTop(this.refs.jsonw));
+ this.setState({height: window.innerHeight - getElementTop(this.refs.jsonw) -50});
+ }
+ render(){
+ return (
+
{console.log(document.getElementById('jsonw').offsetTop)}} style={{overflow:"scroll", height: this.state.height}}> {this.props.children}
+ )
+ }
+}
+
+const CreateForm = Form.create()(props => {
+ const { modalVisible, form, handleAdd, handleModalVisible } = props;
+ const okHandle = () => {
+ form.validateFields((err, fieldsValue) => {
+ if (err) return;
+ form.resetFields();
+ handleAdd(fieldsValue);
+ });
+ };
+ return (
+
handleModalVisible()}
+ >
+
+ {form.getFieldDecorator('index', {
+ rules: [{ required: true, message: '请输入至少五个字符的名称!', min: 5 }],
+ })()}
+
+
+ {form.getFieldDecorator('settings', {
+ rules: [{ required: true }],
+ })()}
+
+
+ );
+});
+
+const UpdateForm = Form.create()(props => {
+ const { updateModalVisible, handleUpdateModalVisible, handleUpdate,values,form } = props;
+
+ const okHandle = () => {
+ form.validateFields((err, fieldsValue) => {
+ if (err) return;
+ form.resetFields();
+ handleUpdate(fieldsValue);
+ });
+ };
+
+ return (
+
handleUpdateModalVisible()}
+ >
+
+ {form.getFieldDecorator('index', {
+ initialValue: values.index,
+ rules: [{ required: true, message: '请输入至少五个字符的名称!', min: 5 }],
+ })()}
+
+
+ {form.getFieldDecorator('settings', {
+ initialValue: values.processors,
+ rules: [{ required: true }],
+ })()}
+
+
+ );
+});
+
+/* eslint react/no-multi-comp:0 */
+@connect(({ pipeline, loading }) => ({
+ pipeline,
+ loading: loading.models.pipeline,
+}))
+@Form.create()
+class Index extends PureComponent {
+ state = {
+ modalVisible: false,
+ updateModalVisible: false,
+ expandForm: false,
+ selectedRows: [],
+ formValues: {},
+ updateFormValues: {},
+ drawerVisible: false,
+ editingIndex:{},
+ };
+ datasource = `[{"health":"green","status":"open","index":"blogs_fixed","uuid":"Q6zngGf9QVaWqpV0lF-0nw","pri":"1","rep":"1","docs.count":"1594","docs.deleted":"594","store.size":"17.9mb","pri.store.size":"8.9mb"},{"health":"red","status":"open","index":"elastic_qa","uuid":"_qkVlQ5LRoOKffV-nFj8Uw","pri":"1","rep":"1","docs.count":null,"docs.deleted":null,"store.size":null,"pri.store.size":null},{"health":"green","status":"open","index":".kibana-event-log-7.9.0-000001","uuid":"fgTtyl62Tc6F1ddJfPwqHA","pri":"1","rep":"1","docs.count":"20","docs.deleted":"0","store.size":"25kb","pri.store.size":"12.5kb"},{"health":"green","status":"open","index":"blogs","uuid":"Mb2n4wnNQSKqSToI_QO0Yg","pri":"1","rep":"1","docs.count":"1594","docs.deleted":"0","store.size":"11mb","pri.store.size":"5.5mb"},{"health":"green","status":"open","index":".kibana-event-log-7.9.0-000002","uuid":"8GpbwnDXR2KJUsw6srLnWw","pri":"1","rep":"1","docs.count":"9","docs.deleted":"0","store.size":"96.9kb","pri.store.size":"48.4kb"},{"health":"green","status":"open","index":".apm-agent-configuration","uuid":"vIaV9k2VS-W48oUOe2xNWA","pri":"1","rep":"1","docs.count":"0","docs.deleted":"0","store.size":"416b","pri.store.size":"208b"},{"health":"green","status":"open","index":"logs_server1","uuid":"u56jv2AyR2KOkruOfxIAnA","pri":"1","rep":"1","docs.count":"5386","docs.deleted":"0","store.size":"5.1mb","pri.store.size":"2.5mb"},{"health":"green","status":"open","index":".kibana_1","uuid":"dBCrfVblRPGVlYAIlP_Duw","pri":"1","rep":"1","docs.count":"3187","docs.deleted":"50","store.size":"24.8mb","pri.store.size":"12.4mb"},{"health":"green","status":"open","index":".tasks","uuid":"3RafayGeSNiqglO2BHof9Q","pri":"1","rep":"1","docs.count":"3","docs.deleted":"0","store.size":"39.9kb","pri.store.size":"19.9kb"},{"health":"green","status":"open","index":"filebeat-7.9.0-elastic_qa","uuid":"tktSYU14S3CrsrJb0ybpSQ","pri":"1","rep":"1","docs.count":"3009880","docs.deleted":"0","store.size":"1.6gb","pri.store.size":"850.1mb"},{"health":"green","status":"open","index":"analysis_test","uuid":"6ZHEAW1ST_qfg7mo4Bva4w","pri":"1","rep":"1","docs.count":"0","docs.deleted":"0","store.size":"416b","pri.store.size":"208b"},{"health":"green","status":"open","index":".apm-custom-link","uuid":"Y4N2TeVERrGacEGwY-NPAQ","pri":"1","rep":"1","docs.count":"0","docs.deleted":"0","store.size":"416b","pri.store.size":"208b"},{"health":"green","status":"open","index":"kibana_sample_data_ecommerce","uuid":"4FIWJKhGSr6bE72R0xEQyA","pri":"1","rep":"1","docs.count":"4675","docs.deleted":"0","store.size":"9.2mb","pri.store.size":"4.6mb"},{"health":"green","status":"open","index":".kibana_task_manager_1","uuid":"9afyndU_Q26oqOiEIoqRJw","pri":"1","rep":"1","docs.count":"6","docs.deleted":"2","store.size":"378.8kb","pri.store.size":"12.5kb"},{"health":"green","status":"open","index":".async-search","uuid":"2VbJgnN7SsqC-DWN64yXUQ","pri":"1","rep":"1","docs.count":"0","docs.deleted":"0","store.size":"3.9kb","pri.store.size":"3.7kb"}]`;
+
+ columns = [
+ {
+ title: '索引名称',
+ dataIndex: 'index',
+ render: (text, record) => (
+
{
+ this.setState({
+ editingIndex: record,
+ drawerVisible: true,
+ });
+ }}>{text}
+ )
+ },
+ {
+ title: '文档数',
+ dataIndex: 'docs.count',
+ },
+ {
+ title: '主分片数',
+ dataIndex: 'pri'
+ },
+ {
+ title: '从分片数',
+ dataIndex: 'rep'
+ },
+ {
+ title: '存储大小',
+ dataIndex: 'store.size'
+ },
+ {
+ title: '操作',
+ render: (text, record) => (
+
+ {/* this.handleUpdateModalVisible(true, record)}>设置
+ */}
+ {
+ this.state.selectedRows.push(record);
+ this.handleDeleteClick();
+ }}>删除
+
+ {
+ this.state.selectedRows.push(record);
+ this.handleDeleteClick();
+ }}>文档管理
+
+ ),
+ },
+ ];
+
+ componentDidMount() {
+ const { dispatch } = this.props;
+ // dispatch({
+ // type: 'pipeline/fetch',
+ // });
+ }
+
+ handleStandardTableChange = (pagination, filtersArg, sorter) => {
+ const { dispatch } = this.props;
+ const { formValues } = this.state;
+
+ const filters = Object.keys(filtersArg).reduce((obj, key) => {
+ const newObj = { ...obj };
+ newObj[key] = getValue(filtersArg[key]);
+ return newObj;
+ }, {});
+
+ const params = {
+ currentPage: pagination.current,
+ pageSize: pagination.pageSize,
+ ...formValues,
+ ...filters,
+ };
+ if (sorter.field) {
+ params.sorter = `${sorter.field}_${sorter.order}`;
+ }
+
+ dispatch({
+ type: 'pipeline/fetch',
+ payload: params,
+ });
+ };
+
+ handleFormReset = () => {
+ const { form, dispatch } = this.props;
+ form.resetFields();
+ this.setState({
+ formValues: {},
+ });
+ dispatch({
+ type: 'pipeline/fetch',
+ payload: {},
+ });
+ };
+
+ handleDeleteClick = e => {
+ const { dispatch } = this.props;
+ const { selectedRows } = this.state;
+
+ if (!selectedRows) return;
+ dispatch({
+ type: 'pipeline/delete',
+ payload: {
+ key: selectedRows.map(row => row.name),
+ },
+ callback: () => {
+ this.setState({
+ selectedRows: [],
+ });
+ },
+ });
+ };
+
+ handleSelectRows = rows => {
+ this.setState({
+ selectedRows: rows,
+ });
+ };
+
+ handleSearch = e => {
+ e.preventDefault();
+
+ const { dispatch, form } = this.props;
+
+ form.validateFields((err, fieldsValue) => {
+ if (err) return;
+
+ const values = {
+ ...fieldsValue,
+ updatedAt: fieldsValue.updatedAt && fieldsValue.updatedAt.valueOf(),
+ };
+
+ this.setState({
+ formValues: values,
+ });
+
+ dispatch({
+ type: 'rule/fetch',
+ payload: values,
+ });
+ });
+ };
+
+ handleModalVisible = flag => {
+ this.setState({
+ modalVisible: !!flag,
+ });
+ };
+
+ handleUpdateModalVisible = (flag, record) => {
+ this.setState({
+ updateModalVisible: !!flag,
+ updateFormValues: record || {},
+ });
+ };
+
+ handleAdd = fields => {
+ const { dispatch } = this.props;
+ dispatch({
+ type: 'pipeline/add',
+ payload: {
+ name: fields.name,
+ desc: fields.desc,
+ processors: fields.processors,
+ },
+ });
+
+ message.success('添加成功');
+ this.handleModalVisible();
+ };
+
+ handleUpdate = fields => {
+ const { dispatch } = this.props;
+ dispatch({
+ type: 'pipeline/update',
+ payload: {
+ name: fields.name,
+ desc: fields.desc,
+ processors: fields.processors,
+ },
+ });
+
+ message.success('修改成功');
+ this.handleUpdateModalVisible();
+ };
+
+ renderSimpleForm() {
+ const {
+ form: { getFieldDecorator },
+ } = this.props;
+ return (
+
+ );
+ }
+
+ renderForm() {
+ return this.renderSimpleForm();
+ }
+
+ render() {
+ const data = {
+ list: JSON.parse(this.datasource),
+ pagination: {
+ pageSize: 5,
+ },
+ };
+ const { selectedRows, modalVisible, updateModalVisible, updateFormValues,editingIndex, drawerVisible } = this.state;
+ const parentMethods = {
+ handleAdd: this.handleAdd,
+ handleModalVisible: this.handleModalVisible,
+ };
+ const updateMethods = {
+ handleUpdateModalVisible: this.handleUpdateModalVisible,
+ handleUpdate: this.handleUpdate,
+ };
+
+ return (
+
+
+
+
{this.renderForm()}
+
+
+ {selectedRows.length > 0 && (
+
+
+
+ )}
+
+
+
+
+
+ {updateFormValues && Object.keys(updateFormValues).length ? (
+
+ ) : null}
+ {
+ this.setState({
+ drawerVisible: false,
+ });
+ }}
+ width={640}
+ >
+ {}}>
+
+
+ green
+ open
+ 1
+ 0
+ 5
+ 0
+ 115.3kb
+
+
+
+
+
+
+
+
+
+
+ Content of Tab Pane 3
+
+
+ Content of Tab Pane 3
+
+
+
+ {}}>
+
+
+ Delete
+
+
+
+ Edit
+
+
+
+ Close
+
+
+ )}>
+
+
+
+
+
+ );
+ }
+}
+
+export default Index;
diff --git a/web/src/pages/DataManagement/Query.js b/web/src/pages/DataManagement/Query.js
deleted file mode 100644
index 43c66d63..00000000
--- a/web/src/pages/DataManagement/Query.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import React, { Component } from 'react';
-import { connect } from 'dva';
-import PageHeaderWrapper from '@/components/PageHeaderWrapper';
-import { Col, Form, Row,Select, Input, Card,Icon,List, Descriptions } from 'antd';
-
-const {Option} = Select;
-
-@Form.create()
-class Query extends React.Component {
- state={
- bodyDisplay: 'none',
- data: [{
- index: 'blogs-001',
- id: 'dpOsA3YBCjFOm54VZoNF',
- source: `{
- "title" : "elastic search test title",
- "content": "如默认结构不满足需求,可以自定义该模板,但是自定义模板时必须包含各个 dom 节点的 class,样式可以自定义。",
- "created_at" : "2020-11-23"
- }`
- },
- {
- index: 'blogs-002',
- id: "dpOsA3YBCjFOm54VZoNB",
- source: `{
- "title" : "elastic search test title",
- "created_at" : "2020-11-23",
- "content": "如默认结构不满足需求,可以自定义该模板,但是自定义模板时必须包含各个 dom 节点的 class,样式可以自定义。"
- }`
- },
- {
- index: 'blogs-002',
- id: "dpOsA3YBCjFOm54VZoNC",
- source: `{
- "title" : "elastic search test title",
- "created_at" : "2020-11-23",
- "content":"如默认结构不满足需求,可以自定义该模板,但是自定义模板时必须包含各个 dom 节点的 class,样式可以自定义。"
- }`
- },
- {
- index: 'blogs-001',
- id:"dpOsA3YBCjFOm54VZoNG",
- source: `{
- "title" : "elastic search test title",
- "content":"如默认结构不满足需求,可以自定义该模板,但是自定义模板时必须包含各个 dom 节点的 class,样式可以自定义。",
- "created_at" : "2020-11-23"
- }`
- }, {
- index: 'blogs-001',
- id:"dpOsA3YBCjFOm54VZoNG",
- source: `{
- "title" : "elastic search test title",
- "content":"如默认结构不满足需求,可以自定义该模板,但是自定义模板时必须包含各个 dom 节点的 class,样式可以自定义。",
- "created_at" : "2020-11-23"
- }`
- }]
- }
-
- render(){
- // const {getFieldDecorator} = this.props.form;
- return (
-
- )
- }
-
-}
-
-export default Query;
\ No newline at end of file
diff --git a/web/src/pages/DataManagement/models/document.js b/web/src/pages/DataManagement/models/document.js
new file mode 100644
index 00000000..f71ce904
--- /dev/null
+++ b/web/src/pages/DataManagement/models/document.js
@@ -0,0 +1,208 @@
+import {getDocList, saveDoc, deleteDoc, addDoc} from '@/services/doc';
+import { message } from 'antd';
+
+function encodeObjectField(doc){
+ //let rawData = {};
+ for(let key of Object.keys(doc)){
+ if(typeof doc[key] == 'object'){
+ // let docId = doc['id'];
+ // !rawData[docId] && (rawData[docId] = {});
+ // rawData[docId][key] = doc[key];
+ doc[key] = JSON.stringify(doc[key]);
+ }
+ }
+ return doc;
+}
+
+function decodeObjectField(doc){
+ for(let key of Object.keys(doc)){
+ if(['[', '{'].includes(doc[key][0])){
+ try{
+ doc[key] = JSON.parse(doc[key])
+ }catch(e){
+ message.warn(key +': json format error');
+ return false;
+ }
+ }
+ }
+ return doc;
+}
+
+export default {
+ namespace: "document",
+ state: {
+ index: '',
+ editingKey: '',
+ isLoading: false,
+ },
+ effects: {
+ *fetchDocList({payload}, {call, put}){
+ yield put({
+ type: 'saveData',
+ payload: {
+ isLoading: true,
+ }
+ });
+ let res = yield call(getDocList, payload);
+ if(res.errno != "0"){
+ message.warn("加载数据失败")
+ return
+ }
+ let indices = [];
+ if(res.payload.data && res.payload.data.length > 0){
+ for(let doc of res.payload.data){
+ if(!indices.includes(doc._index)){
+ indices.push(doc._index);
+ }
+ encodeObjectField(doc);
+ }
+ }
+ yield put({
+ type: 'saveData',
+ payload: {
+ pageIndex: payload.pageIndex,
+ pageSize: payload.pageSize,
+ isLoading: false,
+ index: payload.index,
+ indices,
+ cluster: payload.cluster || '',
+ filter: payload.filter || '',
+ ...res.payload,
+ }
+ })
+ },
+ *saveDocItem({payload}, {call, put, select}){
+ yield put({
+ type: 'saveData',
+ payload: {
+ isLoading: true,
+ }
+ });
+ let doc = payload.data;
+ //let {rawData} = yield select(state => state.document);
+ if(decodeObjectField(doc) === false){
+ return;
+ }
+ let res = yield call(saveDoc, payload);
+ if(res.errno != "0"){
+ message.warn("保存数据失败")
+ return
+ }
+ encodeObjectField(doc);
+ yield put({
+ type: '_saveDocItem',
+ payload: {
+ docItem: payload.data,
+ extra: {
+ editingKey: '',
+ isLoading: false,
+ _index: ''
+ }
+ }
+ })
+ },
+ *deleteDocItem({payload}, {call, put}){
+ yield put({
+ type: 'saveData',
+ payload: {
+ isLoading: true,
+ }
+ });
+ let res = yield call(deleteDoc, payload);
+ if(res.errno != "0"){
+ message.warn("删除数据失败")
+ return
+ }
+ yield put({
+ type: '_deleteDocItem',
+ payload: {
+ docItem: payload.data,
+ extra: {
+ isLoading: false,
+ }
+ }
+ })
+ },
+ *addDocItem({payload},{call, put}){
+ yield put({
+ type: 'saveData',
+ payload: {
+ isLoading: true,
+ }
+ });
+ if(decodeObjectField(payload.data) === false){
+ return;
+ }
+ let res = yield call(addDoc, payload);
+ if(res.errno != "0"){
+ message.warn("添加文档失败")
+ return
+ }
+ encodeObjectField(res.payload);
+ yield put({
+ type: '_addNew',
+ payload: {
+ docItem: res.payload,
+ extra: {
+ isLoading: false,
+ }
+ }
+ })
+ }
+
+ },
+ reducers: {
+ saveData(state, {payload}){
+ return {
+ ...state,
+ ...payload,
+ }
+ },
+ _saveDocItem(state, {payload}){
+ let idx = state.data.findIndex((item) => {
+ return item.id == payload.docItem.id;
+ });
+ idx > -1 && (state.data[idx] = {
+ ...state.data[idx],
+ ...payload.docItem,
+ })
+
+ return {
+ ...state,
+ ...payload.extra,
+ };
+ },
+ _deleteDocItem(state, {payload}){
+ let idx = state.data.findIndex((item) => {
+ return item.id == payload.docItem.id;
+ });
+ state.data.splice(idx, 1);
+ return {
+ ...state,
+ ...payload.extra
+ };
+ },
+ _addNew(state, {payload}){
+ if(payload.extra && payload.extra.isAddNew){
+ state.data.unshift(payload.docItem)
+ return {
+ ...state,
+ ...payload.extra,
+ }
+ }else{
+ state.data[0] = payload.docItem;
+ return {
+ ...state,
+ ...payload.extra
+ }
+ }
+ },
+ cancelNew(state,{payload}){
+ state.data.shift()
+ return {
+ ...state,
+ isAddNew: false,
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/web/src/pages/SearchManage/dict/Pro.js b/web/src/pages/SearchManage/dict/Pro.js
index 5487e314..48ab2d34 100644
--- a/web/src/pages/SearchManage/dict/Pro.js
+++ b/web/src/pages/SearchManage/dict/Pro.js
@@ -15,7 +15,7 @@ const UpdateForm = Form.create()(props => {
form.validateFields((err, fieldsValue) => {
if (err) return;
form.resetFields();
- let upVals = Object.assign(values, fieldsValue);
+ let upVals = Object.assign(_.cloneDeep(values), fieldsValue);
handleUpdate(upVals);
});
};
@@ -69,33 +69,22 @@ class Pro extends React.Component {
super(props);
this.handleUpdate = this.handleUpdate.bind(this);
}
- state = {
- updateFormValues: null,
- currentFormOp: null,
- data: [],
- search: {
- size: 6,
- name: "",
- tags: "",
- pageIndex: 1,
- }
- }
componentDidMount(){
- this.fetchData();
+ const {size} = this.props.dict.search;
+ this.fetchData({
+ from: 0,
+ size: size,
+ });
}
handleReset = ()=>{
const {form} = this.props;
form.resetFields();
- this.setState({
- search: {
- size: 6,
- name: "",
- tags: "",
- pageIndex: 1,
- }
- },()=>{
- this.fetchData();
+ this.fetchData({
+ from: 0,
+ size: this.props.dict.search.size,
+ name: '',
+ tags: ''
});
}
@@ -104,14 +93,12 @@ class Pro extends React.Component {
let me = this;
form.validateFields((err, fieldsValue) => {
if (err) return;
- me.setState({search:{
- ...me.state.search,
- pageIndex: 1,
+ me.fetchData({
+ form: 0,
+ size: me.props.dict.search.size,
name: fieldsValue.name,
tags: fieldsValue.tags.join(',')
- }},()=>{
- me.fetchData();
- })
+ })
})
}
@@ -161,18 +148,24 @@ class Pro extends React.Component {
);
}
handleNewClick = () => {
- this.setState({
- currentFormOp: 'NEW',
- updateFormValues: {},
- formTitle: '添加词典'
+ const {dispatch} = this.props;
+ dispatch({
+ type: 'dict/saveData',
+ payload: {
+ currentFormOp: 'NEW',
+ updateFormValues: {},
+ formTitle: '添加词典'
+ }
})
}
handleDelete = (item) =>{
- const {dispatch} = this.props;
+ const {dispatch, dict} = this.props;
+ const search = dict.search;
+ const me = this;
Modal.confirm({
- title: '删除Pipeline',
- content: '确定删除该Pipeline吗?',
+ title: '删除词典',
+ content: '确定删除该词典吗?',
okText: '确认',
cancelText: '取消',
onOk: () => {
@@ -188,15 +181,19 @@ class Pro extends React.Component {
}
handleModifyClick = (item)=>{
- this.setState({
- updateFormValues: item,
- formTitle: '修改词典',
- currentFormOp: 'UPDATE',
- })
+ const {dispatch} = this.props;
+ dispatch({
+ type: 'dict/saveData',
+ payload: {
+ updateFormValues: item,
+ formTitle: '修改词典',
+ currentFormOp: 'UPDATE',
+ }
+ });
}
handleUpdate(values){
- let {currentFormOp, data} = this.state;
+ let {currentFormOp} = this.props.dict;
const {dispatch} = this.props;
let me = this;
switch(currentFormOp){
@@ -204,69 +201,51 @@ class Pro extends React.Component {
dispatch({
type: 'dict/addDictItem',
payload: values,
- callback: ()=>{
- me.setState({
- updateFormValues: null,
- currentFormOp: null
- });
- }
});
break;
case "UPDATE":
dispatch({
type: 'dict/updateDictItem',
payload: values,
- callback: ()=>{
- me.setState({
- updateFormValues: null,
- currentFormOp: null
- });
- }
});
}
}
- fetchData = ()=>{
+ fetchData = (params)=>{
const {dispatch} = this.props;
- let {size, pageIndex} = this.state.search;
- let me = this;
dispatch({
type: 'dict/fetchDictList',
- payload: {
- from: (pageIndex - 1) * size,
- ...this.state.search
- },
- callback: ()=>{
- }
+ payload: params
});
}
handlePageChange = (p)=>{
- this.setState({
- search: {
- ...this.state.search,
- pageIndex: p,
- }
- },()=>{
- this.fetchData();
- })
+ let search = this.props.dict.search;
+
+ this.fetchData({
+ ...search,
+ from: (p-1) * search.size,
+ pageIndex: p,
+ });
}
render(){
- let data = this.props.dict ? this.props.dict.dictList : [];
- let total = this.props.dict ? this.props.dict.total: 0;
- let updateFormValues = this.state.updateFormValues;
- let size = this.state.search.size;
+ //console.log('render');
+ let {dictList, search, updateFormValues, total, formTitle} = this.props.dict;
+ let {pageIndex, size} = search;
+ const {dispatch} = this.props;
const updateMethods = {
handleUpdate: this.handleUpdate,
handleUpdateModalVisible: ()=>{
- this.setState({
- updateFormValues: null,
- currentFormOp: null,
- })
+ dispatch({
+ type:'dict/saveData',
+ payload: {
+ updateFormValues: null,
+ currentFormOp: null,
+ }
+ });
}
};
- console.log('render');
return (
@@ -278,11 +257,11 @@ class Pro extends React.Component {
bordered={false}>
{updateFormValues ? (
diff --git a/web/src/pages/SearchManage/models/dict.js b/web/src/pages/SearchManage/models/dict.js
index 1df7e223..638cbd1c 100644
--- a/web/src/pages/SearchManage/models/dict.js
+++ b/web/src/pages/SearchManage/models/dict.js
@@ -50,9 +50,18 @@ export default {
namespace: 'dict',
state: {
+ updateFormValues: null,
+ currentFormOp: null,
+ formTitle: '',
+ search: {
+ size: 6,
+ name: "",
+ tags: "",
+ pageIndex: 1,
+ }
},
effects: {
- *fetchDictList({payload, callback}, {call, put}){
+ *fetchDictList({payload}, {call, put}){
const resp = yield call(getDictList, payload);
if(resp.errno != "0" || !resp.data.Result){
return
@@ -61,21 +70,26 @@ export default {
item.content = utf8.decode(atob(item.content))
return item;
})
+ let search = {name:'', tags: ''};
+ payload.pageIndex = payload.from / payload.size + 1;
+ search = Object.assign(search, payload);
+
yield put({
type: 'saveData',
payload: {
dictList: resp.data.Result,
total: resp.data.Total,
- ...payload,
+ search: search,
},
});
- if(callback && typeof callback == 'function'){
- callback(resp);
- }
//message.loading('数据加载完成', 'initdata');
},
- *addDictItem({payload, callback}, {call, put}){
- const rel = yield call(addDict, payload);
+ *addDictItem({payload}, {call, put}){
+ let upVals = {
+ ...payload,
+ }
+ upVals.content = btoa(utf8.encode(upVals.content));
+ const rel = yield call(addDict, upVals);
if(rel.errno != "0"){
message.warn('添加失败:'+ rel.errmsg)
return
@@ -83,25 +97,34 @@ export default {
rel.payload.content = utf8.decode(atob(rel.payload.content));
yield put({
type: 'addDict',
- payload: rel.payload,
+ payload: {
+ dictItem: rel.payload,
+ extra: {
+ updateFormValues: null,
+ currentFormOp: null
+ }
+ }
})
- if(callback && typeof callback == 'function'){
- callback(rel);
- }
},
- *updateDictItem({payload, callback}, {call, put}){
+ *updateDictItem({payload}, {call, put}){
+ let rawContent = payload.content;
+ payload.content = btoa(utf8.encode(payload.content));
const rel = yield call(updateDict, payload);
if(rel.errno != "0"){
message.warn('修改:'+ rel.errmsg)
return
}
+ payload.content = rawContent;
yield put({
type: 'updateDict',
- payload: payload,
+ payload: {
+ dictItem: payload,
+ extra:{
+ updateFormValues: null,
+ currentFormOp: null
+ }
+ }
})
- if(callback && typeof callback == 'function'){
- callback(rel);
- }
},
*deleteDictItem({payload}, {call, put, select}){
let rel = yield call(deleteDict, payload);
@@ -112,14 +135,20 @@ export default {
message.warn('删除失败:'+ rel.errmsg)
return
}
- const state = yield select(state => state.dict)
+
yield put({
- type: 'fetchDictList',
+ type:'deleteDict',
payload: {
- from: state.from,
- size: state.size,
+ dictItem: payload,
}
- })
+ });
+ //const search = yield select(state => state.dict.search)
+
+ // yield put({
+ // type: 'fetchDictList',
+ // payload: search,
+ // })
+ //yield take('fetchDictList/@@end')
}
},
reducers: {
@@ -131,17 +160,35 @@ export default {
},
addDict(state, {payload}){
let dictList = state.dictList || [];
- dictList.unshift(payload);
+ dictList.unshift(payload.dictItem);
state.dictList = dictList;
- return state;
+ return {
+ ...state,
+ ...payload.extra,
+ total: state.total + 1,
+ };
},
updateDict(state, {payload}){
let cdata = state.dictList;
let idx = cdata.findIndex((item)=>{
- return item.id == payload.id;
+ return item.id == payload.dictItem.id;
})
- idx > -1 && (cdata[idx] = values);
- return state;
+ idx > -1 && (cdata[idx] = payload.dictItem);
+ return {
+ ...state,
+ ...payload.extra,
+ }
+ },
+ deleteDict(state, {payload}){
+ let cdata = state.dictList;
+ let idx = cdata.findIndex((item)=>{
+ return item.id == payload.dictItem.id;
+ })
+ idx > -1 && (state.dictList.splice(idx, 1));
+ return {
+ ...state,
+ total: state.total - 1,
+ }
}
},
};
diff --git a/web/src/services/doc.js b/web/src/services/doc.js
new file mode 100644
index 00000000..fcf80f37
--- /dev/null
+++ b/web/src/services/doc.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request';
+
+export async function getDocList(params) {
+ return request(`/api/doc/${params.index}`, {
+ method: 'POST',
+ body: {
+ action: 'SEARCH',
+ ...params,
+ },
+ });
+}
+
+export async function saveDoc(params) {
+ return request(`/api/doc/${params.index}`, {
+ method: 'POST',
+ body: {
+ payload: params.data,
+ index: params.index,
+ action: 'SAVE',
+ },
+ });
+}
+
+export async function deleteDoc(params) {
+ return request(`/api/doc/${params.index}`, {
+ method: 'POST',
+ body: {
+ index: params.index,
+ action: 'DELETE',
+ payload: params.data,
+ },
+ });
+}
+
+export async function addDoc(params) {
+ return request(`/api/doc/${params.index}`, {
+ method: 'POST',
+ body: {
+ payload: params.data,
+ index: params.index,
+ action: 'ADD',
+ },
+ });
+}
\ No newline at end of file