ソースを参照

feat(server): 换库更新

Go 5 年 前
コミット
6af9247f5d

+ 7 - 6
front/project/admin/routes/show/tips/page.js

@@ -9,15 +9,16 @@ import { asyncSMessage } from '@src/services/AsyncTools';
 import { System } from '../../../stores/system';
 
 const locations = [
-  { page: '4-1/3模考-千行CAT', location: '显示第一次模考成绩', value: '4-1/3-show' },
-  { page: '4-1-1 做题结束-练习报告', location: '建议用时', value: '4-1-1-suggest' },
-  { page: '4-2-2模考-数学机经-选择习题册', location: '已更新至邮箱', value: '4-2-2-update' },
-  { page: '4-2-2模考-数学机经-选择习题册', location: '下载弹框', value: '4-2-2-download' },
-  { page: '4-2-2模考-数学机经-选择习题册', location: '邮箱处', value: '4-2-2-email' },
+  { page: '4-1/3模考-千行CAT/加入第二套', location: '显示第一次模考成绩', value: '4-1/3-show' },
+  { page: '4-3-1 做题结束-练习报告', location: '建议用时', value: '4-3-1-suggest' },
+  { page: '4-3.2模考-数学机经-最新列表页', location: '邮箱订阅', value: '4-3.2-update' },
   { page: '4-4 模考-休息', location: 'Optional Break', value: '4-4-optional' },
-  { page: '4-2-3 模考-数学机经-购买', location: '购买方式', value: '4-2-3-buy' },
   { page: '4-2-3 模考-数学机经-购买', location: '填写邮箱', value: '4-2-3-email' },
   { page: '5-1/3主页/弹框', location: '备注6', value: '5-1/3-note' },
+  { page: '5-7/1 数据-练习', location: '平均用时', value: '5-7/1-data' },
+  { page: '5-1 显示答案', location: '解释30%', value: '4-2-2-answer' },
+  { page: '5-6 数据', location: '平均用时+?号', value: '5-6-data' },
+  { page: '5-9 显示答案', location: '课程开发票', value: '5-9-invoice' },
 ];
 
 export default class extends Page {

+ 15 - 6
front/project/admin/routes/student/studyDetail/page.js

@@ -96,7 +96,7 @@ export default class extends Page {
       dataIndex: 'isFinish',
       render: (text, record) => {
         return <Checkbox checked={text > 0} onChange={(e) => {
-          this.changeAppointment(record.id, { isFinish: e.target.value ? 1 : 0 });
+          this.changeAppointment(record.id, { isFinish: e.target.checked ? 1 : 0 });
         }} />;
       },
     }, {
@@ -229,7 +229,7 @@ export default class extends Page {
 
   renderVs() {
     const { data, page } = this.state;
-    return <Block flex>
+    return <div flex>
       {data.number > page.total && <ActionLayout
         itemList={this.vsAction}
         selectedKeys={this.state.selectedKeys}
@@ -305,11 +305,11 @@ export default class extends Page {
           </Row>
         </Form>
       </Modal>}
-    </Block>;
+    </div>;
   }
 
   renderVideo() {
-    return <Block flex>
+    return <div flex>
       <TableLayout
         columns={this.videoColumns}
         list={this.state.list}
@@ -319,10 +319,10 @@ export default class extends Page {
         onSelect={(keys, rows) => this.tableSelect(keys, rows)}
         selectedKeys={this.state.selectedKeys}
       />
-    </Block>;
+    </div>;
   }
 
-  renderView() {
+  renderDetail() {
     switch (this.state.module) {
       case 'online':
         return [];
@@ -334,4 +334,13 @@ export default class extends Page {
         return <div />;
     }
   }
+
+  renderView() {
+    const { data = {} } = this.state;
+    const { course = {} } = data;
+    return <Block flex>
+      <h1>{course.title}{data.vsNo > 0 ? `V${data.vsNo}` : ''}{data.number > 0 ? `(${data.number}课时)` : ''}</h1>
+      {this.renderDetail()}
+    </Block>;
+  }
 }

+ 81 - 12
front/project/admin/routes/textbook/library/page.js

@@ -1,5 +1,5 @@
 import React from 'react';
-import { Button, Form, Modal, DatePicker, Input, Upload } from 'antd';
+import { Button, Form, Modal, DatePicker, Input, Upload, Checkbox, Switch } from 'antd';
 import { Link } from 'react-router-dom';
 import moment from 'moment';
 import './index.less';
@@ -13,6 +13,7 @@ import { asyncDelConfirm, asyncSMessage } from '@src/services/AsyncTools';
 // import { TextbookType } from '../../../../Constant';
 import { Textbook } from '../../../stores/textbook';
 import { System } from '../../../stores/system';
+import { formatDate } from '../../../../../src/services/Tools';
 // import { Question } from '../../../stores/question';
 // import { Slient } from '../../../stores/slient';
 
@@ -31,9 +32,15 @@ export default class extends Page {
     this.columns = [{
       title: '库头',
       dataIndex: 'startDate',
+      render: (text) => {
+        return formatDate(text, 'YYYY-MM-DD');
+      },
     }, {
       title: '库尾',
       dataIndex: 'endDate',
+      render: (text) => {
+        return text ? formatDate(text, 'YYYY-MM-DD') : '-';
+      },
     }, {
       title: '发布次数',
       dataIndex: 'historyNumber',
@@ -43,6 +50,14 @@ export default class extends Page {
         }}>{text}</a> : 0;
       },
     }, {
+      title: '开放问答',
+      dataIndex: 'questionStatus',
+      render: (text, record) => {
+        return <Checkbox checked={text > 0} onChange={(e) => {
+          this.changeLibrary(record.id, { questionStatus: e.target.checked ? 1 : 0 });
+        }} />;
+      },
+    }, {
       title: '操作',
       dataIndex: 'handler',
       render: (text, record) => {
@@ -106,9 +121,16 @@ export default class extends Page {
     });
   }
 
+  changeLibrary(id, data) {
+    data.id = id;
+    return Textbook.editLibrary(data).then(() => {
+      this.refresh();
+    });
+  }
+
   renderView() {
     const { getFieldDecorator, setFieldsValue, getFieldValue } = this.props.form;
-
+    const { postSwitch = {} } = this.state;
     const quant = getFieldValue('post.quant') || null;
     const ir = getFieldValue('post.ir') || null;
     const rc = getFieldValue('post.rc') || null;
@@ -134,28 +156,47 @@ export default class extends Page {
         onSelect={(keys, rows) => this.tableSelect(keys, rows)}
         selectedKeys={this.state.selectedKeys}
       />
-      {this.state.history && <Modal visible closable title='发布历史' onCancel={() => {
+      {this.state.history && <Modal visible closable title='发布历史' okButtonDisabled onCancel={() => {
         this.close(false, 'history');
       }} onOk={() => {
         this.close(false, 'history');
       }}>
         {this.state.history.map(row => {
-          return <p>{row.content}</p>;
+          const list = [];
+          if (row.quant) {
+            list.push(<p>{formatDate(row.createTime, 'YYYY-MM-DD HH:mm:ss')} - {row.quantContent}</p>);
+          }
+          if (row.ir) {
+            list.push(<p>{formatDate(row.createTime, 'YYYY-MM-DD HH:mm:ss')} - {row.irContent}</p>);
+          }
+          if (row.rc) {
+            list.push(<p>{formatDate(row.createTime, 'YYYY-MM-DD HH:mm:ss')} - {row.rcContent}</p>);
+          }
+          return list;
         })}
       </Modal>}
-      {this.state.post && <Modal visible closable title='发布机经' onCancel={() => {
+      {this.state.post && <Modal visible closable title='发布机经:请上传机经文件,并点击发布' onCancel={() => {
         this.close(false, 'post');
       }} onOk={() => {
         this.submitPost();
       }}>
         <Form>
           {getFieldDecorator('post.libraryId')}
-          <Form.Item label='请上传机经文件,并点击发布'>
-            {getFieldDecorator('post.content')(
+          <Form.Item labelCol={{ span: 4 }} wrapperCol={{ span: 15 }} label='数学机经'>
+            不更新,使用上一版本
+            <Switch checked={!postSwitch.quant} onChange={() => {
+              postSwitch.quant = !postSwitch.quant;
+              this.setState({ postSwitch });
+            }} />
+            <br />
+            {!postSwitch.quant && !!this.state.post.quantVersion && `版本:${this.state.post.quantVersion}`}
+          </Form.Item>
+          {postSwitch.quant && <Form.Item>
+            {getFieldDecorator('post.quantContent')(
               <Input.TextArea placeholder='更新日志' />,
             )}
-          </Form.Item>
-          <Form.Item labelCol={{ span: 4 }} wrapperCol={{ span: 15 }} label='数学机经'>
+          </Form.Item>}
+          {postSwitch.quant && <Form.Item>
             {getFieldDecorator('post.quant')(
               <Upload
                 listType="text"
@@ -171,8 +212,22 @@ export default class extends Page {
                 </div>}
               </Upload>,
             )}
-          </Form.Item>
+          </Form.Item>}
           <Form.Item labelCol={{ span: 4 }} wrapperCol={{ span: 15 }} label='阅读机经'>
+            不更新,使用上一版本
+            <Switch checked={!postSwitch.rc} onChange={() => {
+              postSwitch.rc = !postSwitch.rc;
+              this.setState({ postSwitch });
+            }} />
+            <br />
+            {!postSwitch.rc && !!this.state.post.rcVersion && `版本:${this.state.post.rcVersion}`}
+          </Form.Item>
+          {postSwitch.rc && <Form.Item>
+            {getFieldDecorator('post.rcContent')(
+              <Input.TextArea placeholder='更新日志' />,
+            )}
+          </Form.Item>}
+          {postSwitch.rc && <Form.Item>
             {getFieldDecorator('post.rc')(
               <Upload
                 listType="text"
@@ -188,8 +243,22 @@ export default class extends Page {
                 </div>}
               </Upload>,
             )}
-          </Form.Item>
+          </Form.Item>}
           <Form.Item labelCol={{ span: 4 }} wrapperCol={{ span: 15 }} label='逻辑机经'>
+            不更新,使用上一版本
+            <Switch checked={!postSwitch.ir} onChange={() => {
+              postSwitch.ir = !postSwitch.ir;
+              this.setState({ postSwitch });
+            }} />
+            <br />
+            {!postSwitch.ir && !!this.state.post.irVersion && `版本:${this.state.post.irVersion}`}
+          </Form.Item>
+          {postSwitch.ir && <Form.Item >
+            {getFieldDecorator('post.irContent')(
+              <Input.TextArea placeholder='更新日志' />,
+            )}
+          </Form.Item>}
+          {postSwitch.ir && <Form.Item>
             {getFieldDecorator('post.ir')(
               <Upload
                 listType="text"
@@ -205,7 +274,7 @@ export default class extends Page {
                 </div>}
               </Upload>,
             )}
-          </Form.Item>
+          </Form.Item>}
         </Form>
       </Modal>}
     </Block>;

+ 4 - 0
front/project/admin/stores/textbook.js

@@ -41,6 +41,10 @@ export default class TextbookStore extends BaseStore {
     return this.apiPost('/textbook/library/add', params);
   }
 
+  editLibrary(params) {
+    return this.apiPut('/textbook/library/edit', params);
+  }
+
   listHistory(params) {
     return this.apiGet('/textbook/library/history/list', params);
   }

+ 12 - 12
server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookLibraryHistory.java

@@ -59,8 +59,8 @@ public class TextbookLibraryHistory implements Serializable {
     /**
      * 数学更新日志
      */
-    @Column(name = "`quant_contennt`")
-    private String quantContennt;
+    @Column(name = "`quant_content`")
+    private String quantContent;
 
     /**
      * 阅读更新日志
@@ -233,19 +233,19 @@ public class TextbookLibraryHistory implements Serializable {
     /**
      * 获取数学更新日志
      *
-     * @return quant_contennt - 数学更新日志
+     * @return quant_content - 数学更新日志
      */
-    public String getQuantContennt() {
-        return quantContennt;
+    public String getQuantContent() {
+        return quantContent;
     }
 
     /**
      * 设置数学更新日志
      *
-     * @param quantContennt 数学更新日志
+     * @param quantContent 数学更新日志
      */
-    public void setQuantContennt(String quantContennt) {
-        this.quantContennt = quantContennt;
+    public void setQuantContent(String quantContent) {
+        this.quantContent = quantContent;
     }
 
     /**
@@ -299,7 +299,7 @@ public class TextbookLibraryHistory implements Serializable {
         sb.append(", ir=").append(ir);
         sb.append(", irVersion=").append(irVersion);
         sb.append(", createTime=").append(createTime);
-        sb.append(", quantContennt=").append(quantContennt);
+        sb.append(", quantContent=").append(quantContent);
         sb.append(", rcContent=").append(rcContent);
         sb.append(", irContent=").append(irContent);
         sb.append("]");
@@ -348,10 +348,10 @@ public class TextbookLibraryHistory implements Serializable {
         /**
          * 设置数学更新日志
          *
-         * @param quantContennt 数学更新日志
+         * @param quantContent 数学更新日志
          */
-        public Builder quantContennt(String quantContennt) {
-            obj.setQuantContennt(quantContennt);
+        public Builder quantContent(String quantContent) {
+            obj.setQuantContent(quantContent);
             return this;
         }
 

+ 2 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookLibraryHistoryMapper.xml

@@ -19,7 +19,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    <result column="quant_contennt" jdbcType="LONGVARCHAR" property="quantContennt" />
+    <result column="quant_content" jdbcType="LONGVARCHAR" property="quantContent" />
     <result column="rc_content" jdbcType="LONGVARCHAR" property="rcContent" />
     <result column="ir_content" jdbcType="LONGVARCHAR" property="irContent" />
   </resultMap>
@@ -34,6 +34,6 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `quant_contennt`, `rc_content`, `ir_content`
+    `quant_content`, `rc_content`, `ir_content`
   </sql>
 </mapper>

+ 1 - 1
server/data/src/main/java/com/qxgmat/data/relation/UserAskQuestionRelationMapper.java

@@ -12,7 +12,7 @@ public interface UserAskQuestionRelationMapper {
     List<UserAskQuestion> listWithUser(
             @Param("askModule") String askModule,
             @Param("questionType") String questionType,
-            @Param("module") String module,
+            @Param("questionModule") String questionModule,
             @Param("userId") Number userId,
             @Param("questionNoId") Number questionNoId,
             @Param("target") String target,

+ 10 - 1
server/gateway-api/src/main/java/com/qxgmat/controller/admin/TextbookController.java

@@ -154,13 +154,22 @@ public class TextbookController {
 
     @RequestMapping(value = "/library/add", method = RequestMethod.POST)
     @ApiOperation(value = "发布新换库信息", httpMethod = "POST")
-    public Response<Boolean> addLibrary(@RequestBody @Validated TextbookLibraryDto dto, HttpServletRequest request) {
+    public Response<Boolean> addLibrary(@RequestBody @Validated TextbookLibraryStartDto dto, HttpServletRequest request) {
         TextbookLibrary entity = Transform.dtoToEntity(dto);
         textbookService.replace(entity);
         managerLogService.log(request);
         return ResponseHelp.success(true);
     }
 
+    @RequestMapping(value = "/library/edit", method = RequestMethod.PUT)
+    @ApiOperation(value = "更新换库信息", httpMethod = "PUT")
+    public Response<Boolean> editLibrary(@RequestBody @Validated TextbookLibraryDto dto, HttpServletRequest request) {
+        TextbookLibrary entity = Transform.dtoToEntity(dto);
+        textbookLibraryService.edit(entity);
+        managerLogService.log(request);
+        return ResponseHelp.success(true);
+    }
+
     @RequestMapping(value = "/library/list", method = RequestMethod.GET)
     @ApiOperation(value = "换库表", httpMethod = "GET")
     public Response<PageMessage<TextbookLibrary>> listLibrary(

+ 15 - 5
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/TextbookLibraryDto.java

@@ -5,13 +5,23 @@ import com.qxgmat.data.dao.entity.TextbookLibrary;
 
 @Dto(entity = TextbookLibrary.class)
 public class TextbookLibraryDto {
-    private String startDate;
+    private Integer id;
 
-    public String getStartDate() {
-        return startDate;
+    private Integer questionStatus;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getQuestionStatus() {
+        return questionStatus;
     }
 
-    public void setStartDate(String startDate) {
-        this.startDate = startDate;
+    public void setQuestionStatus(Integer questionStatus) {
+        this.questionStatus = questionStatus;
     }
 }

+ 17 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/TextbookLibraryStartDto.java

@@ -0,0 +1,17 @@
+package com.qxgmat.dto.admin.request;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.TextbookLibrary;
+
+@Dto(entity = TextbookLibrary.class)
+public class TextbookLibraryStartDto {
+    private String startDate;
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+}

+ 10 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserCourseStudyRecordInfoDto.java

@@ -26,6 +26,8 @@ public class UserCourseStudyRecordInfoDto {
 
     private Integer number;
 
+    private Integer vsNo;
+
     private String source;
 
     private Integer isUsed;
@@ -149,4 +151,12 @@ public class UserCourseStudyRecordInfoDto {
     public void setNumber(Integer number) {
         this.number = number;
     }
+
+    public Integer getVsNo() {
+        return vsNo;
+    }
+
+    public void setVsNo(Integer vsNo) {
+        this.vsNo = vsNo;
+    }
 }

+ 1 - 0
server/gateway-api/src/main/java/com/qxgmat/service/extend/TextbookService.java

@@ -66,6 +66,7 @@ public class TextbookService {
         }
         return textbookLibraryService.add(entity);
     }
+
     /**
      * 添加机经题目:加入题库,关联题目,并关联机经paper
      * @param relation