瀏覽代碼

feat(front): 头部

Go 4 年之前
父節點
當前提交
88aeee01ad

+ 34 - 19
front/project/www/components/Header/index.js

@@ -5,9 +5,16 @@ import Assets from '@src/components/Assets';
 import Button from '../Button';
 import './index.less';
 import { User } from '../../stores/user';
+import { formatDate } from '../../../../src/services/Tools';
 
 function Header(props) {
   const { tabs = [], active, user } = props;
+  const { info } = user;
+  let inviteStatus = false;
+  if (info.login) {
+    const inviteDate = new Date(info.inviteLatestTime);
+    inviteStatus = (inviteDate.getTime() - new Date().getTime) > 864000000;
+  }
   return (
     <div id="header">
       <div className="body">
@@ -32,37 +39,47 @@ function Header(props) {
               overlayClassName="header-user-overlay"
               overlay={
                 <div className="list">
-                  <div className="item more">
+                  <div className={`item ${info.previewNumber > 0 ? 'more' : ''}`} onClick={() => linkTo('/my/course')}>
                     <div className="t-1">
                       <Assets name="course" svg />
                       课程
                     </div>
-                    <div className="t-s-12 nowrap">
-                      <span className="t-4">3</span> 份作业待完成
-                    </div>
+                    {info.previewNumber > 0 && <div className="t-s-12 nowrap" onClick={(e) => {
+                      e.stopPropagation();
+                      linkTo('exercise?tab=course');
+                    }}>
+                      <span className="t-4">{info.previewNumber}</span> 份作业待完成
+                    </div>}
                   </div>
-                  <div className="item more">
+                  <div className={`item ${info.textbook ? 'more' : ''}`} onClick={() => linkTo('/textbook')}>
                     <div className="t-1">
                       <Assets name="jijing" svg />
                       机经
                     </div>
-                    <div className="t-s-12 nowrap">最近更新:2019-02-20</div>
+                    {info.textbook && <div className="t-s-12 nowrap">最近更新:{formatDate(info.textbook, 'YYYY-MM-DD')}</div>}
                   </div>
-                  <div className="item more">
+                  <div className={`item ${inviteStatus ? 'more' : ''}`}>
                     <div className="t-1">
                       <Assets name="yaoqing" svg />
                       邀请好友
                     </div>
-                    <div className="t-s-12 nowrap">第 1 位好友加入</div>
+                    {inviteStatus && <div className="t-s-12 nowrap">第{info.inviteNumber}位好友加入</div>}
                   </div>
-                  <div className="item more">
+                  <div className={`item ${info.messageNumber > 0 ? 'more' : ''}`} onClick={() => linkTo('/my/message')}>
                     <div className="t-1">
-                      <Assets name="message" svg />
+                      <Assets name="massage" svg />
                       消息
                     </div>
-                    <div className="t-s-12 nowrap">到期提醒: 内容前6个字…</div>
+                    {info.messageNumber > 0 && <div className="t-s-12 nowrap" onClick={(e) => {
+                      e.stopPropagation();
+                      if (info.messages[0].link) {
+                        linkTo(info.messages[0].link);
+                      } else {
+                        linkTo('/my/message');
+                      }
+                    }}>{info.messages[0].title}{info.messages[1].content}</div>}
                   </div>
-                  <div className="item">
+                  <div className="item" onClick={() => User.logout()}>
                     <div className="t-1">
                       <Assets name="exit" svg />
                       退出
@@ -76,13 +93,11 @@ function Header(props) {
                 <span className="t-2 f-s-12">{user.info.nickname}</span>
               </Link>
             </Dropdown>
-          ) : (
-            <Button
-              onClick={() => {
-                User.needLogin();
-              }}
-            >
-              登录
+          ) : (<Button onClick={() => {
+            User.needLogin();
+          }}
+          >
+            登录
             </Button>
           )}
         </div>

+ 5 - 3
front/project/www/components/Header/index.less

@@ -108,6 +108,8 @@
   width: 180px;
 
   .list {
+    cursor: pointer;
+
     .item {
       line-height: 14px;
       padding: 20px;
@@ -117,18 +119,18 @@
         margin-right: 5px;
 
         path {
-          fill: #4292F0FF;
+          fill: #4292F0FF !important;
         }
       }
     }
 
     .item.more {
       line-height: 16px;
-      padding: 15px;
+      padding: 20px;
 
       .assets {
         path {
-          fill: #303139FF;
+          fill: #303139FF !important;
         }
       }
     }

+ 4 - 4
front/project/www/routes/my/course/page.js

@@ -335,7 +335,7 @@ export default class extends Page {
           <div>
             <div className="d-i-b w-3">
               <div className="t-2 t-s-14">听课频率</div>
-              <div className="t-4 t-s-18">{data.currentNo ? data.totalDays / data.currentNo : 0}天/课时</div>
+              <div className="t-4 t-s-18">{data.currentNo ? parseInt(data.totalDays / data.currentNo, 10) : 0}天/课时</div>
             </div>
             <div className="d-i-b w-3">
               <div className="t-2 t-s-14">作业完成度</div>
@@ -1277,7 +1277,7 @@ class CourseVs extends Component {
             <div className="item">
               <GIcon name="time-block" active noHover />
               <div className="text">
-                <span>{data.appointments.length > 0 ? data.totalDays / data.appointments.length : 0}</span>/课时
+                <span>{data.appointments.length > 0 ? parseInt(data.totalDays / data.appointments.length, 10) : 0}</span>/课时
               </div>
             </div>
           </div>
@@ -1397,7 +1397,7 @@ class CourseVs extends Component {
             <div className="item">
               <GIcon name="time-block" active noHover />
               <div className="text">
-                <span>{data.appointments.length > 0 ? data.totalDays / data.appointments.length : 0}</span>/课时
+                <span>{data.appointments.length > 0 ? parseInt(data.totalDays / data.appointments.length, 10) : 0}</span>/课时
               </div>
             </div>
           </div>
@@ -1474,7 +1474,7 @@ class CourseVs extends Component {
             <div className="item">
               <GIcon name="time-block" active noHover />
               <div className="text">
-                <span>{data.appointments.length > 0 ? data.totalDays / data.appointments.length : 0}</span>/课时
+                <span>{data.appointments.length > 0 ? parseInt(data.totalDays / data.appointments.length, 10) : 0}</span>/课时
               </div>
             </div>
           </div>

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

@@ -196,6 +196,12 @@ public class User implements Serializable {
     private Integer inviteNumber;
 
     /**
+     * 最后邀请人时间
+     */
+    @Column(name = "`invite_latest_time`")
+    private Date inviteLatestTime;
+
+    /**
      * 半价机经券
      */
     @Column(name = "`textbook_half`")
@@ -865,6 +871,24 @@ public class User implements Serializable {
     }
 
     /**
+     * 获取最后邀请人时间
+     *
+     * @return invite_latest_time - 最后邀请人时间
+     */
+    public Date getInviteLatestTime() {
+        return inviteLatestTime;
+    }
+
+    /**
+     * 设置最后邀请人时间
+     *
+     * @param inviteLatestTime 最后邀请人时间
+     */
+    public void setInviteLatestTime(Date inviteLatestTime) {
+        this.inviteLatestTime = inviteLatestTime;
+    }
+
+    /**
      * 获取半价机经券
      *
      * @return textbook_half - 半价机经券
@@ -1204,6 +1228,7 @@ public class User implements Serializable {
         sb.append(", inviteCode=").append(inviteCode);
         sb.append(", totalMoney=").append(totalMoney);
         sb.append(", inviteNumber=").append(inviteNumber);
+        sb.append(", inviteLatestTime=").append(inviteLatestTime);
         sb.append(", textbookHalf=").append(textbookHalf);
         sb.append(", qxCat=").append(qxCat);
         sb.append(", registerIp=").append(registerIp);
@@ -1553,6 +1578,16 @@ public class User implements Serializable {
         }
 
         /**
+         * 设置最后邀请人时间
+         *
+         * @param inviteLatestTime 最后邀请人时间
+         */
+        public Builder inviteLatestTime(Date inviteLatestTime) {
+            obj.setInviteLatestTime(inviteLatestTime);
+            return this;
+        }
+
+        /**
          * 设置半价机经券
          *
          * @param textbookHalf 半价机经券

+ 5 - 4
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserMapper.xml

@@ -37,6 +37,7 @@
     <result column="invite_code" jdbcType="VARCHAR" property="inviteCode" />
     <result column="total_money" jdbcType="DECIMAL" property="totalMoney" />
     <result column="invite_number" jdbcType="INTEGER" property="inviteNumber" />
+    <result column="invite_latest_time" jdbcType="TIMESTAMP" property="inviteLatestTime" />
     <result column="textbook_half" jdbcType="INTEGER" property="textbookHalf" />
     <result column="qx_cat" jdbcType="INTEGER" property="qxCat" />
     <result column="register_ip" jdbcType="VARCHAR" property="registerIp" />
@@ -65,9 +66,9 @@
     `real_photo_front`, `real_photo_back`, `real_status`, `prepare_time`, `prepare_status`, 
     `prepare_goal`, `prepare_examination_time`, `prepare_score_time`, `latest_exercise`, 
     `latest_error`, `latest_collect`, `origin_id`, `invite_code`, `total_money`, `invite_number`, 
-    `textbook_half`, `qx_cat`, `register_ip`, `register_city`, `latest_login_ip`, `latest_login_time`, 
-    `is_frozen`, `create_time`, `data_email_subscribe`, `textbook_email_subscribe`, `total_alert`, 
-    `export_question_error_number`, `export_question_note_number`, `export_tips`, `textbook_tips`, 
-    `export_course_note_number`, `is_course`
+    `invite_latest_time`, `textbook_half`, `qx_cat`, `register_ip`, `register_city`, 
+    `latest_login_ip`, `latest_login_time`, `is_frozen`, `create_time`, `data_email_subscribe`, 
+    `textbook_email_subscribe`, `total_alert`, `export_question_error_number`, `export_question_note_number`, 
+    `export_tips`, `textbook_tips`, `export_course_note_number`, `is_course`
   </sql>
 </mapper>

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

@@ -23,6 +23,8 @@ public class MyDto extends UserDto {
 
     private Integer inviteNumber;
 
+    private Date inviteLatestTime;
+
     private Boolean bindWechat;
 
     private Boolean bindReal;
@@ -210,4 +212,12 @@ public class MyDto extends UserDto {
     public void setExportTips(Integer exportTips) {
         this.exportTips = exportTips;
     }
+
+    public Date getInviteLatestTime() {
+        return inviteLatestTime;
+    }
+
+    public void setInviteLatestTime(Date inviteLatestTime) {
+        this.inviteLatestTime = inviteLatestTime;
+    }
 }

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

@@ -205,7 +205,7 @@ public class UsersService extends AbstractService {
             if (inviteCode != null && !inviteCode.isEmpty()){
                 User origin = getByInviteCode(inviteCode);
                 user.setOriginId(origin.getId());
-                edit(User.builder().id(origin.getId()).inviteNumber(origin.getInviteNumber() + 1).build());
+                edit(User.builder().id(origin.getId()).inviteNumber(origin.getInviteNumber() + 1).inviteLatestTime(new Date()).build());
                 // 邀请奖励
                 orderFlowService.giveInvite(origin);
             }