Explorar el Código

Merge branch 'master' of www.gitinn.com:zaixianjiaoyu/sourcecode

KaysonCui hace 5 años
padre
commit
d97c0903dc
Se han modificado 20 ficheros con 229 adiciones y 83 borrados
  1. 60 9
      front/project/admin/routes/ready/read/page.js
  2. 5 5
      front/project/admin/routes/show/message/page.js
  3. 3 3
      front/project/admin/routes/user/abnormal/page.js
  4. 9 4
      front/project/h5/routes/textbook/main/page.js
  5. 2 2
      front/project/www/routes/my/main/page.js
  6. 2 1
      front/project/www/routes/page/index.js
  7. 45 26
      front/project/www/routes/page/ready/page.js
  8. 4 0
      front/project/www/stores/user.js
  9. 35 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/ReadyRead.java
  10. 2 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ReadyReadMapper.xml
  11. 1 1
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserOrderRelationMapper.xml
  12. 9 7
      server/data/src/main/resources/db/migration/V1__init_table.sql
  13. 1 1
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserController.java
  14. 12 14
      server/gateway-api/src/main/java/com/qxgmat/controller/api/AuthController.java
  15. 1 6
      server/gateway-api/src/main/java/com/qxgmat/controller/api/TextbookController.java
  16. 12 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserExtendDto.java
  17. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/ReadyReadDto.java
  18. 14 2
      server/gateway-api/src/main/java/com/qxgmat/service/UsersService.java
  19. 1 1
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserAbnormalService.java
  20. 1 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCourseService.java

+ 60 - 9
front/project/admin/routes/ready/read/page.js

@@ -1,5 +1,5 @@
 import React from 'react';
-import { Link } from 'react-router-dom';
+// import { Link } from 'react-router-dom';
 import { Button, Switch, Modal } from 'antd';
 import './index.less';
 import Page from '@src/containers/Page';
@@ -9,7 +9,7 @@ import EditTableCell from '@src/components/EditTableCell';
 import ActionLayout from '@src/layouts/ActionLayout';
 import TableLayout from '@src/layouts/TableLayout';
 import { formatDate, getMap } from '@src/services/Tools';
-import { asyncSMessage, asyncDelConfirm } from '@src/services/AsyncTools';
+import { asyncSMessage, asyncDelConfirm, asyncForm } from '@src/services/AsyncTools';
 // import { SwitchSelect } from '../../../../Constant';
 import { Ready } from '../../../stores/ready';
 
@@ -20,9 +20,9 @@ export default class extends Page {
       key: 'add',
       type: 'primary',
       name: '创建',
-      render: (item) => {
-        return <Link to='/ready/read/detail'><Button>{item.name}</Button></Link>;
-      },
+      // render: (item) => {
+      //   return <Link to='/ready/read/detail'><Button>{item.name}</Button></Link>;
+      // },
     }, {
       key: 'struct',
       name: '管理板块',
@@ -47,7 +47,9 @@ export default class extends Page {
       dataIndex: 'handler',
       render: (text, record) => {
         return <div className="table-button">
-          {<Link to={`/ready/read/detail/${record.id}`}>编辑</Link>}
+          {<a onClick={() => {
+            this.editAction(record);
+          }}>编辑</a>}
           {<a onClick={() => {
             this.deleteAction(record);
           }}>删除</a>}
@@ -55,6 +57,27 @@ export default class extends Page {
       },
     }];
 
+    this.itemList = [{
+      key: 'id',
+      type: 'hidden',
+    }, {
+      key: 'plate',
+      type: 'select',
+      name: '板块',
+      select: [],
+      required: true,
+    }, {
+      key: 'title',
+      type: 'input',
+      name: '标题',
+      required: true,
+    }, {
+      key: 'link',
+      type: 'input',
+      name: '链接',
+      required: true,
+    }];
+
     this.structColumns = [{
       title: '板块名称',
       dataIndex: 'plate',
@@ -81,10 +104,10 @@ export default class extends Page {
       },
     }, {
       title: '按钮名称',
-      dataIndex: 'title',
+      dataIndex: 'text',
       render: (text, record, index) => {
         return <EditTableCell value={text} onChange={(v) => {
-          this.changeStruct(index, 'title', v);
+          this.changeStruct(index, 'text', v);
         }} />;
       },
     }];
@@ -103,7 +126,11 @@ export default class extends Page {
 
   refreshStruct(result) {
     result = result || {};
-    result.plates = (result.plates || []).map((row, index) => { row.value = index + 1; return row; });
+    result.plates = (result.plates || []).map((row, index) => {
+      row.title = row.plate;
+      row.value = `${index + 1}`;
+      return row;
+    });
     this.structMap = getMap(result.plates, 'value', 'plate');
     this.setState({ struct: result });
   }
@@ -135,6 +162,30 @@ export default class extends Page {
     });
   }
 
+  addAction() {
+    this.itemList[1].select = this.state.struct.plates;
+    asyncForm('创建', this.itemList, {}, data => {
+      return Ready.addRead(data).then(() => {
+        asyncSMessage('添加成功!');
+        this.refresh();
+      });
+    }).then(component => {
+      this.formF = component;
+    });
+  }
+
+  editAction(row) {
+    this.itemList[1].select = this.state.struct.plates;
+    asyncForm('编辑', this.itemList, row, data => {
+      return Ready.editRead(data).then(() => {
+        asyncSMessage('编辑成功!');
+        this.refresh();
+      });
+    }).then(component => {
+      this.formF = component;
+    });
+  }
+
   deleteAction(row) {
     asyncDelConfirm('删除确认', '是否删除选中?', () => {
       const handler = Ready.delRead({ id: row.id });

+ 5 - 5
front/project/admin/routes/show/message/page.js

@@ -157,7 +157,7 @@ export default class extends Page {
   }
 
   initData() {
-    this.refreshTab(this.state.search.tab || 'inside');
+    this.refreshTab(this.state.search.tab || 'custom');
   }
 
   refreshTab(tab) {
@@ -271,15 +271,15 @@ export default class extends Page {
       <Tabs activeKey={tab || 'inside'} onChange={(value) => {
         this.search({ tab: value });
       }}>
-        <Tabs.TabPane tab="模版消息" key="inside">
+        {/* <Tabs.TabPane tab="模版消息" key="inside">
           {this.renderInside()}
-        </Tabs.TabPane>
+        </Tabs.TabPane> */}
         <Tabs.TabPane tab="自定义消息" key="custom">
           {this.renderCustom()}
         </Tabs.TabPane>
-        <Tabs.TabPane tab="邮件模版" key="email">
+        {/* <Tabs.TabPane tab="邮件模版" key="email">
           {this.renderEmail()}
-        </Tabs.TabPane>
+        </Tabs.TabPane> */}
       </Tabs>
     </div>;
   }

+ 3 - 3
front/project/admin/routes/user/abnormal/page.js

@@ -72,9 +72,9 @@ export default class extends Page {
       dataIndex: 'handler',
       render: (text, record) => {
         return <div className="table-button">
-          {record.isIgnore && '已忽略'}
-          {record.isAlert && '已警告'}
-          {record.isAlert && record.user.isFrozen && (
+          {!!record.isIgnore && '已忽略'}
+          {!!record.isAlert && '已警告'}
+          {!!record.isAlert && !!record.user.isFrozen && (
             <a onClick={() => {
               this.noFrozenAction(record);
             }}>取消封禁</a>

+ 9 - 4
front/project/h5/routes/textbook/main/page.js

@@ -33,6 +33,12 @@ export default class extends Page {
   refreshTab(tab) {
     this.setState({ tab });
     Textbook.allHistory(tab.key).then(result => {
+      result = result.map(row => {
+        row.version = row[`${tab.key}Version`];
+        row.content = row[`${tab.key}Content`];
+        row.createTime = formatDate(row.createTime, 'YYYY-MM-DD HH:mm:ss');
+        return row;
+      });
       this.setState({ list: result });
     });
   }
@@ -43,13 +49,12 @@ export default class extends Page {
       <div>
         <div className="tip">最近换库时间:{latest.startDate ? formatDate(latest.startDate, 'YYYY-MM-DD') : ''},已换库{day}天。</div>
         <Tabs page={tab.key} tabs={TextbookSubjectTabs} onChange={(v) => {
-          linkTo('/textbook/detail');
           this.refreshTab(v);
         }} />
         <div>{hasService ? this.renderList() : this.renderEmpty()}</div>
         <div className="fixed">
           <Button block disabled={!hasService} size="lager" onClick={() => {
-            linkTo('/textbook/detail');
+            linkTo(`/textbook/detail/${tab.key}`);
           }}>
             查阅机经
           </Button>
@@ -66,9 +71,9 @@ export default class extends Page {
         {list.map(row => {
           return <div className="item">
             <div className="title">
-              版本{row.version}<span className="date">{row.createTime && formatDate(row.createTime)}</span>
+              版本{row.version}<span className="date">{row.createTime}</span>
             </div>
-            <div className="desc" dangerouslySetInnerHTML={{ __html: row.content }} />
+            <div className="desc" >{row.content}</div>
           </div>;
         })}
 

+ 2 - 2
front/project/www/routes/my/main/page.js

@@ -646,7 +646,7 @@ export default class extends Page {
     return !info.vip && <div className="vip-layout">
       <div className="body">
         <div className='m-b-1'>
-        开通 <Assets className="m-r-5" name="VIP" />解锁海量权限
+          开通 <Assets className="m-r-5" name="VIP" />解锁海量权限
         </div>
         <div className='t d-i-b m-r-2 t-1 t-s-12'><Icon className='t-4' type='check' /> 自由组卷</div>
         <div className='t d-i-b m-r-2 t-1 t-s-12'><Icon className='t-4' type='check' /> 导出笔记</div>
@@ -674,7 +674,7 @@ export default class extends Page {
     return (
       number > 0 && (
         <div className="message-layout">
-          <div className="header">
+          <div className="header c-p">
             <Assets
               name="all"
               onCancel={() => {

+ 2 - 1
front/project/www/routes/page/index.js

@@ -1,5 +1,6 @@
 import home from './home';
 import login from './login';
+import id from './id';
 import order from './order';
 import cart from './cart';
 import demo from './demo';
@@ -7,4 +8,4 @@ import contract from './contract';
 import ready from './ready';
 import exportDetail from './export';
 
-export default [home, login, order, cart, demo, contract, ready, exportDetail];
+export default [home, login, id, order, cart, demo, contract, ready, exportDetail];

+ 45 - 26
front/project/www/routes/page/ready/page.js

@@ -1,6 +1,6 @@
 import React from 'react';
 import './index.less';
-import { Link } from 'react-router-dom';
+// import { Link } from 'react-router-dom';
 import { Anchor, Icon } from 'antd';
 import Assets from '@src/components/Assets';
 import Page from '@src/containers/Page';
@@ -8,7 +8,7 @@ import Select from '../../../components/Select';
 import Button from '../../../components/Button';
 import QAList from '../../../components/QAList';
 import Tabs from '../../../components/Tabs';
-import { SuppleModal, SuppleFinishModal } from '../../../components/OtherModal';
+import { SuppleModal, SuppleFinishModal, FaqModal, FinishModal } from '../../../components/OtherModal';
 import { Main } from '../../../stores/main';
 import { User } from '../../../stores/user';
 import { getMap, formatTreeData } from '../../../../../src/services/Tools';
@@ -18,6 +18,8 @@ export default class extends Page {
     this.areaMap = {};
     this.categoryMap = {};
     this.loadArticleMap = {};
+    this.readPlateMap = {};
+    this.loadReadMap = {};
     this.dataList = null;
     return {
       readTab: '1',
@@ -144,7 +146,13 @@ export default class extends Page {
         });
         this.categoryMap = getMap(result.category, 'id');
         const list = formatTreeData(result.category, 'id', 'title', 'parentId');
-        this.setState({ list });
+        const readPlates = result.read.plates.map((row, index) => {
+          row.title = row.plate;
+          row.key = `${index + 1}`;
+          return row;
+        });
+        this.readPlateMap = getMap(readPlates, 'key');
+        this.setState({ list, readPlates });
         this.changePage(list[0].id);
       });
   }
@@ -205,18 +213,6 @@ export default class extends Page {
     }
   }
 
-  refreshRead() {
-    if (!this.readList) {
-      Main.listRead({ page: 1, size: 1000, plate: 'getready' })
-        .then(result => {
-          this.readList = result.list;
-          this.setState({ reads: this.readList });
-        });
-    } else {
-      this.setState({ reads: this.readList });
-    }
-  }
-
   refreshFaq() {
     if (!this.faqList) {
       Main.listFaq({ page: 1, size: 1000, channel: 'getready' })
@@ -297,8 +293,25 @@ export default class extends Page {
     this.setState({ current: key });
   }
 
+  refreshRead() {
+    // init
+    const { readPlates } = this.state;
+    this.onChangeReadTab(readPlates[0].key);
+  }
+
   onChangeReadTab(key) {
-    this.setState({ readTab: key });
+    const plate = this.readPlateMap[key];
+    this.setState({ readTab: key, plate, reads: [] });
+    if (!this.loadReadMap[key]) {
+      Main.listRead({ page: 1, size: 100, plate: key })
+        .then(result => {
+          this.loadReadMap[key] = result.list;
+          this.setState({ reads: result.list });
+        });
+    } else {
+      const list = this.loadReadMap[key];
+      this.setState({ reads: list });
+    }
   }
 
   renderView() {
@@ -350,7 +363,7 @@ export default class extends Page {
             {!!detail.isFaq && this.renderFaq()}
           </div>
         </div>
-      </div >
+      </div>
     );
   }
 
@@ -415,7 +428,8 @@ export default class extends Page {
   }
 
   renderRead() {
-    const { readTab, reads = [] } = this.state;
+    const { readTab, reads = [], readPlates, plate = {} } = this.state;
+    console.log(plate);
     return <div className='read-layout'>
       <Tabs
         className='m-b-2'
@@ -423,26 +437,31 @@ export default class extends Page {
         theme="gray"
         space={2.5}
         active={readTab}
-        tabs={[{ title: '单项攻略', key: '1' }, { title: '模考&PACE', key: '2' }, { title: '换库&机经', key: '3' }, { title: '经验分享', key: '4' }, { title: '申请相关', key: '5' }]}
+        tabs={readPlates}
         onChange={key => this.onChangeReadTab(key)}
       />
-      <div className='m-b-2'>
-        <Button className='m-r-1'>CAT模考 ></Button>
-        <Button>非CAT模考 ></Button>
-      </div>
+      {!!plate.jump && <div className='m-b-2'>
+        <Button className='m-r-1' onClick={() => openLink(plate.link)}>{plate.text}</Button>
+      </div>}
       {reads.map((item) => {
         return <div className='m-b-5'>
-          <Link to={item.path}>{item.title}</Link>
+          <a href={item.link || ''} target="_blank">{item.title}</a>
         </div>;
       })}
     </div>;
   }
 
   renderFaq() {
-    const { faqs = [] } = this.state;
+    const { faqs = [], showFaq, showFinish, faq = {} } = this.state;
     return <div className='faq-layout'>
-      <Button>我要提问 ></Button>
+      <Button onClick={() => this.setState({ showFaq: true, faq: { channel: 'getready' } })}>我要提问 ></Button>
       <QAList data={faqs} />
+
+      <FaqModal show={showFaq} defaultData={faq} onCancel={() => this.setState({ showFaq: false, faq: {} })} onConfirm={() => this.setState({ showFaq: false, faq: {}, showFinish: true })} />
+      <FinishModal
+        show={showFinish}
+        onConfirm={() => this.setState({ showFinish: false })}
+      />
     </div>;
   }
 }

+ 4 - 0
front/project/www/stores/user.js

@@ -94,6 +94,10 @@ export default class UserStore extends BaseStore {
         if (this.adminLogin) {
           window.location.href = window.location.href.replace(`token=${this.adminLogin}`, '').replace('&&', '&');
         }
+      }).catch(() => {
+        if (this.adminLogin) {
+          window.location.href = window.location.href.replace(`token=${this.adminLogin}`, '').replace('&&', '&');
+        }
       });
     }
   }

+ 35 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/ReadyRead.java

@@ -23,6 +23,12 @@ public class ReadyRead implements Serializable {
     @Column(name = "`title`")
     private String title;
 
+    /**
+     * 链接
+     */
+    @Column(name = "`link`")
+    private String link;
+
     @Column(name = "`create_time`")
     private Date createTime;
 
@@ -88,6 +94,24 @@ public class ReadyRead implements Serializable {
     }
 
     /**
+     * 获取链接
+     *
+     * @return link - 链接
+     */
+    public String getLink() {
+        return link;
+    }
+
+    /**
+     * 设置链接
+     *
+     * @param link 链接
+     */
+    public void setLink(String link) {
+        this.link = link;
+    }
+
+    /**
      * @return create_time
      */
     public Date getCreateTime() {
@@ -142,6 +166,7 @@ public class ReadyRead implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", plate=").append(plate);
         sb.append(", title=").append(title);
+        sb.append(", link=").append(link);
         sb.append(", createTime=").append(createTime);
         sb.append(", updateTime=").append(updateTime);
         sb.append(", content=").append(content);
@@ -189,6 +214,16 @@ public class ReadyRead implements Serializable {
         }
 
         /**
+         * 设置链接
+         *
+         * @param link 链接
+         */
+        public Builder link(String link) {
+            obj.setLink(link);
+            return this;
+        }
+
+        /**
          * @param createTime
          */
         public Builder createTime(Date createTime) {

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

@@ -8,6 +8,7 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="plate" jdbcType="VARCHAR" property="plate" />
     <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="link" jdbcType="VARCHAR" property="link" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
   </resultMap>
@@ -21,7 +22,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `plate`, `title`, `create_time`, `update_time`
+    `id`, `plate`, `title`, `link`, `create_time`, `update_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--

+ 1 - 1
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserOrderRelationMapper.xml

@@ -19,7 +19,7 @@
     select
     <include refid="Id_Column_List" />
     from `user_order` uo
-    where (uo.is_speed = 0 or (uo.is_speed = 1 and uo.pay_status>1)
+    where (uo.is_speed = 0 or (uo.is_speed = 1 and uo.pay_status>0))
     <if test="userId != null">
       and uo.`user_id` = #{userId,jdbcType=VARCHAR}
     </if>

+ 9 - 7
server/data/src/main/resources/db/migration/V1__init_table.sql

@@ -44,7 +44,9 @@ CREATE TABLE contract (
 INSERT INTO contract (id, `key`, title, content, create_time, update_time)
 VALUES
 	(1,'register','千行注册协议',NULL,NULL,'2019-09-03 01:08:57'),
-	(2,'course','千行课程协议',NULL,NULL,NULL);
+	(2,'course','千行课程协议',NULL,NULL,NULL),
+	(3,'privacy','隐私协议',NULL,NULL,NULL),
+	(4,'legal','法律申明',NULL,NULL,NULL);
 
 CREATE TABLE course (
   id int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -257,8 +259,7 @@ VALUES
 	(2,'非难度适应性','',0,0,1,0,0,'base',NULL),
 	(3,'千行CAT','',1,0,2,2,0,'qx_cat',NULL),
 	(4,'净化版PREP-CAT','',1,0,2,1,0,NULL,NULL),
-	(5,'GWD-CAT','',1,0,2,1,0,NULL,NULL),
-	(6,'净化版PREP-CAT','',1,0,2,0,0,'cat','净化版PREP-CAT');
+	(5,'GWD-CAT','',1,0,2,1,0,NULL,NULL);
 
 CREATE TABLE exercise_paper (
   id int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -629,6 +630,7 @@ CREATE TABLE ready_read (
   plate varchar(255) NOT NULL DEFAULT '' COMMENT '板块',
   title varchar(255) NOT NULL DEFAULT '' COMMENT '标题',
   content text COMMENT '内容',
+  link varchar(255) NOT NULL DEFAULT '' COMMENT '链接',
   create_time datetime DEFAULT NULL,
   update_time datetime DEFAULT NULL,
   PRIMARY KEY (id),
@@ -891,7 +893,7 @@ VALUES
 	(70,'2019-07-06','2019-07-15','',0,NULL,'',0,NULL,'',0,NULL,0,0,NULL,NULL),
 	(71,'2019-07-15','2019-07-25','',0,NULL,'',0,NULL,'',0,NULL,0,0,NULL,NULL),
 	(72,'2019-07-25','2019-08-03','',0,NULL,'',0,NULL,'',0,NULL,0,0,NULL,NULL),
-	(73,'2019-08-03',NULL,'',2,'2019-08-28 20:56:40','',0,NULL,'',0,NULL,2,1,NULL,'2019-08-28 20:56:40');
+	(73,'2019-08-03',NULL,'',0,'2019-08-28 20:56:40','',0,NULL,'',0,NULL,0,0,NULL,'2019-08-28 20:56:40');
 
 CREATE TABLE textbook_library_history (
   id int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -1092,7 +1094,7 @@ CREATE TABLE user_collect_experience (
   experience_id int(11) unsigned NOT NULL DEFAULT '0' COMMENT '经验id',
   create_time datetime DEFAULT NULL,
   PRIMARY KEY (id),
-  KEY user_id (user_id,expericence_id)
+  KEY user_id (user_id,experience_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户-收藏-心经';
 
 CREATE TABLE user_collect_question (
@@ -1480,7 +1482,7 @@ CREATE TABLE user_search_history (
   question_id int(11) unsigned NOT NULL DEFAULT '0' COMMENT '题目id',
   question_no_id int(11) unsigned NOT NULL DEFAULT '0' COMMENT '题目编号id',
   create_time datetime DEFAULT NULL,
-  PRIMARY KEY (`id),
+  PRIMARY KEY (id),
   KEY user_id (user_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户-搜索题目-记录';
 
@@ -1524,7 +1526,7 @@ CREATE TABLE user_textbook_enroll (
   date datetime DEFAULT NULL COMMENT '报名日期',
   create_time datetime DEFAULT NULL,
   PRIMARY KEY (id),
-  KEY user_id (user_id,month)
+  KEY user_id (user_id,date)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户-机经-报名';
 
 CREATE TABLE user_textbook_feedback (

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

@@ -1041,7 +1041,7 @@ public class UserController {
             throw new ParameterException("已处理");
         }
 
-        if (dto.getIsAlert() != null && dto.getIsAlert() > 1){
+        if (dto.getIsAlert() != null && dto.getIsAlert() > 0){
             User user = usersService.get(in.getUserId());
             usersService.edit(User.builder().id(user.getId()).totalAlert(user.getTotalAlert() + 1).build());
             messageExtendService.sendLoginAbnormal(user, in);

+ 12 - 14
server/gateway-api/src/main/java/com/qxgmat/controller/api/AuthController.java

@@ -136,15 +136,13 @@ public class AuthController {
     public Response<MyDto> directWechatPc(
             @RequestParam(required = false, defaultValue = "") String code,
             HttpSession session, HttpServletRequest request) {
-        User user = (User) shiroHelp.getLoginUser();
-        user = usersService.Oauth(user, code, "wechat_pc", true);
-        if (user.getId() != null && user.getId() > 0){
-            user = usersService.get(user.getId());
-            shiroHelp.getSession().login(shiroHelp.user(user.getArea()+":"+user.getMobile(), ""));
+        try{
+            shiroHelp.getSession().login(shiroHelp.oauth(code, "wechat_pc", true));
+        }catch (Exception e){
+            throw new ParameterException("登录失败");
         }
-        user = shiroHelp.getLoginUser();
-
-        MyDto dto = processUser(user, request);
+        User openUser = (User) shiroHelp.getLoginUser();
+        MyDto dto = processUser(openUser, request);
         return ResponseHelp.success(dto);
     }
 
@@ -157,13 +155,13 @@ public class AuthController {
             @RequestParam(required = false, defaultValue = "") String code,
             @RequestParam(required = false, defaultValue = "") boolean userInfo,
             HttpSession session, HttpServletRequest request) {
-        User user = (User) shiroHelp.getLoginUser();
-        user = usersService.Oauth(user, code, "wechat_native", userInfo);
-        if (user.getId() != null && user.getId() > 0){
-            user = usersService.get(user.getId());
-            shiroHelp.getSession().login(shiroHelp.user(user.getArea()+":"+user.getMobile(), ""));
+        try{
+            shiroHelp.getSession().login(shiroHelp.oauth(code, "wechat_native", userInfo));
+        }catch (Exception e){
+            throw new ParameterException("登录失败");
         }
-        MyDto dto = processUser(user, request);
+        User openUser = (User) shiroHelp.getLoginUser();
+        MyDto dto = processUser(openUser, request);
         return ResponseHelp.success(dto);
     }
 

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

@@ -242,12 +242,7 @@ public class TextbookController
             @RequestParam(required = false) String year,
             HttpSession session) {
         User user = (User) shiroHelp.getLoginUser();
-        Date start;
-        try {
-            start = DateFormat.getDateInstance().parse(String.format("%s-01-01", year));
-        } catch (ParseException e) {
-            throw new ParameterException("日期格式错误");
-        }
+        Date start = Tools.baseDate(String.format("%s-01-01", year));
         Date end = Tools.addYear(start, 1);
         List<TextbookLibrary> libraryList = textbookLibraryService.listByTime(start, end);
         textbookService.refreshLibraryResource(user, libraryList);

+ 12 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserExtendDto.java

@@ -3,6 +3,8 @@ package com.qxgmat.dto.admin.extend;
 import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.User;
 
+import java.util.Date;
+
 @Dto(entity = User.class)
 public class UserExtendDto {
     private Integer id;
@@ -21,6 +23,8 @@ public class UserExtendDto {
 
     private Integer isFrozen;
 
+    private Date createTime;
+
     public Integer getId() {
         return id;
     }
@@ -84,4 +88,12 @@ public class UserExtendDto {
     public void setIsFrozen(Integer isFrozen) {
         this.isFrozen = isFrozen;
     }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
 }

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

@@ -14,6 +14,8 @@ public class ReadyReadDto {
 
     private String content;
 
+    private String link;
+
     public Integer getId() {
         return id;
     }
@@ -45,4 +47,12 @@ public class ReadyReadDto {
     public void setPlate(String plate) {
         this.plate = plate;
     }
+
+    public String getLink() {
+        return link;
+    }
+
+    public void setLink(String link) {
+        this.link = link;
+    }
 }

+ 14 - 2
server/gateway-api/src/main/java/com/qxgmat/service/UsersService.java

@@ -150,8 +150,19 @@ public class UsersService extends AbstractService {
         User mm = User.builder()
                 .id(openUser != null ? openUser.getId() : null)
                 .build();
-        if (openUser ==null || openUser.getAvatar() == null || openUser.getAvatar().isEmpty()) mm.setAvatar(data.getAvatar());
-        if (openUser == null || openUser.getNickname() == null|| openUser.getNickname().isEmpty() )mm.setNickname(data.getNickName());
+        if (openUser ==null || openUser.getAvatar() == null || openUser.getAvatar().isEmpty()) {
+            mm.setAvatar(data.getAvatar());
+            if(openUser != null){
+                openUser.setAvatar(data.getAvatar());
+            }
+        }
+        if (openUser == null || openUser.getNickname() == null|| openUser.getNickname().isEmpty()){
+            mm.setNickname(data.getNickName());
+            if(openUser != null){
+                openUser.setNickname(data.getNickName());
+            }
+        }
+
         switch(platform){
             case "wechat_pc":
                 mm.setWechatOpenidPc(data.getOpenId());
@@ -168,6 +179,7 @@ public class UsersService extends AbstractService {
         if (mm.getId() != null){
             // 直接更新数据
             edit(mm);
+            return openUser;
         }
 
         return mm;

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserAbnormalService.java

@@ -71,7 +71,7 @@ public class UserAbnormalService extends AbstractService {
         example.and(
                 example.createCriteria()
                     .andEqualTo("userId", userId)
-                    .andEqualTo("ip", ip)
+                    .andEqualTo("loginIp", ip)
                     .andEqualTo("isIgnore", 1)
         );
         UserAbnormal abnormal = one(userAbnormalMapper, example);

+ 1 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCourseService.java

@@ -55,6 +55,7 @@ public class UserCourseService extends AbstractService {
     }
 
     public List<UserCourse> listByCourse(Integer userId, Collection ids){
+        if (ids == null || ids.size() == 0) return new ArrayList<>();
         Example example = new Example(UserCourse.class);
         example.and(
                 example.createCriteria()