wjj 4 gadi atpakaļ
vecāks
revīzija
d5b4ed932d

+ 25 - 27
src/pages/edit/components/Step1/index.jsx

@@ -25,23 +25,23 @@ const Step1 = (props) => {
 
   const { validateFields } = form;
 
-  useEffect(()=>{
+  useEffect(() => {
     dispatch({
-      type: 'editReport/getOsTypeAction',
-      payload: {examId:1945},
+      type: 'editReport/getOsType',
+      payload: { examId: 1718 },
     });
-  },[dispatch])
+  }, [dispatch]);
 
   const onFinish = (values) => {
     let formData = new FormData();
-    formData.append("name", values.reportName);
-    formData.append("case_id", "1718");
-    formData.append("task_id", "1718");
-    formData.append("worker_id", "1");
-    formData.append("case_take_id", "1718-1718");
-    formData.append("device_model", values.deviceBrand);
-    formData.append("device_brand", values.deviceName);
-    formData.append("device_os", values.os);
+    formData.append('name', values.reportName);
+    formData.append('case_id', '1718');
+    formData.append('task_id', '1718');
+    formData.append('worker_id', '1');
+    formData.append('case_take_id', '1718-1718');
+    formData.append('device_model', values.deviceBrand);
+    formData.append('device_brand', values.deviceName);
+    formData.append('device_os', values.os);
     dispatch({
       type: 'editReport/saveReportCommonDetail',
       payload: formData,
@@ -54,14 +54,14 @@ const Step1 = (props) => {
 
   const onValidateForm = async () => {
     const isValid = await validateFields();
-    if(!isValid.outOfDate){
+    if (!isValid.outOfDate) {
       //表单验证通过,开始发送请求
       var request = new XMLHttpRequest();
-      request.open("POST", "http://foo.com/submitform.php");
+      request.open('POST', 'http://foo.com/submitform.php');
       request.send(formData);
       dispatch({
         type: 'editReport/getOsTypeAction',
-        payload: {examId:1945},
+        payload: { examId: 1945 },
       });
     }
     // if (dispatch) {
@@ -88,36 +88,34 @@ const Step1 = (props) => {
         onFinish={onFinish}
         onFinishFailed={onFinishFailed}
       >
-        <Form.Item label="报告名称" name="reportName"rules={[{ required: true, message: '请输入报告名称'}]}>
-          <Input placeholder="请输入报告名称"/>
+        <Form.Item label="报告名称" name="reportName" rules={[{ required: true, message: '请输入报告名称' }]}>
+          <Input placeholder="请输入报告名称" />
         </Form.Item>
-        <Form.Item label="设备名称" name="deviceName" rules={[{ required: true, message: '请输入设备品牌'}]}>
+        <Form.Item label="设备名称" name="deviceName" rules={[{ required: true, message: '请输入设备品牌' }]}>
           <Input placeholder="请输入设备名称" />
         </Form.Item>
-        <Form.Item label="设备品牌" name="deviceBrand" rules={[{ required: true, message: '请输入设备品牌'}]}>
+        <Form.Item label="设备品牌" name="deviceBrand" rules={[{ required: true, message: '请输入设备品牌' }]}>
           <Input placeholder="请输入设备品牌" />
         </Form.Item>
-        <Form.Item label="操作系统" name="os" rules={[{ required: true, message: '请输入操作系统'}]}>
-          <Select  placeholder="请选择操作系统">
-            {osType.map((option)=>{
-              return <Select.Option value={option} key={option}>{option}</Select.Option>
+        <Form.Item label="操作系统" name="os" rules={[{ required: true, message: '请输入操作系统' }]}>
+          <Select placeholder="请选择操作系统">
+            {osType.map((option) => {
+              return <Select.Option value={option} key={option}>{option}</Select.Option>;
             })}
           </Select>
         </Form.Item>
         <Form.Item {...tailLayout}>
           <Button colSpan={12} type="primary" htmlType="submit"
-                  style={{float:'right'}}>
+                  style={{ float: 'right' }}>
             下一步
           </Button>
         </Form.Item>
       </Form>
-
     </>
   )
-    ;
 };
 
 export default connect(({ editReport }) => ({
   data: editReport.step,
-  osType:editReport.osType
+  osType: editReport.osType,
 }))(Step1);

+ 1 - 0
src/pages/edit/components/Step2/const.js

@@ -2,3 +2,4 @@ export const recurrent = new Map([[0,''],[1,'其他'],[2,'无规律复现'],
   [3,'小概率复现'],[4,'大概率复现'],[5,'必现']]);
 export const severity = new Map([[0,''],[1,'待定'],[2,'较轻'],
   [3,'一般'],[4,'严重'],[5,'紧急']]);
+export const bug_categories = ['不正常退出','功能不完整','用户体验','页面布局缺陷','性能','安全','其他']

+ 140 - 72
src/pages/edit/components/Step2/index.jsx

@@ -11,7 +11,7 @@ import {
   EyeOutlined,
 } from '@ant-design/icons';
 
-import {recurrent,severity} from './const'
+import { recurrent, severity, bug_categories } from './const';
 
 const formItemLayout = {
   labelCol: {
@@ -25,26 +25,22 @@ const formItemLayout = {
 const Step2 = (props) => {
   const [form] = Form.useForm();
   const [addCaseForm] = Form.useForm();
-  const { data, dispatch, reportCommonInfo, testCaseList ,caseBugList} = props;
-  // console.log(reportCommonInfo,props)
+  const [addBugForm] = Form.useForm();
+  const { data, dispatch, reportCommonInfo, testCaseList, caseBugList,categories } = props;
+
   const [showTaskRecommendModal, setTaskRecommendModal] = useState(false);
   const [showAddTestCaseModal, setAddTestCaseModal] = useState(false);
   const [showAddBugModal, setAddTestBugModal] = useState(false);
-
   const currentTestCaseRef = useRef({});
-
-  const [isAddCaseStatus , setIsAddCaseStatus ] = useState(true);
-  const [currActiveTestCase , setCurrActiveTestCase ] = useState({});
+  const [isAddCaseStatus, setIsAddCaseStatus] = useState(true);
+  const [currActiveTestCase, setCurrActiveTestCase] = useState({});
 
 
   if (!data) {
     return null;
   }
 
-  const { validateFields, getFieldsValue } = addCaseForm;
-
   const handleAddOrEditTestCase = () => {
-
     addCaseForm.validateFields().then((res) => {
       let formData = new FormData();
       // formData.append("id", values.reportName);
@@ -53,30 +49,30 @@ const Step2 = (props) => {
       formData.append('front', res.front);
       formData.append('behind', res.behind);
       formData.append('description', res.description);
-      if(!isAddCaseStatus){
+      if (!isAddCaseStatus) {
         //处理编辑用例
-        formData.append('id',currentTestCaseRef.current.id);
+        formData.append('id', currentTestCaseRef.current.id);
         dispatch({
           type: 'editReport/updateTestCase',
           payload: {
             formData,
-            report_id:reportCommonInfo.id
+            report_id: reportCommonInfo.id,
           },
-        }).then((res)=>{
-          if(res&&res.status === 200){
+        }).then((res) => {
+          if (res && res.status === 200) {
             message.success('修改成功!');
           }
         });
-      }else{
+      } else {
         //处理添加用例
         dispatch({
           type: 'editReport/createTestCase',
           payload: {
             formData,
-            report_id:reportCommonInfo.id
+            report_id: reportCommonInfo.id,
           },
-        }).then((res)=>{
-          if(res&&res.id){
+        }).then((res) => {
+          if (res && res.id) {
             message.success('添加成功!');
           }
         });
@@ -86,34 +82,87 @@ const Step2 = (props) => {
     });
   };
 
-  const handleClickTestCase = (caseItem)=>{
-    setCurrActiveTestCase(caseItem)
+  const handleAddBug = () => {
+    addBugForm.validateFields().then((res) => {
+      console.log(res);
+      let formData = new FormData();
+      formData.append('report_id', reportCommonInfo.id);
+      formData.append('name', res.name);
+      formData.append('front', res.front);
+      formData.append('behind', res.behind);
+      formData.append('description', res.description);
+    });
+    // if (true) {
+    //   //新建bug的逻辑
+    //   setAddTestBugModal(true);
+      // dispatch({
+      //   type: 'editReport/createTestCase',
+      //   payload: {
+      //     report_id:reportCommonInfo.id
+      //   },
+      // }).then((res)=>{
+      //   if(res&&res.id){
+      //     message.success('添加成功!');
+      //   }
+      // });
+    // } else {
+    //   //编辑bug的逻辑
+    // }
+  };
+
+  const handleClickTestCase = (caseItem) => {
+    setCurrActiveTestCase(caseItem);
     dispatch({
       type: 'editReport/getCaseBugList',
       payload: caseItem.id,
     });
-  }
+  };
 
   const handleEditTestCase = (item) => {
     setIsAddCaseStatus(false);
     currentTestCaseRef.current = item;
-    addCaseForm.setFieldsValue(currentTestCaseRef.current)
+    addCaseForm.setFieldsValue(currentTestCaseRef.current);
     setAddTestCaseModal(true);
   };
 
-  const handleClickAddCase = ()=>{
+  const handleClickAddCase = () => {
     currentTestCaseRef.current = {};
     addCaseForm.resetFields();
     setAddTestCaseModal(true);
-  }
+  };
+
+  // const handleEditBug = (item) => {
+  //   setIsAddCaseStatus(false);
+  //   currentTestCaseRef.current = item;
+  //   addBugForm.setFieldsValue(currentTestCaseRef.current)
+  //   setAddTestCaseModal(true);
+  // };
 
+  const handleClickAddBug = () => {
+    addBugForm.resetFields();
+    setAddTestBugModal(true);
+  };
 
   useEffect(() => {
+    //判断是否已经有报告
     dispatch({
-      type: 'editReport/getTestCaseList',
-      payload: {report_id:reportCommonInfo.id},
+      type: 'editReport/getReportInfo',
+      payload: {
+        case_take_id: '1718-1718',
+        worker_id: 1,
+      },
+    }).then(() => {
+      //有报告,获取对应信息。没有就直接转去了第一步
+      dispatch({
+        type: 'editReport/getTestCaseList',
+        payload: { report_id: reportCommonInfo.id },
+      });
+      dispatch({
+        type: 'editReport/getCategories',
+        payload: { examId: 1945 },
+      });
     });
-  }, [dispatch,reportCommonInfo]);
+  }, [dispatch]);
 
   return (
     <div>
@@ -161,7 +210,9 @@ const Step2 = (props) => {
                 <Row gutter={10} style={{ marginBottom: 10 }}>
                   <Col span={20}><h3>测试用例列表</h3></Col>
                   <Col span={4}>
-                    <Button size="small" onClick={()=>{handleClickAddCase()}}>
+                    <Button size="small" onClick={() => {
+                      handleClickAddCase();
+                    }}>
                       <PlusOutlined className={styles.addIcon} />
                       用例
                     </Button>
@@ -170,20 +221,22 @@ const Step2 = (props) => {
               </div>
 
               <div className={styles.testCaseList}>
-                {testCaseList.length && testCaseList.map((item) => {
+                {testCaseList && testCaseList.map((item) => {
                   return (
-                    <div className={`${styles.testCaseItem} ${currActiveTestCase.id===item.id ? styles.activeCase :""}`}
-                         key={item.id}
-                         onClick={()=>{
-                           handleClickTestCase(item)}}>
-                    <Row gutter={10}>
-                      <Col span={21}><p>{item.name}</p></Col>
-                      <Col span={3}>
-                        <EditOutlined className={styles.editTestBug}
-                                      onClick={() => handleEditTestCase(item)} />
-                      </Col>
-                    </Row>
-                  </div>);
+                    <div
+                      className={`${styles.testCaseItem} ${currActiveTestCase.id === item.id ? styles.activeCase : ''}`}
+                      key={item.id}
+                      onClick={() => {
+                        handleClickTestCase(item);
+                      }}>
+                      <Row gutter={10}>
+                        <Col span={21}><p>{item.name}</p></Col>
+                        <Col span={3}>
+                          <EditOutlined className={styles.editTestBug}
+                                        onClick={() => handleEditTestCase(item)} />
+                        </Col>
+                      </Row>
+                    </div>);
                 })}
               </div>
             </Col>
@@ -192,7 +245,7 @@ const Step2 = (props) => {
               <Row gutter={10} style={{ marginBottom: 10 }}>
                 <Col span={20}><h3>缺陷列表</h3></Col>
                 <Col span={2}>
-                  <Button size="small" onClick={() => setAddTestBugModal(true)}>
+                  <Button size="small" onClick={() => handleClickAddBug()}>
                     <PlusOutlined className={styles.addIcon} />
                     缺陷
                   </Button>
@@ -205,23 +258,25 @@ const Step2 = (props) => {
                 </Col>
               </Row>
               <div className={styles.testBugList}>
-                {caseBugList.map((item)=>{
-                  return (<div className={styles.testBugItem} key={item.id}>
-                    <Row gutter={10}>
+                {caseBugList.map((item) => {
+                  return (
+                    <div className={styles.testBugItem} key={item.detail.id}>
+                      <Row gutter={10}>
                       <Col span={20}>
                         <div><span className={styles.bugItemTitle}>Bug标题:</span>{item.detail.title}</div>
                         <div><span className={styles.bugItemTitle}>复现程度:</span>{recurrent.get(item.detail.recurrent)}</div>
                         <div><span className={styles.bugItemTitle}>严重程度:</span>{item.detail.severity}</div>
-                        <div><span className={styles.bugItemTitle}>缺陷分类:</span>{severity.get(item.detail.bug_category)}</div>
+                        <div><span className={styles.bugItemTitle}>缺陷分类:</span>{severity.get(item.detail.bug_category)}
+                        </div>
                       </Col>
                       <Col span={4}>
                         <Button size='small' style={{ marginTop: 10 }}>
                           <EyeOutlined />详情</Button>
                       </Col>
                     </Row>
-                  </div>)
+                    </div>
+                  );
                 })}
-
               </div>
             </Col>
 
@@ -238,7 +293,9 @@ const Step2 = (props) => {
                        onClick={() => {
                          setAddTestCaseModal(false);
                        }}>取消</Button>]}
-             onCancel={() => {setAddTestCaseModal(false)}}
+             onCancel={() => {
+               setAddTestCaseModal(false);
+             }}
       >
         <ExclamationCircleFilled className={styles.addModalInfo} />为了评分准确,请勿提交重复测试用例
         <Form
@@ -257,7 +314,7 @@ const Step2 = (props) => {
               },
             ]}
           >
-            <Input/>
+            <Input />
           </Form.Item>
           <Form.Item
             label="前置条件"
@@ -269,7 +326,7 @@ const Step2 = (props) => {
               },
             ]}
           >
-            <Input.TextArea autoSize={{ minRows: 3, maxRows: 999 }}/>
+            <Input.TextArea autoSize={{ minRows: 3, maxRows: 999 }} />
           </Form.Item>
           <Form.Item
             label="测试步骤"
@@ -281,7 +338,7 @@ const Step2 = (props) => {
               },
             ]}
           >
-            <Input.TextArea autoSize={{ minRows: 3, maxRows: 999 }}/>
+            <Input.TextArea autoSize={{ minRows: 3, maxRows: 999 }} />
           </Form.Item>
           <Form.Item
             label="预期结果"
@@ -293,19 +350,27 @@ const Step2 = (props) => {
               },
             ]}
           >
-            <Input.TextArea autoSize={{ minRows: 3, maxRows: 999 }}/>
+            <Input.TextArea autoSize={{ minRows: 3, maxRows: 999 }} />
           </Form.Item>
         </Form>
       </Modal>
 
       <Modal title="添加用例缺陷" visible={showAddBugModal} width={720}
-             onOk={() => setAddTestBugModal(false)}
-             onCancel={() => setAddTestBugModal(false)}
-             >
+             footer={[
+               <Button key='submit' type="primary" htmlType="submit" onClick={handleClickAddBug}>确定</Button>,
+               <Button key='cancel' htmlType="button" style={{ marginLeft: '10px' }}
+                       onClick={() => { handleAddBug();}}>取消</Button>]}
+               onCancel={() => {
+                 setAddTestBugModal(false);
+               }}
+      >
         <ExclamationCircleFilled className={styles.addModalInfo} />为了评分准确,请勿提交重复Bug
         <Form
           labelCol={{ span: 4 }}
+          form={addBugForm}
+          {...formItemLayout}
           layout="horizontal"
+          className={styles.stepForm}
         >
           <Form.Item
             label="测试题目"
@@ -317,7 +382,7 @@ const Step2 = (props) => {
               },
             ]}
           >
-            <Input autoSize/>
+            <Input />
           </Form.Item>
           <Form.Item
             label="前置条件"
@@ -329,7 +394,7 @@ const Step2 = (props) => {
               },
             ]}
           >
-            <Input.TextArea autoSize/>
+            <Input.TextArea autoSize />
           </Form.Item>
           <Form.Item
             label="三级页面"
@@ -344,7 +409,9 @@ const Step2 = (props) => {
             <Row gutter={5}>
               <Col span={8}>
                 <Select>
-                  <Select.Option value="demo">Demo1</Select.Option>
+                  {categories.map((item)=>{
+                    return <Select.Option value="demo" key={item.item}>{item.item}</Select.Option>
+                  })}
                 </Select>
               </Col>
               <Col span={8}>
@@ -389,7 +456,7 @@ const Step2 = (props) => {
           </Form.Item>
           <Form.Item
             label="复现程度"
-            name="testName"
+            name="recurrent"
             rules={[
               {
                 required: true,
@@ -401,17 +468,17 @@ const Step2 = (props) => {
               <Select.Option value="demo">Demo</Select.Option>
             </Select>
           </Form.Item>
-          <Form.Item
-            label="上传截图"
-            name="testName"
-          >
-            <Upload
-              action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
-              listType="picture"
-            >
-              <Button icon={<UploadOutlined />}>Upload</Button>
-            </Upload>
-          </Form.Item>
+          {/*<Form.Item*/}
+          {/*  label="上传截图"*/}
+          {/*  name="testName"*/}
+          {/*>*/}
+          {/*  <Upload*/}
+          {/*    action="https://www.mocky.io/v2/5cc8019d300000980a055e76"*/}
+          {/*    listType="picture"*/}
+          {/*  >*/}
+          {/*    <Button icon={<UploadOutlined />}>Upload</Button>*/}
+          {/*  </Upload>*/}
+          {/*</Form.Item>*/}
         </Form>
       </Modal>
       <Modal title="任务推荐" visible={showTaskRecommendModal} onOk={() => setTaskRecommendModal(false)}
@@ -430,4 +497,5 @@ export default connect(({ editReport, loading }) => ({
   reportCommonInfo: editReport.reportCommonInfo,
   testCaseList: editReport.testCaseList,
   caseBugList: editReport.caseBugList,
+  categories:editReport.categories
 }))(Step2);

+ 1 - 1
src/pages/edit/index.jsx

@@ -32,7 +32,7 @@ const EditReport = ({ current }) => {
     setCurrentStep(step);
     setStepComponent(component);
   }, [current]);
-  console.log(stepComponent)
+
   return (
       <Card bordered={false}>
         <>

+ 67 - 17
src/pages/edit/model.js

@@ -1,18 +1,20 @@
 import {
   fakeSubmitForm,
-  getOsType,
+  getExamInfo,
   createReportCommon,
   createTestCase,
   getTestCaseList,
   getCaseBugList,
   getBugInfo,
-  updateTestCaseList
+  updateTestCaseList,
+  getReportInfo,
+  getCategoriesInfo,
 } from './service';
 
 const Model = {
   namespace: 'editReport',
   state: {
-    current: 'info',
+    current: 'detail',
     osType: [],
     step: {
       payAccount: 'ant-design@alipay.com',
@@ -23,6 +25,7 @@ const Model = {
     reportCommonInfo: {},
     testCaseList: [],
     caseBugList: [],
+    categories: [],
   },
   effects: {
     * submitStepForm({ payload }, { call, put }) {
@@ -36,9 +39,9 @@ const Model = {
         payload: 'detail',
       });
     },
-    * getOsTypeAction({ payload }, { call, put }) {
+    * getOsType({ payload }, { call, put }) {
       const { examId } = payload;
-      let res = yield call(getOsType, examId);
+      let res = yield call(getExamInfo, examId);
       let osType = res?.result?.paper_type;
       osType = JSON.parse(osType)['subTitles'][2]?.value;
       yield put({
@@ -46,6 +49,17 @@ const Model = {
         payload: osType,
       });
     },
+    //todo:获取三级菜单信息
+    * getCategories({ payload }, { call, put }) {
+      const { examId } = payload;
+      let res = yield call(getExamInfo, examId);
+      let categories = res?.result?.json;
+      categories = JSON.parse(categories);
+      yield put({
+        type: 'saveCategories',
+        payload: categories,
+      });
+    },
     * getTestCaseList({ payload }, { call, put }) {
       const { report_id } = payload;
       let res = yield call(getTestCaseList, report_id);
@@ -54,6 +68,22 @@ const Model = {
         payload: res.result,
       });
     },
+    //todo:获取报告基础信息
+    * getReportInfo({ payload }, { call, put }) {
+      const { case_take_id, worker_id } = payload;
+      let res = yield call(getReportInfo, case_take_id, worker_id);
+      if(res.status === 200){
+        yield put({
+          type: 'saveReportCommonInfo',
+          payload: res.result,
+        });
+      }else{
+        yield put({
+          type: 'saveCurrentStep',
+          payload: 'info',
+        });
+      }
+    },
     //todo:保存报告基础信息
     * saveReportCommonDetail({ payload }, { call, put }) {
       let res = yield call(createReportCommon, payload);
@@ -73,22 +103,22 @@ const Model = {
     },
     //todo:创建新用例
     * createTestCase({ payload }, { call, put }) {
-      let { formData , report_id} = payload;
+      let { formData, report_id } = payload;
       let res = yield call(createTestCase, formData);
       yield put({
         type: 'getTestCaseList',
-        payload: { report_id }
-      })
+        payload: { report_id },
+      });
       return res;
     },
     //todo:更新用例
     * updateTestCase({ payload }, { call, put }) {
-      let { formData,report_id } = payload;
+      let { formData, report_id } = payload;
       let res = yield call(updateTestCaseList, formData);
       yield put({
         type: 'getTestCaseList',
-        payload: { report_id }
-      })
+        payload: { report_id },
+      });
       return res;
     },
     //todo:获取bug列表
@@ -97,21 +127,38 @@ const Model = {
       let newBugList = [];
       for (const item of bugIdList) {
         let p = yield put({ type: 'getBugInfo', payload: { item } });
-        p.then(res=>{
-          newBugList.push(res)
+        p.then(res => {
+          newBugList.push(res);
         });
       }
       yield put({
-        type:'saveCaseBugList',
-        payload:newBugList
-      })
+        type: 'saveCaseBugList',
+        payload: newBugList,
+      });
     },
     //todo:获取bug详情
     * getBugInfo({ payload }, { call, put }) {
-      const {item} = payload;
+      const { item } = payload;
       let bugInfo = yield call(getBugInfo, item);
       return bugInfo;
     },
+    //todo:保存bug
+    * createCaseBug({ payload }, { call, put }) {
+      let res = yield call(createReportCommon, payload);
+      //res拿到报告id,组装生成report对象
+      let report = { id: res.id };
+      for (let key of payload.keys()) {
+        report[key] = payload.get(key);
+      }
+      yield put({
+        type: 'saveReportCommonInfo',
+        payload: report,
+      });
+      yield put({
+        type: 'saveCurrentStep',
+        payload: 'detail',
+      });
+    },
   },
   reducers: {
     saveCurrentStep(state, { payload }) {
@@ -132,6 +179,9 @@ const Model = {
     saveCaseBugList(state, { payload }) {
       return { ...state, caseBugList: payload };
     },
+    saveCategories(state, { payload }) {
+      return { ...state, categories: payload };
+    },
   },
 };
 export default Model;

+ 25 - 5
src/pages/edit/service.js

@@ -8,15 +8,20 @@ export async function fakeSubmitForm(params) {
 }
 
 //todo:获取操作系统的类型
-export async function getOsType(id) {
-  return request('/api/extra/getExam', {
+export async function getExamInfo(id) {
+  return request(`/api/extra/getExam?id=${id}`, {
+    method: 'get',
+  });
+}
+
+//todo:获取报告信息
+export async function getReportInfo(case_take_id,worker_id) {
+  return request(`/api/extra/findByWorker?case_take_id=${case_take_id}&worker_id=${worker_id}`, {
     method: 'get',
-    params: {
-      id,
-    },
   });
 }
 
+
 //todo:点击下一步,提交测试报告的基础信息
 export async function createReportCommon(data) {
   return request('/api/extra/uploadReport', {
@@ -65,3 +70,18 @@ export async function getBugInfo(bugId) {
     method: 'get',
   });
 }
+
+//todo:返回bug推荐列表
+export async function getCategoriesInfo(case_take_id) {
+  return request(`/api/rec/getList?case_take_id=${case_take_id}`, {
+    method: 'get',
+  });
+}
+
+//todo:创建bug
+export async function createCaseBug(data) {
+  return request('/api/upload/submit', {
+    method: 'post',
+    data,
+  });
+}