tianyunperfect 5 年之前
父節點
當前提交
b4d10a445f

+ 1 - 1
config/defaultSettings.ts

@@ -55,7 +55,7 @@ export default {
   menu: {
     locale: true,
   },
-  title: '意图分类服务',
+  title: '念念不忘',
   pwa: false,
   iconfontUrl: '',
 } as DefaultSettings;

+ 2 - 2
src/layouts/UserLayout.tsx

@@ -50,10 +50,10 @@ const UserLayout: React.FC<UserLayoutProps> = (props) => {
             <div className={styles.header}>
               <Link to="/">
                 <img alt="logo" className={styles.logo} src={logo} />
-                <span className={styles.title}>Ant Design</span>
+                <span className={styles.title}>念念不忘</span>
               </Link>
             </div>
-            <div className={styles.desc}>Ant Design 是西湖区最具影响力的 Web 设计规范</div>
+            <div className={styles.desc}>念念不忘,必有回响。</div>
           </div>
           {children}
         </div>

+ 1 - 0
src/models/login.ts

@@ -64,6 +64,7 @@ const Model: LoginModelType = {
 
     logout() {
       localStorage.removeItem("success");
+      localStorage.removeItem("authorization");
       const {redirect} = getPageQuery();
       // Note: There may be security issues, please note
       if (window.location.pathname !== '/user/login' && !redirect) {

+ 2 - 2
src/pages/Memory/components/QueryForm.tsx

@@ -10,7 +10,7 @@ export interface FormValueType {
   queryStr?: string;
 }
 
-export interface FormProps {
+export interface Props {
   onCancel: (flag?: boolean) => void;
   // onSubmit: (values: FormValueType) => void;
   modalVisible: boolean;
@@ -24,7 +24,7 @@ const formLayout = {
   wrapperCol: { span: 13 },
 };
 
-const QueryForm: React.FC<FormProps> = (props) => {
+const QueryForm: React.FC<Props> = (props) => {
   const [resultStr, setResultStr] = useState('');
 
   const [form] = Form.useForm();

+ 45 - 0
src/pages/Memory/components/Quill.tsx

@@ -0,0 +1,45 @@
+import React from 'react';
+import ReactQuill from "react-quill";
+import 'react-quill/dist/quill.snow.css';
+
+export interface Props {
+  onChange: (value?:any) => void;
+  value: any;
+  readonly: boolean;
+}
+
+const modules = {
+  toolbar: [
+    [{'header': [1, 2, false]},'bold', 'italic', 'blockquote', 'code-block', 'link'],
+    [{'list': 'ordered'}, {'list': 'bullet'}, {'indent': '-1'}, {'indent': '+1'}],
+  ],
+};
+
+const formats = [
+  'header',
+  'bold', 'italic', 'underline', 'strike', 'blockquote', 'code-block',
+  'list', 'bullet', 'indent',
+  'link',
+];
+
+const Quill: React.FC<Props> = (props) => {
+  const {
+    value,
+    onChange,
+    readonly,
+  } = props;
+
+
+  return (
+    <ReactQuill
+      readOnly={readonly}
+      theme="snow"
+      modules={modules}
+      formats={formats}
+      value={value}
+      onChange={onChange}
+    />
+  );
+};
+
+export default Quill;

+ 86 - 58
src/pages/Memory/index.tsx

@@ -1,10 +1,9 @@
-import { Button, message } from 'antd';
-import React, { useEffect } from 'react';
-import { PageHeaderWrapper } from '@ant-design/pro-layout';
-import { useSingleState } from 'nice-hooks';
-import ReactQuill from 'react-quill';
-import 'react-quill/dist/quill.snow.css';
-import { Memory } from './data.d';
+import {Button, message} from 'antd';
+import React, {useEffect} from 'react';
+import {PageHeaderWrapper} from '@ant-design/pro-layout';
+import {useSingleState} from 'nice-hooks';
+import Quill from "@/pages/Memory/components/Quill";
+import {Memory} from './data.d';
 import service from './service';
 
 enum Step {
@@ -34,6 +33,7 @@ const TableList: React.FC<{}> = () => {
     tag: '',
   });
 
+
   /**
    * 查询用户待提醒数量
    * @param fields
@@ -44,19 +44,36 @@ const TableList: React.FC<{}> = () => {
       const res = await service.countRemind({});
       hide();
       if (res.success) {
-        setState({ remindCount: parseInt(res.data, 10) });
-        return true;
+        setState({remindCount: parseInt(res.data, 10)});
       }
-      return false;
     } catch (error) {
       hide();
       message.error('查询异常!');
-      return false;
     }
   };
   useEffect(() => {
     countRemind();
+    setTimeout( ()=> {
+      countRemind();
+    },1000*60*60)  // 每隔一个小时查询一次
   }, []);
+  /**
+   * 清空memory
+   */
+  const clearMemory = () => {
+    setMemory({
+      id: null,
+      front: '',
+      back: '',
+    });
+  };
+  /**
+   * 每次修改step,都关闭背面
+   */
+  useEffect(() => {
+    setState({showBack: false});
+    clearMemory();
+  }, [state.step]);
 
   useEffect(() => {
     // console.log(state)
@@ -66,14 +83,14 @@ const TableList: React.FC<{}> = () => {
    * 进入统计页面
    */
   const changStepMain = () => {
-    setState({ step: Step.MAIN });
+    setState({step: Step.MAIN});
     countRemind();
   };
 
   const findNextLine = async () => {
     const res = await service.findNext({});
     if (res.success) {
-      setMemory({ ...memory, ...res.data });
+      setMemory({...memory, ...res.data});
     } else {
       changStepMain();
     }
@@ -87,44 +104,44 @@ const TableList: React.FC<{}> = () => {
       message.info('已经复习完了哟!');
       return;
     }
-    setState({ step: Step.MEMORY });
+    setState({step: Step.MEMORY});
     await findNextLine();
   };
-
-  const memorySuccess = async (factorInt: number) => {
-    const res = await service.memorySuccess({ id: memory.id, factor: factorInt });
+  /**
+   * 处理返回值
+   * @param res
+   */
+  const memoryRes = (res:any)=>{
     if (res.success) {
-      setMemory({ ...memory, ...res.data });
+      setState({showBack: false});
+      setMemory({...memory, ...res.data});
     } else {
       changStepMain();
     }
+
+  }
+  const memorySuccess = async (factorInt: number) => {
+    memoryRes(await service.memorySuccess({id: memory.id, factor: factorInt}));
+
   };
 
+
   const changStepAdd = () => {
-    setState({ step: Step.ADD });
+    setState({step: Step.ADD});
   };
 
-  /**
-   * 清空memory
-   */
-  const clearMemory = () => {
-    setMemory({
-      id: null,
-      front: '',
-      back: '',
-    });
-  };
+
 
   return (
     <PageHeaderWrapper title={false}>
       {state.step === Step.MAIN ? (
         <div>
           <div>待复习: {state.remindCount}</div>
-          <p />
+          <p/>
           <Button type="primary" size="large" onClick={changStepMemory}>
             复习
           </Button>
-          <p />
+          <p/>
           <Button type="primary" size="large" onClick={changStepAdd}>
             添加
           </Button>
@@ -133,14 +150,20 @@ const TableList: React.FC<{}> = () => {
 
       {state.step === Step.MEMORY ? (
         <div>
-          问题
-          <hr />
-          <div dangerouslySetInnerHTML={{ __html: memory.front }} />
-          <hr />
+          问题:
+          <p />
+          <Quill
+            readonly
+            onChange={()=>{}}
+            value={memory.front}/>
+            <p />
           {state.showBack ? (
             <div>
-              <div dangerouslySetInnerHTML={{ __html: memory.back }} />
-              <hr />
+              <Quill
+                readonly
+                onChange={()=>{}}
+                value={memory.back}/>
+                <p />
               <Button
                 type="primary"
                 onClick={() => {
@@ -167,13 +190,12 @@ const TableList: React.FC<{}> = () => {
               >
                 简单
               </Button>
-              <p />
+              <p/>
               <div>
                 <Button
                   type="primary"
                   onClick={async () => {
-                    await service.restart(memory);
-                    findNextLine();
+                    memoryRes(await service.restart(memory));
                   }}
                 >
                   重新开始复习
@@ -182,8 +204,7 @@ const TableList: React.FC<{}> = () => {
                 <Button
                   type="primary"
                   onClick={async () => {
-                    await service.noMemory(memory);
-                    findNextLine();
+                    memoryRes(await service.noMemory(memory));
                   }}
                 >
                   不在复习
@@ -192,14 +213,13 @@ const TableList: React.FC<{}> = () => {
                 <Button
                   type="primary"
                   onClick={async () => {
-                    await service.delete(memory);
-                    findNextLine();
+                    memoryRes(await service.delete(memory));
                   }}
                 >
                   删除
                 </Button>
               </div>
-              <p />
+              <p/>
               <div>
                 <Button
                   type="primary"
@@ -209,6 +229,15 @@ const TableList: React.FC<{}> = () => {
                 >
                   编辑
                 </Button>
+                <span> </span>
+                <Button
+                  type="primary"
+                  onClick={() => {
+                    changStepMain();
+                  }}
+                >
+                  关闭
+                </Button>
               </div>
             </div>
           ) : (
@@ -216,7 +245,7 @@ const TableList: React.FC<{}> = () => {
               <Button
                 type="primary"
                 onClick={() => {
-                  setState({ showBack: true });
+                  setState({showBack: true});
                 }}
               >
                 显示答案
@@ -229,23 +258,23 @@ const TableList: React.FC<{}> = () => {
       {state.step === Step.ADD ? (
         <div>
           <h4>正面</h4>
-          <ReactQuill
-            theme="snow"
-            value={memory.front}
+          <Quill
+            readonly={false}
             onChange={(value) => {
-              setMemory({ front: value });
+              setMemory({front: value});
             }}
-          />
-          <p />
+            value={memory.front}/>
+
+          <p/>
           <h4>反面</h4>
-          <ReactQuill
-            theme="snow"
-            value={memory.back}
+          <Quill
+            readonly={false}
             onChange={(value) => {
-              setMemory({ back: value });
+              setMemory({back: value});
             }}
+            value={memory.back}
           />
-          <p />
+          <p/>
           <Button
             type="primary"
             onClick={async () => {
@@ -269,7 +298,6 @@ const TableList: React.FC<{}> = () => {
           <Button
             type="primary"
             onClick={() => {
-              clearMemory();
               changStepMain();
             }}
           >

+ 1 - 1
src/pages/ServiceList/service.ts

@@ -2,5 +2,5 @@ import api from '@/utils/api';
 
 export default {
   queryList: api.get('/service/queryList'),
-  forceUpdateModel: api.post('/service/forceUpdate'),
+  forceUpdateModel: api.get('/service/forceUpdate'),
 };

+ 2 - 0
src/pages/Setting/data.d.ts

@@ -29,3 +29,5 @@ export interface TableListParams {
   pageSize?: number;
   currentPage?: number;
 }
+
+

+ 66 - 130
src/pages/Setting/index.tsx

@@ -1,149 +1,85 @@
-import { message, Tooltip, Radio } from 'antd';
-import React, { useRef, useState } from 'react';
-import { PageHeaderWrapper } from '@ant-design/pro-layout';
-import ProTable, { ActionType, ProColumns } from '@ant-design/pro-table';
-import { SorterResult } from 'antd/es/table/interface';
-import { TableListItem } from './data.d';
+import {Button, Card, Form, Input, message} from 'antd';
+import React from 'react';
+import {PageHeaderWrapper} from '@ant-design/pro-layout';
 import service from './service';
-import styles from './index.less'
+
+interface PasswordChange{
+  newPassword: string;
+  oldPassword: string;
+}
+
+const layout = {
+  labelCol: { span: 4 },
+  wrapperCol: { span: 18 },
+};
+const tailLayout = {
+  wrapperCol: { offset: 4, span: 18 },
+};
+
+
 
 /**
  * 更新节点
  * @param fields
  */
-const handleUpdate = async (fields: TableListItem) => {
-  const hide = message.loading('正在配置');
+const handleUpdate = async (fields: PasswordChange) => {
+  const hide = message.loading('正在发送');
   try {
-    const data = await service.forceUpdateModel(fields);
-    hide();
-    message.success('配置成功');
-    return data.success;
-  } catch (error) {
-    hide();
-    message.error('配置失败请重试!');
-    return false;
+    const data = await service.updatePassword(fields);
+    if (data.success) {
+      hide();
+      message.success('修改成功');
+    } else {
+      message.error('修改失败!');
+    }
+  }catch (e) {
+    console.log(e);
   }
 };
 
 const TableList: React.FC<{}> = () => {
-  const [sorter, setSorter] = useState<string>('');
-  const actionRef = useRef<ActionType>();
+  const onFinish = (values: any) => {
+    handleUpdate(values);
+  };
 
-  const columns: ProColumns<TableListItem>[] = [
-    {
-      title: '服务IP',
-      dataIndex: 'serviceIp',
-      width: 150,
-      copyable: true,
-    },
-    {
-      title: '模型名称',
-      dataIndex: 'modelName',
-      width: 150,
-      copyable: true,
-    },
-    {
-      title: '模型版本',
-      dataIndex: 'modelVersion',
-      valueType: 'dateTime',
-      width: 200,
-      hideInSearch: true,
-    },
-    {
-      title: '当前版本',
-      dataIndex: 'currentVersion',
-      valueType: 'dateTime',
-      width: 220,
-      hideInSearch: true,
-      render: (text, row)=>{
-        if (row.currentVersion < row.modelVersion) {
-           return (<div className={styles.red}>{text} :待更新</div>)
-        }
-        return (<div>{text}</div>)
+  // const onFinishFailed = errorInfo => {
+  //   console.log('Failed:', errorInfo);
+  // };
 
-      }
-    },
-    {
-      title: '启动状态',
-      dataIndex: 'success',
-      copyable: true,
-      width: 100,
-      renderFormItem: () => {
-        return (
-          <Radio.Group>
-            <Radio value="成功">成功</Radio>
-            <Radio value="失败">失败</Radio>
-          </Radio.Group>
-        );
-      },
-      valueEnum: {
-        "成功": { text: "成功", status: 'Success' },
-        "失败": { text: "失败", status: 'Error' }
-      },
-    },
-    {
-      title: '启动信息',
-      dataIndex: 'msg',
-      hideInSearch: true,
-      valueType: 'text',
-      width: 200,
-      render: (text, row) => {
-        if (!text) {
-          row.msg = '';
-        }
+  return (
+    <PageHeaderWrapper title={false}>
+      <Card title="重置密码"  style={{ width: '100%' }}>
+        <Form
+          {...layout}
+          name="basic"
+          initialValues={{ remember: true }}
+          onFinish={onFinish}
+          // onFinishFailed={onFinishFailed}
+        >
+          <Form.Item
+            label="旧密码"
+            name="oldPassword"
+            rules={[{ required: true, message: '请输入旧密码!' }]}
+          >
+            <Input.Password />
+          </Form.Item>
 
-        return (<>
-          <Tooltip title={row.msg}>
-            <span>{row.msg.substring(0, 10)}</span>
-          </Tooltip>
-        </>);
-      },
-    },
-    {
-      title: '操作',
-      dataIndex: 'option',
-      width: 100,
-      valueType: 'option',
-      render: (_, record,index,action) => (
-        <>
-          <a
-            onClick={async () => {
-              const success = await handleUpdate(record);
-              if (success) {
-                await action.reload();
-              }
-              console.log(record);
-            }}
+          <Form.Item
+            label="新密码"
+            name="newPassword"
+            rules={[{ required: true, message: '请输入旧密码' }]}
           >
-            强制更新
-          </a>
-        </>
-      ),
-    },
-  ];
+            <Input.Password />
+          </Form.Item>
+
+          <Form.Item {...tailLayout}>
+            <Button type="primary" htmlType="submit">
+              提交
+            </Button>
+          </Form.Item>
+        </Form>
+      </Card>
 
-  return (
-    <PageHeaderWrapper title={false}>
-      <ProTable<TableListItem>
-        headerTitle="查询表格"
-        actionRef={actionRef}
-        rowKey="id"
-        onChange={(_, _filter, _sorter) => {
-          const sorterResult = _sorter as SorterResult<TableListItem>;
-          if (sorterResult.field) {
-            setSorter(`${sorterResult.field}_${sorterResult.order}`);
-          }
-        }}
-        pagination={{
-          defaultPageSize: 10,
-        }}
-        params={{
-          sorter,
-        }}
-        request={(params) => service.queryList(params)}
-        columns={columns}
-        rowSelection={{}}
-      />
     </PageHeaderWrapper>
   );
 };

+ 1 - 0
src/pages/Setting/service.ts

@@ -3,4 +3,5 @@ import api from '@/utils/api';
 export default {
   queryList: api.get('/service/queryList'),
   forceUpdateModel: api.post('/service/forceUpdate'),
+  updatePassword: api.get('/api/user/resetPassword'),
 };

+ 11 - 8
src/pages/user/login/index.tsx

@@ -1,7 +1,6 @@
-import {AlipayCircleOutlined, TaobaoCircleOutlined, WeiboCircleOutlined} from '@ant-design/icons';
-import {Alert, Checkbox} from 'antd';
+import {Alert} from 'antd';
 import React, {useState} from 'react';
-import {Link, connect, Dispatch} from 'umi';
+import {connect, Dispatch} from 'umi';
 import {StateType} from '@/models/login';
 import {LoginParamsType} from '@/services/login';
 import {ConnectState} from '@/models/connect';
@@ -32,8 +31,8 @@ const LoginMessage: React.FC<{
 
 const Login: React.FC<LoginProps> = (props) => {
   const {userLogin = {}, submitting} = props;
-  const {status, type: loginType} = userLogin;
-  const [autoLogin, setAutoLogin] = useState(true);
+  // const {status, type: loginType} = userLogin;
+  // const [autoLogin, setAutoLogin] = useState(true);
   const [identityType, setType] = useState<string>('account');
 
   const handleSubmit = (values: LoginParamsType) => {
@@ -76,6 +75,7 @@ const Login: React.FC<LoginProps> = (props) => {
             ]}
           />
         </Tab>
+        {/*
         <Tab key="mobile" tab="手机号登录">
           {status === 'error' && loginType === 'mobile' && !submitting && (
             <LoginMessage content="验证码错误"/>
@@ -109,9 +109,6 @@ const Login: React.FC<LoginProps> = (props) => {
           />
         </Tab>
         <div>
-          <Checkbox checked={autoLogin} onChange={(e) => setAutoLogin(e.target.checked)}>
-            自动登录
-          </Checkbox>
           <a
             style={{
               float: 'right',
@@ -120,7 +117,11 @@ const Login: React.FC<LoginProps> = (props) => {
             忘记密码
           </a>
         </div>
+         */}
+
+
         <Submit loading={submitting}>登录</Submit>
+        {/*
         <div className={styles.other}>
           其他登录方式
           <AlipayCircleOutlined className={styles.icon}/>
@@ -130,6 +131,8 @@ const Login: React.FC<LoginProps> = (props) => {
             注册账户
           </Link>
         </div>
+        */}
+
       </LoginFrom>
     </div>
   );

+ 11 - 10
src/utils/request.ts

@@ -12,7 +12,7 @@ const codeMessage = {
   202: '一个请求已经进入后台排队(异步任务)。',
   204: '删除数据成功。',
   400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
-  401: '用户没有权限(令牌、用户名、密码错误)。',
+  401: '没有权限,请重新登录',
   403: '用户得到授权,但是访问是被禁止的。',
   404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
   406: '请求的格式不可得。',
@@ -31,10 +31,10 @@ const errorHandler = (error: { response: Response }): Response => {
   const {response} = error;
   if (response && response.status) {
     const errorText = codeMessage[response.status] || response.statusText;
-    const {status, url} = response;
+    const {status} = response;
 
     notification.error({
-      message: `请求错误 ${status}: ${url}`,
+      message: `请求错误 ${status}`,
       description: errorText,
     });
   } else if (!response) {
@@ -69,19 +69,20 @@ request.interceptors.request.use((url, options) => {
         options: {...options, headers},
       }
     );
-  } else {
-    return (
-      {
-        url,
-        options: {...options},
-      }
-    );
   }
+  return (
+    {
+      url,
+      options: {...options},
+    }
+  );
+
 
 })
 
 
 // response拦截器, 处理response
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 request.interceptors.response.use((response, options) => {
   const token = response.headers.get("authorization");
   if (token) {