فهرست منبع

Merge branch 'dev' of ssh://10.10.100.21/source/smartschool-platform into dev

guq 6 سال پیش
والد
کامیت
6a3e9571d5
59فایلهای تغییر یافته به همراه961 افزوده شده و 502 حذف شده
  1. 1 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/OaLeaveDO.java
  2. 19 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/controller/WxUserController.java
  3. 10 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/WxUserService.java
  4. 13 3
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxMeetingServiceImpl.java
  5. 4 2
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxNotifyServiceImpl.java
  6. 15 11
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxOaLeaveServiceImpl.java
  7. 17 5
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxOutInRecordServiceImpl.java
  8. 28 23
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxTaskNotifyServiceImpl.java
  9. 49 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxUserServiceImpl.java
  10. 6 4
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxVoteServiceImpl.java
  11. 2 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/support/RemindTask.java
  12. 55 0
      frontend/pc-web/app/model/basic/StudentParents.js
  13. 30 6
      frontend/pc-web/app/view/Interaction/homework/Release.js
  14. 20 0
      frontend/pc-web/app/view/Interaction/notice/SchoolNotice.js
  15. 7 7
      frontend/pc-web/app/view/basic/class/ClassDetail.js
  16. 13 0
      frontend/pc-web/app/view/basic/class/ClassDetailModel.js
  17. 110 91
      frontend/pc-web/app/view/basic/class/ClassInfo.js
  18. 4 4
      frontend/pc-web/app/view/basic/staff/StaffDetail.js
  19. 19 43
      frontend/pc-web/app/view/basic/staff/StaffList.js
  20. 9 7
      frontend/pc-web/app/view/basic/student/StudentDetail.js
  21. 13 13
      frontend/pc-web/app/view/basic/student/StudentList.js
  22. 1 1
      frontend/pc-web/app/view/core/base/BasePanel.js
  23. 2 1
      frontend/pc-web/app/view/core/base/GridPanel.js
  24. 51 0
      frontend/pc-web/app/view/core/button/import/Button.js
  25. 121 115
      frontend/pc-web/app/view/core/button/import/Window.js
  26. 56 2
      frontend/pc-web/app/view/core/form/FormPanel.js
  27. 11 11
      frontend/pc-web/app/view/core/form/FormPanelController.js
  28. 7 0
      frontend/pc-web/app/view/core/form/FormPanelModel.js
  29. 20 15
      frontend/pc-web/app/view/core/form/field/DetailGridField.js
  30. 7 4
      frontend/wechat-web/src/components/HomeWorkItem.jsx
  31. 1 0
      frontend/wechat-web/src/components/TargetSelect.jsx
  32. 98 83
      frontend/wechat-web/src/configs/router.config.js
  33. 1 0
      frontend/wechat-web/src/modules/accountBind/AccountBind.jsx
  34. 10 2
      frontend/wechat-web/src/modules/accountBind/BindMenu.jsx
  35. 15 3
      frontend/wechat-web/src/modules/album/ClassAlbum.jsx
  36. 8 1
      frontend/wechat-web/src/modules/announce/AnnounceRelease.jsx
  37. 2 2
      frontend/wechat-web/src/modules/hiPages/LeaveDetail/LeaveDetail.js
  38. 2 2
      frontend/wechat-web/src/modules/hiPages/access-notice/AccessNotice.css
  39. 1 1
      frontend/wechat-web/src/modules/hiPages/access-notice/AccessNotice.js
  40. 2 2
      frontend/wechat-web/src/modules/hiPages/access-notice/ItemComp.js
  41. 1 1
      frontend/wechat-web/src/modules/hiPages/approvel-detail/ApprovelDetail.js
  42. 3 3
      frontend/wechat-web/src/modules/hiPages/approvel-detail/DetailItem.js
  43. 1 1
      frontend/wechat-web/src/modules/hiPages/approvel-detail/ItemApprovel.js
  44. 1 1
      frontend/wechat-web/src/modules/hiPages/approvel/ApprovelItem.js
  45. 1 3
      frontend/wechat-web/src/modules/hiPages/changephonenumber/ChangePhoneNumber.js
  46. 4 1
      frontend/wechat-web/src/modules/hiPages/meet-detail/MeetDetail.css
  47. 2 1
      frontend/wechat-web/src/modules/hiPages/meet-detail/MeetDetail.js
  48. 2 2
      frontend/wechat-web/src/modules/hiPages/res_apply/UserItem.js
  49. 1 1
      frontend/wechat-web/src/modules/hiPages/scorenotification/ScoreNotification.js
  50. 1 1
      frontend/wechat-web/src/modules/home/HomePage.jsx
  51. 1 1
      frontend/wechat-web/src/modules/homework/AssignmentDetailPage.js
  52. 2 2
      frontend/wechat-web/src/modules/leave/LeaveAddPage.js
  53. 2 2
      frontend/wechat-web/src/modules/leave/LeaveItem.js
  54. 23 6
      frontend/wechat-web/src/modules/notificationCenter/NotifyBoardDetail.jsx
  55. 19 1
      frontend/wechat-web/src/modules/phonesBook/PhonesSelect.jsx
  56. 18 6
      frontend/wechat-web/src/modules/vote/VoteDetailPage.js
  57. 1 0
      frontend/wechat-web/src/redux/reducers/redUserInfo.js
  58. 3 1
      frontend/wechat-web/src/style/css/meeting.css
  59. 15 2
      frontend/wechat-web/src/utils/common.js

+ 1 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/OaLeaveDO.java

@@ -29,7 +29,7 @@ public class OaLeaveDO implements Serializable {
 	//申请人
 	private Long lvProposer;
 	private String proposerName;
-	//状态 1发布   2草稿
+	//状态 1发布   0草稿
 	private Integer lvStatus;
 	//申请时间
 	private Date applyDate;

+ 19 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/controller/WxUserController.java

@@ -215,6 +215,25 @@ public class WxUserController {
 		}
 	}
 
+	/**
+	 * 修改手机号的时候获取验证码
+	 * @param userPhone
+	 * @param openid
+	 * @param schoolId
+	 * @return
+	 * @throws Exception
+	 */
+	@GetMapping("/sendCodeUpdate")
+	public ResultBean sendCodeUpdate(@Param("userPhone") String userPhone, @Param("openid")String openid, @Param("schoolId")Long schoolId){
+		try {
+			Assert.notNull(userPhone,"请填写手机号");
+			userService.sendCodeUpdate(userPhone, openid, schoolId);
+			return new ResultBean("验证码已发送");
+		} catch (Exception e) {
+			return new ResultBean(e);
+		}
+	}
+
 	/**
 	 * 修改手机号
 	 * @param userPhone

+ 10 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/WxUserService.java

@@ -49,6 +49,16 @@ public interface WxUserService {
 	 */
 	public Map<String, Object> homePage(@Param("userOpenid") String userOpenid, @Param("schoolId") Long schoolId) throws Exception;
 
+
+	/**
+	 * 修改手机号的时候获取验证码
+	 * @param userPhone
+	 * @param openid
+	 * @param schoolId
+	 * @return
+	 * @throws Exception
+	 */
+	public SendSmsResponse sendCodeUpdate(@Param("userPhone") String userPhone,@Param("openid")String openid,@Param("schoolId")Long schoolId) throws Exception;
 	/**
 	 * 获取所有老师的信息
 	 * @param schoolId

+ 13 - 3
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxMeetingServiceImpl.java

@@ -4,20 +4,21 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.usoftchina.smartschool.school.po.MeetingDO;
 import com.usoftchina.smartschool.school.po.MeetingRecordsDO;
+import com.usoftchina.smartschool.school.po.SchoolDO;
 import com.usoftchina.smartschool.school.po.TeacherDO;
+import com.usoftchina.smartschool.school.wxschool.basic.service.WxMeetingService;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxMeetingMapper;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxMeetingRecordsMapper;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxSchoolMapper;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxTeacherMapper;
-import com.usoftchina.smartschool.school.wxschool.basic.service.WxMeetingService;
 import com.usoftchina.smartschool.school.wxschool.support.RemindTask;
 import com.usoftchina.smartschool.school.wxschool.utils.DateFormatUtil;
 import com.usoftchina.smartschool.school.wxschool.utils.ObjectUtils;
-
 import com.usoftchina.smartschool.wechat.api.WxPushApi;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 
@@ -83,7 +84,16 @@ public class WxMeetingServiceImpl implements WxMeetingService {
 			Timer timer = new Timer();
 			timer.schedule(new RemindTask(teacherMapper,wxSchoolMapper,wxPushApi,meetingMapper,1,meetingDO), startDate);
 			timer.schedule(new RemindTask(teacherMapper,wxSchoolMapper,wxPushApi,meetingMapper,2,meetingDO), endDate);
-			timer.schedule(new RemindTask(teacherMapper,wxSchoolMapper,wxPushApi,meetingMapper,3,meetingDO), reminderDate);
+			if (new Date().getTime()<reminderDate.getTime()) {
+				timer.schedule(new RemindTask(teacherMapper, wxSchoolMapper, wxPushApi, meetingMapper, 3, meetingDO), reminderDate);
+			}else {
+				for (Long l:list) {
+					SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+					SchoolDO schoolDO = wxSchoolMapper.get(meetingDO.getSchoolId());
+					String openid = teacherMapper.get(l).getOpenid();
+					wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(),openid , "_hX_lGEG1W1bJmW37VBaPYQoLrRrUAlNCSScezZQQWk", "您好,您有一条新的会议通知", meetingDO.getMeetingName(), simpleDateFormat.format(meetingDO.getStartDate()), meetingDO.getMeetingAddress(), "-", "点击查看详情", "https://school-wechat.ubtob.com/meet-detail/" + meetingDO.getMeetingId()+"?teacherId="+l);
+				}
+			}
 			return "创建成功";
 		}else {
 			throw new Exception("创建失败,请核查");

+ 4 - 2
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxNotifyServiceImpl.java

@@ -94,8 +94,9 @@ public class WxNotifyServiceImpl implements WxNotifyService {
 					notifyrecordsMapper.save(notifyrecordsDO);
 					TeacherDO teacherDO = teacherMapper.get(l);
 					SchoolDO schoolDO = wxSchoolMapper.get(teacherDO.getSchoolId());
+					String teacherName = teacherMapper.get(notifyCreator).getTeacherName();
 					try {
-						wxPushApi.wxPush(schoolDO.getSchoolAppid(),schoolDO.getSchoolSecret(),teacherDO.getOpenid(), "h0BkcnTo24b2jsficMeVO0B17GvE-VzlPvF0fVXea4w", "您好,您有一条通知", schoolDO.getSchoolName(),teacherMapper.get(notifyCreator).getTeacherName(),format.format(new Date()),notifyDetails, "点击查看详情", "https://school-wechat.ubtob.com/notifyDetail/teacher/"+notifyDO.getNotifyId());
+						wxPushApi.wxPush(schoolDO.getSchoolAppid(),schoolDO.getSchoolSecret(),teacherDO.getOpenid(), "h0BkcnTo24b2jsficMeVO0B17GvE-VzlPvF0fVXea4w", "您好,您有一条通知", schoolDO.getSchoolName(),teacherName,format.format(new Date()),notifyDetails, "点击查看详情", "https://school-wechat.ubtob.com/notifyDetail/teacher/"+notifyDO.getNotifyId()+"?teacherId="+l);
 					}catch (Exception e){
 						e.printStackTrace();
 					}
@@ -115,8 +116,9 @@ public class WxNotifyServiceImpl implements WxNotifyService {
 						for (ParentsStuDO ps:parentsStuDOS) {
 							ParentsDO parentsDO = wxParentsMapper.get(ps.getParentId());
 							SchoolDO schoolDO = wxSchoolMapper.get(parentsDO.getSchoolId());
+							String teacherName = teacherMapper.get(notifyCreator).getTeacherName();
 							try {
-								wxPushApi.wxPush(schoolDO.getSchoolAppid(),schoolDO.getSchoolSecret(),parentsDO.getOpenid(), "h0BkcnTo24b2jsficMeVO0B17GvE-VzlPvF0fVXea4w", "您好,您有一条通知", schoolDO.getSchoolName(),teacherMapper.get(notifyCreator).getTeacherName(),format.format(new Date()),notifyDetails, "点击查看详情", "https://school-wechat.ubtob.com/notifyDetail/parent/"+notifyDO.getNotifyId());
+								wxPushApi.wxPush(schoolDO.getSchoolAppid(),schoolDO.getSchoolSecret(),parentsDO.getOpenid(), "h0BkcnTo24b2jsficMeVO0B17GvE-VzlPvF0fVXea4w", "您好,您有一条通知", schoolDO.getSchoolName(),teacherName,format.format(new Date()),notifyDetails, "点击查看详情", "https://school-wechat.ubtob.com/notifyDetail/parent/"+notifyDO.getNotifyId()+"?stuId="+l);
 							}catch (Exception e){
 								e.printStackTrace();
 							}

+ 15 - 11
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxOaLeaveServiceImpl.java

@@ -3,9 +3,8 @@ package com.usoftchina.smartschool.school.wxschool.basic.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.usoftchina.smartschool.school.po.*;
-import com.usoftchina.smartschool.school.wxschool.basic.service.WxSchoolService;
-import com.usoftchina.smartschool.school.wxschool.mapper.*;
 import com.usoftchina.smartschool.school.wxschool.basic.service.WxOaLeaveService;
+import com.usoftchina.smartschool.school.wxschool.mapper.*;
 import com.usoftchina.smartschool.school.wxschool.utils.DateFormatUtil;
 import com.usoftchina.smartschool.school.wxschool.utils.ObjectUtils;
 import com.usoftchina.smartschool.wechat.api.WxPushApi;
@@ -15,7 +14,6 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 
 @Service
@@ -46,13 +44,20 @@ public class WxOaLeaveServiceImpl implements WxOaLeaveService {
         JSONObject json = JSONObject.parseObject(leaveString);
         OaLeaveDO leave = new OaLeaveDO();
         leave.setLvTitle(json.getString("lvTitle"));
-        leave.setLvDetails(json.getString("lvDetails"));
+        String lvDetails = json.getString("lvDetails");
+        leave.setLvDetails(lvDetails);
         leave.setLvType(json.getInteger("lvType"));
         leave.setApplyDate(new Date());
         Long lvProposer = json.getLong("lvProposer");
         leave.setSchoolId(studentMapper.get(lvProposer).getSchoolId());
-        leave.setEndDate(DateFormatUtil.string2Date(json.getString("endDate")));
-        leave.setStartDate(DateFormatUtil.string2Date(json.getString("startDate")));
+        String endDate = json.getString("endDate");
+        if (ObjectUtils.isNotEmpty(endDate)){
+            leave.setEndDate(DateFormatUtil.string2Date(endDate));
+        }
+        String startDate = json.getString("startDate");
+        if (ObjectUtils.isNotEmpty(startDate)){
+            leave.setStartDate(DateFormatUtil.string2Date(startDate));
+        }
         leave.setLvStatus(1);
         leave.setLvRemarks(json.getString("lvRemarks"));
         String lvFiles = json.getString("lvFiles");
@@ -67,12 +72,9 @@ public class WxOaLeaveServiceImpl implements WxOaLeaveService {
                 for (Long teacherId : longs) {
                     TeacherDO teacherDO = teacherMapper.get(teacherId);
                     SchoolDO schoolDO = wxSchoolMapper.get(teacherDO.getSchoolId());
+                    String stuName = studentMapper.get(lvProposer).getStuName();
                     try {
-                        wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(), teacherDO.getOpenid(),
-                                "QC8H4hQd1Fh0wqaaE3mbAxvoBC6y-XkHctIe8Kx6gcA", "您好,您有一个来自家长的请假申请",
-                                studentMapper.get(lvProposer).getStuName(),
-                                json.getString("startDate") + "-" + json.getString("endDate"), leave.getLvDetails(), "-",
-                                "点击查看详情", "https://school-wechat.ubtob.com/leavedetail/teacher/" + leave.getLvId());
+                        wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(), teacherDO.getOpenid(), "QC8H4hQd1Fh0wqaaE3mbAxvoBC6y-XkHctIe8Kx6gcA", "您好,您有一个来自家长的请假申请",stuName,startDate + "-" + endDate, lvDetails, "", "点击查看详情", "https://school-wechat.ubtob.com/leavedetail/teacher/" + leave.getLvId());
                     }catch (Exception e){
                         e.printStackTrace();
                     }
@@ -144,6 +146,8 @@ public class WxOaLeaveServiceImpl implements WxOaLeaveService {
     public OaLeaveDO lvDetail(Long lvId) throws Exception {
         OaLeaveDO oaLeaveDO = oaLeaveMapper.get(lvId);
         if (ObjectUtils.isNotEmpty(oaLeaveDO)) {
+            oaLeaveDO.setLvStatus(2);
+            oaLeaveMapper.update(oaLeaveDO);
             return getOaLeaveDetail(oaLeaveDO);
         } else {
             throw new Exception("暂无数据");

+ 17 - 5
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxOutInRecordServiceImpl.java

@@ -3,19 +3,18 @@ package com.usoftchina.smartschool.school.wxschool.basic.service.impl;
 import com.usoftchina.smartschool.school.po.ClazzDO;
 import com.usoftchina.smartschool.school.po.OutInRecordDO;
 import com.usoftchina.smartschool.school.po.StudentDO;
+import com.usoftchina.smartschool.school.wxschool.basic.service.WxOutInRecordService;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxClazzMapper;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxGradeMapper;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxOutInRecordMapper;
-import com.usoftchina.smartschool.school.wxschool.basic.service.WxOutInRecordService;
 import com.usoftchina.smartschool.school.wxschool.mapper.WxStudentMapper;
 import com.usoftchina.smartschool.school.wxschool.utils.JavaBeanUtil;
 import com.usoftchina.smartschool.school.wxschool.utils.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 
 @Service
@@ -44,6 +43,7 @@ public class WxOutInRecordServiceImpl implements WxOutInRecordService {
 		Integer pageStart = (pageIndex-1)*pageSize;
 		Map<String, Object> map = new HashMap<>();
 		List<OutInRecordDO> outInRecordDOS = outInRecordMapper.selectOutInRecordDOListByStuId(stuId, pageStart, pageSize);
+		List<Map<String, Object>> maps = new ArrayList<>();
 		if (ObjectUtils.isNotEmpty(outInRecordDOS)){
 			Long stuId1 = outInRecordDOS.get(0).getStuId();
 			StudentDO studentDO = studentMapper.get(stuId1);
@@ -52,8 +52,20 @@ public class WxOutInRecordServiceImpl implements WxOutInRecordService {
 			map1.put("clazzName",clazzDO.getClazzName());
 			map1.put("gradeName",gradeMapper.get(clazzDO.getGradeId()).getGradeName());
 			map.put("student",map1);
+			for (OutInRecordDO oi:outInRecordDOS) {
+				Map<String, Object> toMap = JavaBeanUtil.convertBeanToMap(oi);
+				SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
+				dateFormat.setTimeZone(TimeZone.getTimeZone("GMT-6"));
+				if (ObjectUtils.isNotEmpty(oi.getInDate())) {
+					toMap.put("inDate", dateFormat.format(oi.getInDate()));
+				}
+				if (ObjectUtils.isNotEmpty(oi.getOutDate())){
+					toMap.put("outDate",dateFormat.format(oi.getOutDate()));
+				}
+				maps.add(toMap);
+			}
 		}
-		map.put("outInRecordDOS",outInRecordDOS);
+		map.put("outInRecordDOS",maps);
 		return map;
 	}
 

+ 28 - 23
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxTaskNotifyServiceImpl.java

@@ -74,34 +74,39 @@ public class WxTaskNotifyServiceImpl implements WxTaskNotifyService {
         taskNotifyDO.setStartDate(startDate);
         Date endDate = DateFormatUtil.string2Date(json.getString("endDate"));
         taskNotifyDO.setEndDate(endDate);
-        String taskNotifier = json.getString("taskNotifier");
-        taskNotifyDO.setTaskNotifier(taskNotifier);
-        int save = taskNotifyMapper.save(taskNotifyDO);
-        if (save > 0) {
-            if (ObjectUtils.isNotEmpty(taskNotifier)) {
-                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-                SchoolDO schoolDO = wxSchoolMapper.get(schoolId);
-                List<Long> longs = JSON.parseArray(taskNotifier, Long.class);
-                for (Long stuId : longs) {
-                    List<ParentsStuDO> parentsStuDOS = wxParentsStuMapper.listByStuId(stuId);
-                    if (parentsStuDOS.size() > 0) {
-                        for (ParentsStuDO ps : parentsStuDOS) {
-                            ParentsDO parentsDO = parentsMapper.get(ps.getParentId());
-                            try {
-                                wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(),
-                                        parentsDO.getOpenid(), "WwKtiHd4lso9axuavfLdpHIVbzTiopOTyh_uCsL3ZI8", taskTitle,
-                                        wxSubjectMapper.get(subjectId).getSubjectName(), format.format(new Date()),
-                                        taskContext, "-", "点击查看详情", "https://school-wechat.ubtob" +
-                                                ".com/assignmentDetail/parent/" + taskNotifyDO.getTaskId());
-                            }catch (Exception e){
-                                e.printStackTrace();
+        if (endDate.getTime()>startDate.getTime()){
+            String taskNotifier = json.getString("taskNotifier");
+            taskNotifyDO.setTaskNotifier(taskNotifier);
+            int save = taskNotifyMapper.save(taskNotifyDO);
+            if (save > 0) {
+                if (ObjectUtils.isNotEmpty(taskNotifier)) {
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+                    SchoolDO schoolDO = wxSchoolMapper.get(schoolId);
+                    List<Long> longs = JSON.parseArray(taskNotifier, Long.class);
+                    for (Long stuId : longs) {
+                        List<ParentsStuDO> parentsStuDOS = wxParentsStuMapper.listByStuId(stuId);
+                        if (parentsStuDOS.size() > 0) {
+                            for (ParentsStuDO ps : parentsStuDOS) {
+                                ParentsDO parentsDO = parentsMapper.get(ps.getParentId());
+                                String subjectName = wxSubjectMapper.get(subjectId).getSubjectName();
+                                try {
+                                    wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(),
+                                            parentsDO.getOpenid(), "WwKtiHd4lso9axuavfLdpHIVbzTiopOTyh_uCsL3ZI8", taskTitle,
+                                            subjectName, format.format(new Date()),
+                                            taskContext, "-", "点击查看详情", "https://school-wechat.ubtob" +
+                                                    ".com/assignmentDetail/parent/" + taskNotifyDO.getTaskId());
+                                }catch (Exception e){
+                                    e.printStackTrace();
+                                }
                             }
                         }
                     }
-                }
 
+                }
+                return "作业发布成功";
+        }else {
+                throw new Exception("开始时间不能小于结束时间");
             }
-            return "作业发布成功";
         } else {
             throw new Exception("作业发布失败");
         }

+ 49 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxUserServiceImpl.java

@@ -352,6 +352,55 @@ public class WxUserServiceImpl implements WxUserService {
 	}
 
 
+	/**
+	 * 修改手机号发送验证码
+	 * @param userPhone
+	 * @return
+	 */
+	public SendSmsResponse sendCodeUpdate(String userPhone,String openid,Long schoolId) throws Exception {
+		TeacherDO teacherDO = teacherMapper.getBySchoolAndOpenid(schoolId, openid);
+		ParentsDO parentsDO = parentsMapper.getBySchoolAndOpenid(schoolId, openid);
+		if (ObjectUtils.isNotEmpty(teacherDO)){
+			UserDO userDO = userMapper.get(teacherDO.getUserId());
+			if (ObjectUtils.isNotEmpty(userDO)){
+				String vcode = SendMsgUtil.createRandomVcode(CodeConfig.getCodeNumber());
+				userDO.setUserCode(vcode);
+				int update = userMapper.update(userDO);
+				if (update>0){
+					SendSmsResponse sendSmsResponse = SendCode.sendSms(userPhone, vcode);
+					Timer timer = new Timer();
+					timer.schedule(new CodeTask(userMapper,userDO.getUserId()), DateFormatUtil.long2Date(new Date().getTime()+5*60*1000));
+					return sendSmsResponse;
+				}else {
+					throw  new Exception("系统错误,请联系管理员");
+				}
+			}else {
+				throw  new Exception("该用户不存在,请联系管理员");
+			}
+		}else {
+			if (ObjectUtils.isNotEmpty(parentsDO)){
+				UserDO userDO = userMapper.get(parentsDO.getUserId());
+				if (ObjectUtils.isNotEmpty(userDO)){
+					String vcode = SendMsgUtil.createRandomVcode(CodeConfig.getCodeNumber());
+					userDO.setUserCode(vcode);
+					int update = userMapper.update(userDO);
+					if (update>0){
+						SendSmsResponse sendSmsResponse = SendCode.sendSms(userPhone, vcode);
+						Timer timer = new Timer();
+						timer.schedule(new CodeTask(userMapper,userDO.getUserId()), DateFormatUtil.long2Date(new Date().getTime()+5*60*1000));
+						return sendSmsResponse;
+					}else {
+						throw  new Exception("系统错误,请联系管理员");
+					}
+				}else {
+					throw  new Exception("该用户不存在,请联系管理员");
+				}
+			}else {
+				throw  new Exception("该用户不存在,请联系管理员");
+			}
+		}
+	}
+
 	/**
 	 * 修改手机号
 	 * @param userPhone

+ 6 - 4
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/basic/service/impl/WxVoteServiceImpl.java

@@ -103,11 +103,12 @@ public class WxVoteServiceImpl implements WxVoteService {
                     TeacherDO teacherDO = teacherMapper.get(ll);
                     SchoolDO schoolDO = wxSchoolMapper.get(teacherDO.getSchoolId());
                     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+                    String teacherName = teacherMapper.get(creator).getTeacherName();
                     try {
                         wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(), teacherDO.getOpenid(),
                                 "h0BkcnTo24b2jsficMeVO0B17GvE-VzlPvF0fVXea4w", "有一个投票单需要您的支持", schoolDO.getSchoolName(),
-                                teacherMapper.get(creator).getTeacherName(), format.format(new Date()), vote.getVoteName()
-                                , "点击查看详情", "https://school-wechat.ubtob.com/voteDetail/" + vote.getVoteId());
+                                teacherName, format.format(new Date()), vote.getVoteName()
+                                , "点击查看详情", "https://school-wechat.ubtob.com/voteDetail/" + vote.getVoteId()+"?teacherId="+ll);
                     }catch (Exception e){
                         e.printStackTrace();
                     }
@@ -120,15 +121,16 @@ public class WxVoteServiceImpl implements WxVoteService {
                 List<ParentsStuDO> parentsStuDOS = wxParentsStuMapper.listByStuId(l);
                 if (parentsStuDOS.size() > 0) {
                     for (ParentsStuDO ps : parentsStuDOS) {
+                        String teacherName = teacherMapper.get(creator).getTeacherName();
                         ParentsDO parentsDO = wxParentsMapper.get(ps.getParentId());
                         SchoolDO schoolDO = wxSchoolMapper.get(parentsDO.getSchoolId());
                         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                         try {
                             wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(), parentsDO.getOpenid()
                                     , "h0BkcnTo24b2jsficMeVO0B17GvE-VzlPvF0fVXea4w", "有一个投票单需要您的支持",
-                                    schoolDO.getSchoolName(), teacherMapper.get(creator).getTeacherName(),
+                                    schoolDO.getSchoolName(),teacherName ,
                                     format.format(new Date()), vote.getVoteName(), "点击查看详情",
-                                    "https://school-wechat.ubtob.com/voteDetail/" + vote.getVoteId());
+                                    "https://school-wechat.ubtob.com/voteDetail/" + vote.getVoteId()+"?stuId="+l);
                         }catch (Exception e){
                             e.printStackTrace();
                         }

+ 2 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/wxschool/support/RemindTask.java

@@ -56,8 +56,9 @@ public class RemindTask extends TimerTask {
         List<Long> list = removeDuplicate(longs);
         for (Long teacherId:list) {
             SchoolDO schoolDO = wxSchoolMapper.get(meetingDO.getSchoolId());
+            String openid = teacherMapper.get(teacherId).getOpenid();
             try {
-                wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(), teacherMapper.get(teacherId).getOpenid(), "_hX_lGEG1W1bJmW37VBaPYQoLrRrUAlNCSScezZQQWk", "您好,您有一条新的会议通知", meetingDO.getMeetingName(), simpleDateFormat.format(meetingDO.getStartDate()), meetingDO.getMeetingAddress(), "-", "点击查看详情", "https://school-wechat.ubtob.com/meet-detail/" +teacherId+"/"+ meetingDO.getMeetingId());
+                wxPushApi.wxPush(schoolDO.getSchoolAppid(), schoolDO.getSchoolSecret(),openid , "_hX_lGEG1W1bJmW37VBaPYQoLrRrUAlNCSScezZQQWk", "您好,您有一条新的会议通知", meetingDO.getMeetingName(), simpleDateFormat.format(meetingDO.getStartDate()), meetingDO.getMeetingAddress(), "-", "点击查看详情", "https://school-wechat.ubtob.com/meet-detail/" + meetingDO.getMeetingId()+"?teacherId="+teacherId);
             } catch (Exception e) {
                 e.printStackTrace();
             }

+ 55 - 0
frontend/pc-web/app/model/basic/StudentParents.js

@@ -0,0 +1,55 @@
+/**
+ * 学生
+ */
+Ext.define('school.model.basic.StudentParents', {
+    extend: 'school.model.Base',
+    fields: [{
+        name: 'openid',
+        type: 'int'
+    }, {
+        name: 'pa_phone',
+        type: 'string'
+    }, {
+        name: 'parent_id',
+        type: 'int'
+    }, {
+        name: 'parents_address',
+        type: 'string'
+    }, {
+        name: 'parents_birthday',
+        type: 'date'
+    }, {
+        name: 'parents_honor',
+        type: 'string'
+    }, {
+        name: 'parents_job',
+        type: 'string'
+    }, {
+        name: 'parents_name',
+        type: 'string'
+    }, {
+        name: 'parents_photo',
+        type: 'string'
+    }, {
+        name: 'parents_remarks',
+        type: 'string'
+    }, {
+        name: 'parents_sex',
+        type: 'int'
+    }, {
+        name: 'parents_status',
+        type: 'int'
+    }, {
+        name: 'pr_relation',
+        type: 'string'
+    }, {
+        name: 'pr_stuid',
+        type: 'int'
+    }, {
+        name: 'school_id',
+        type: 'int'
+    }, {
+        name: 'user_id',
+        type: 'int'
+    }],
+});

+ 30 - 6
frontend/pc-web/app/view/Interaction/homework/Release.js

@@ -36,10 +36,11 @@ Ext.define('school.view.interaction.homework.Release', {
                 fieldLabel: "发布人",
                 columnWidth: 0.5
             }, {
-                xtype: 'textfield',
-                name: 'time',
-                fieldLabel: '发布时间',
-                columnWidth: 0.5
+                xtype: 'datefield',
+                name: 'startDate',
+                fieldLabel: '开始时间',
+                columnWidth: 0.5,
+                defaultValue: new Date()
             }, {
                 xtype: 'combobox',
                 name: 'Notifications',
@@ -57,8 +58,8 @@ Ext.define('school.view.interaction.homework.Release', {
                     ]
                 })
             }, {
-                xtype: 'textfield',
-                name: 'Deadline',
+                xtype: 'datefield',
+                name: 'endDate',
                 fieldLabel: '截止时间',
                 columnWidth: 0.5
             }, {
@@ -71,10 +72,33 @@ Ext.define('school.view.interaction.homework.Release', {
                 name: 'content',
                 fieldLabel: "内容",
                 columnWidth: 1,
+                height: 250
             }],
             toolBtns: [{
                 xtype: 'button',
                 text: '发布',
+                handler: function() {
+                    let form = this.up('form');
+                    let values = form.getSaveData().main;
+                    form.setLoading(true);
+                    school.util.BaseUtil.request({
+                        // url: 'http://10.1.80.47:9560/homework/save',
+                        url: '/api/school/homework/save',
+                        method: 'POST',
+                        params: JSON.stringify({
+                            task_title: values.title,
+                            start_date: values.startDate,
+                            end_date: values.endDate,
+                            task_context: values.content
+                        })
+                    }).then(function(res) {
+                        form.setLoading(false);
+                        school.util.BaseUtil.showSuccessToast('发布成功');
+                    }).catch(function(e) {
+                        form.setLoading(false);
+                        school.util.BaseUtil.showErrorToast('发布失败: ' + e.message);
+                    });
+                }
             }]
         });
         this.callParent();

+ 20 - 0
frontend/pc-web/app/view/Interaction/notice/SchoolNotice.js

@@ -71,6 +71,26 @@ Ext.define('school.view.interaction.notice.SchoolNotice', {
             toolBtns: [{
                 xtype: 'button',
                 text: '发布',
+                handler: function() {
+                    let form = this.up('form');
+                    let values = form.getValues();
+                    form.setLoading(true);
+                    school.util.BaseUtil.request({
+                        // url: 'http://10.1.80.47:9560/notice/save',
+                        url: '/api/school/notice/save',
+                        method: 'POST',
+                        params: JSON.stringify({
+                            notify_title: values.title,
+                            notify_details: values.content
+                        })
+                    }).then(function(res) {
+                        form.setLoading(false);
+                        school.util.BaseUtil.showSuccessToast('发布成功');
+                    }).catch(function(e) {
+                        form.setLoading(false);
+                        school.util.BaseUtil.showErrorToast('发布失败: ' + e.message);
+                    });
+                }
             }]
         });
         this.callParent();

+ 7 - 7
frontend/pc-web/app/view/basic/class/ClassDetail.js

@@ -2,21 +2,20 @@ Ext.define('school.view.basic.class.ClassDetail', {
     extend: 'school.view.core.form.FormPanel',
     xtype: 'classdetail',
 
+    viewModel: 'classdetail',
+
     //字段属性
     _title: '班级信息',
-    _idField: 'id',
-    _codeField: 'pu_code',
-    _statusField: 'pu_status',
-    _statusCodeField: 'pu_statuscode',
-    _auditmanField: 'pu_auditman',
-    _auditdateField: 'pu_auditdate',
-    _relationColumn: 'pd_puid',
+    _idField: 'clazz_id',
+    _codeField: null,
+
     _readUrl: '/api/school/class/read',
     _saveUrl: '/api/purchase/purchase/save',
     _auditUrl: '/api/purchase/purchase/audit',
     _unAuditUrl: '/api/purchase/purchase/unAudit',
     _deleteUrl: '/api/purchase/purchase/delete',
     _turnInUrl: '/api/purchase/purchase/turnProdin',
+
     initId: 0,
     initComponent: function () {
         Ext.apply(this, {
@@ -109,6 +108,7 @@ Ext.define('school.view.basic.class.ClassDetail', {
             }, {
                 name: "detail1",
                 xtype: "detailGridField",
+                idColumn: 'teacher_id',
                 detnoColumn: 'sd_detno',
                 storeModel: 'school.model.basic.Student',
                 deleteDetailUrl: '/api/sale/sale/deleteDetail',

+ 13 - 0
frontend/pc-web/app/view/basic/class/ClassDetailModel.js

@@ -0,0 +1,13 @@
+Ext.define('school.view.basic.class.ClassDetailModel', {
+    extend: 'school.view.core.form.FormPanelModel',
+    alias: 'viewmodel.classdetail',
+
+    data: {
+        showAddBtn: false,
+        showRefreshBtn: false,
+        showCopyBtn: false,
+        showSaveBtn: true,
+        showDeleteBtn: true,
+        showLogBtn: false
+    },
+});

+ 110 - 91
frontend/pc-web/app/view/basic/class/ClassInfo.js

@@ -15,103 +15,122 @@ Ext.define('school.view.basic.class.ClassInfo', {
     layout: 'border',
 
     // bodyPadding: '8 12 8 12',
-    items: [{
-        region: 'west',
-        split: true,
-        border: false,
-        hideHeaders: true,
-        singleExpand: true,
-        width: 250,
-        xtype: 'treepanel',
-        reference: 'treelist',
-        bind: {
-            store: '{store_grade}',
-            width: '{treeWidth}'
-        },
-        // viewConfig: {
-        //     plugins: {
-        //         treeviewdragdrop: {
-        //             containerScroll: true
-        //         }
-        //     }
-        // },
-        columns: [{
-            xtype: 'treecolumn',
-            text: 'Name',
-            dataIndex: 'text',
-            flex: 1,
-            sortable: true,
-            renderer: function(v, metaData, record) {
-                metaData.glyph = record.glyph;
-                return v;
-            }
-        }, {
-            xtype: 'actioncolumn',
-            width: 30,
-            items: [{
-                iconCls: 'action-icon x-hidden x-ss ss-add',
-                tooltip: '新增',
-                handler: 'onTreeAddClick'
-            }]
-        }, {
-            xtype: 'actioncolumn',
-            width: 30,
-            items: [{
-                iconCls: 'action-icon x-hidden x-fa fa-pencil',
-                tooltip: '编辑',
-                handler: 'onTreeEditClick'
-            }]
-        }, {
-            xtype: 'actioncolumn',
-            width: 30,
+
+    initComponent: function() {
+        let me = this;
+        Ext.apply(me, {
             items: [{
-                iconCls: 'action-icon x-hidden x-ss ss-delete',
-                tooltip: '删除',
-                handler: 'onTreeDeleteClick'
-            }]
-        }],
-        listeners: {
-            itemclick: 'onItemClick',
-            itemmouseenter: 'onItemMouseEnter',
-            itemmouseleave: 'onItemMouseLeave',
-            beforedrop: 'onItemBeforeDrop',
-            drop: 'onItemDrop',
-        }
-    }, {
-        region: 'center',
-        bodyPadding: 10,
-        layout: 'fit',
-        items: [{
-            xtype: 'panel',
-            layout: 'fit',
-            scrollable: true,
-            tbar: [{
-                padding: '7 0 7 0',
-                ui: 'header',
+                region: 'west',
+                split: true,
+                border: false,
+                hideHeaders: true,
+                singleExpand: true,
+                width: 250,
+                xtype: 'treepanel',
+                reference: 'treelist',
                 bind: {
-                    iconCls:'x-sa {toggleIconCls}'
+                    store: '{store_grade}',
+                    width: '{treeWidth}'
                 },
-                handler: 'onToggleTree'
-            }, {
-                xtype: 'tbtext',
-                bind: {
-                    text: '{currentNodeData.text}'
+                // viewConfig: {
+                //     plugins: {
+                //         treeviewdragdrop: {
+                //             containerScroll: true
+                //         }
+                //     }
+                // },
+                columns: [{
+                    xtype: 'treecolumn',
+                    text: 'Name',
+                    dataIndex: 'text',
+                    flex: 1,
+                    sortable: true,
+                    renderer: function(v, metaData, record) {
+                        metaData.glyph = record.glyph;
+                        return v;
+                    }
+                }, {
+                    xtype: 'actioncolumn',
+                    width: 30,
+                    items: [{
+                        iconCls: 'action-icon x-hidden x-ss ss-add',
+                        tooltip: '新增',
+                        handler: 'onTreeAddClick'
+                    }]
+                }, {
+                    xtype: 'actioncolumn',
+                    width: 30,
+                    items: [{
+                        iconCls: 'action-icon x-hidden x-fa fa-pencil',
+                        tooltip: '编辑',
+                        handler: 'onTreeEditClick'
+                    }]
+                }, {
+                    xtype: 'actioncolumn',
+                    width: 30,
+                    items: [{
+                        iconCls: 'action-icon x-hidden x-ss ss-delete',
+                        tooltip: '删除',
+                        handler: 'onTreeDeleteClick'
+                    }]
+                }],
+                bbar: ['->', {
+                    xtype: 'importbutton',
+                    width: '100%',
+                    text: '导入',
+                    caller: 'GradeAndCLass',
+                    pathKey: 'grade',
+                    onSuccess: function() {
+                        let viewModel = me.getViewModel();
+        
+                        viewModel.get('store_grade').load();
+                    }
+                }, '->'],
+                listeners: {
+                    itemclick: 'onItemClick',
+                    itemmouseenter: 'onItemMouseEnter',
+                    itemmouseleave: 'onItemMouseLeave',
+                    beforedrop: 'onItemBeforeDrop',
+                    drop: 'onItemDrop',
                 }
             }, {
-                xtype: 'button',
-                text: '上一级',
-                handler: 'onTreeUp'
+                region: 'center',
+                bodyPadding: 10,
+                layout: 'fit',
+                items: [{
+                    xtype: 'panel',
+                    layout: 'fit',
+                    scrollable: true,
+                    tbar: [{
+                        padding: '7 0 7 0',
+                        ui: 'header',
+                        bind: {
+                            iconCls:'x-sa {toggleIconCls}'
+                        },
+                        handler: 'onToggleTree'
+                    }, {
+                        xtype: 'tbtext',
+                        bind: {
+                            text: '{currentNodeData.text}'
+                        }
+                    }, {
+                        xtype: 'button',
+                        text: '上一级',
+                        handler: 'onTreeUp'
+                    }],
+                    items: [{
+                        xtype: 'listcard',
+                        reference: 'listcard'
+                    }, {
+                        xtype: 'classdetail',
+                        reference: 'classdetail',
+                        hidden: true
+                    }]
+                }]
             }],
-            items: [{
-                xtype: 'listcard',
-                reference: 'listcard'
-            }, {
-                xtype: 'classdetail',
-                reference: 'classdetail',
-                hidden: true
-            }]
-        }]
-    }],
+        });
+        me.callParent(arguments);
+    },
     
     listeners: {
         afterrender: 'onAfterRender'

+ 4 - 4
frontend/pc-web/app/view/basic/staff/StaffDetail.js

@@ -21,8 +21,6 @@ Ext.define('school.view.basic.staff.StaffDetail', {
     _toSaleUrl: '/api/sale/saledown/toSale',
     initId: 0,
 
-    codeInHeader: true,
-
     initComponent: function () {
         Ext.apply(this, {
             defaultItems: [{
@@ -35,7 +33,7 @@ Ext.define('school.view.basic.staff.StaffDetail', {
                 fieldLabel: '姓名'
             }, {
                 xtype: "textfield",
-                name: "teacher_phone",
+                name: "teacher_sex",
                 fieldLabel: "性别"
             }, {
                 xtype: 'textfield',
@@ -117,11 +115,13 @@ Ext.define('school.view.basic.staff.StaffDetail', {
             }, {
                 name: "detailGridField",
                 xtype: "detailGridField",
+                idColumn: 'id',
                 detnoColumn: 'sd_detno',
                 storeModel: 'school.model.basic.staff.StaffDetail',
                 deleteDetailUrl: '/api/sale/sale/deleteDetail',
                 allowEmpty: true,
                 showCount: false,
+                readOnly: true,
                 columns: [{
                     text: '任课年级',
                     dataIndex: 'grade',
@@ -132,7 +132,7 @@ Ext.define('school.view.basic.staff.StaffDetail', {
                     text: '科目',
                     dataIndex: 'subject'
                 }]
-            }],
+            }]
         });
         this.callParent();
     },

+ 19 - 43
frontend/pc-web/app/view/basic/staff/StaffList.js

@@ -6,6 +6,10 @@ Ext.define('school.view.basic.staff.StaffList', {
     xtype: 'basic-staff-stafflist',
 
     dataUrl: '/api/school/teacher/list',
+    _title: '教职工信息导入',
+    caller: 'Teacher',
+    pathKey: 'teacher',
+
     initComponent: function() {
         var me = this;
         Ext.apply(this, {
@@ -23,14 +27,6 @@ Ext.define('school.view.basic.staff.StaffList', {
                 fieldLabel: '职位'
             }],
         
-            caller: null,
-            _formXtype: null,
-            _title: null,
-            _deleteUrl: null,
-            _batchOpenUrl: null,
-            _batchCloseUrl: null,
-            _batchDeleteUrl: null,
-        
             gridConfig: {
                 idField: null,
                 codeField: null,
@@ -48,24 +44,27 @@ Ext.define('school.view.basic.staff.StaffList', {
                 },
                 hiddenTools: false,
                 toolBtns: [{
-                    xtype: 'button',
-                    text: '导入测试按钮',
-                    handler: me.onImport,
+                    xtype: 'importbutton',
+                    belong: me,
+                    caller: me.caller,
+                    pathKey: me.pathKey,
+                    onSuccess: function() {
+                        //刷新界面
+                        var g = me.down('grid');
+                        g.store.loadPage(g.store.currentPage);
+                    }
                 }, {
                     xtype: 'button',
                     text: '一键开通'
-                }, {
-                    xtype: 'button',
-                    text: '下载模板'
-                }, {
-                    xtype: 'button',
-                    text: '批量导入'
                 }, {
                     xtype: 'button',
                     text: '删除'
                 }, {
                     xtype: 'button',
-                    text: '新增'
+                    text: '新增',
+                    handler: function() {
+                        school.util.BaseUtil.openTab('basic-staff-staffdetail', '新增教职工信息', 'basic-staff-staffdetail-add');
+                    }
                 }],
                 columns : [{
                     text: 'ID',
@@ -101,9 +100,9 @@ Ext.define('school.view.basic.staff.StaffList', {
                 }],
                 listeners: {
                     itemclick: function(view, record, item, index, e, eOpts) {
-                        school.util.BaseUtil.openTab('basic-staff-staffdetail', '教职工信息', 'basic-staff-staffdetail'+record.get('teacher_id'), {
+                        school.util.BaseUtil.openTab('basic-staff-staffdetail', '教职工信息(' + record.get('teacher_number') + ')', 'basic-staff-staffdetail'+record.get('teacher_id'), {
                             initId: record.get('teacher_id')
-                        }); 
+                        });
                     }
                 }
             },
@@ -111,29 +110,6 @@ Ext.define('school.view.basic.staff.StaffList', {
         this.callParent(arguments);
     },
 
-    onImport:function(){
-        var grid = this.ownerCt.ownerCt;
-        var form = grid.ownerCt,panelEl = form.getEl();
-        var box = panelEl.getBox();
-        var height = box.height;
-        var width = box.width;
-        var win = form.add(Ext.create('school.view.core.base.ImportWindow', {  
-            cls:'x-window-dbfind', 
-            belong:form,  
-            modal:true,
-            height: height * 0.8,
-            width: width * 0.8,
-            title: form._title + '导入',
-            scrollable: true,
-            bodyPadding: 10,
-            constrain: true,
-            closable: true,
-            layout:'fit',
-            renderTo:form.getEl()
-        }));
-        win.show();
-    },
-
     /**
      * 处理部分字段值
      */

+ 9 - 7
frontend/pc-web/app/view/basic/student/StudentDetail.js

@@ -7,8 +7,8 @@ Ext.define('school.view.basic.student.StudentDetail', {
 
     //字段属性
     _title: '学生信息',
-    _idField: 'student_id',
-    _codeField: 'student_number',
+    _idField: 'stu_id',
+    _codeField: 'stu_number',
     _statusField: null,
     _statusCodeField: null,
     _auditmanField: null,
@@ -21,8 +21,6 @@ Ext.define('school.view.basic.student.StudentDetail', {
     _toSaleUrl: '/api/sale/saledown/toSale',
     initId: 0,
 
-    codeInHeader: true,
-
     initComponent: function () {
         Ext.apply(this, {
             defaultItems: [{
@@ -92,26 +90,30 @@ Ext.define('school.view.basic.student.StudentDetail', {
             }, {
                 name: "parent",
                 xtype: "detailGridField",
+                idColumn: 'parent_id',
                 detnoColumn: 'sd_detno',
-                storeModel: 'school.model.basic.Student',
+                storeModel: 'school.model.basic.StudentParents',
                 deleteDetailUrl: '/api/sale/sale/deleteDetail',
                 allowEmpty: true,
                 showCount: false,
                 columns: [{
                     text: '家长姓名',
-                    dataIndex: 'parent_name',
+                    dataIndex: 'parents_name',
                     editor: {
                         xtype: 'textfield'
                     }
                 }, {
                     text: '联系电话',
-                    dataIndex: 'parent_phone',
+                    dataIndex: 'pa_phone',
                     editor: {
                         xtype: 'numberfield'
                     }
                 }, {
                     text: '关系',
                     dataIndex: 'parent_rel',
+                    editor: {
+                        xtype: 'textfield'
+                    }
                 }]
             }],
         });

+ 13 - 13
frontend/pc-web/app/view/basic/student/StudentList.js

@@ -6,6 +6,10 @@ Ext.define('school.view.basic.student.StudentList', {
     xtype: 'basic-student-studentlist',
 
     dataUrl: '/api/school/student/list',
+    _title: '学生信息',
+    caller: 'Student',
+    pathKey: 'student',
+
     initComponent: function() {
         var me = this;
         Ext.apply(this, {
@@ -31,14 +35,6 @@ Ext.define('school.view.basic.student.StudentList', {
                 fieldLabel: '家长'
             }],
         
-            caller: null,
-            _formXtype: null,
-            _title: null,
-            _deleteUrl: null,
-            _batchOpenUrl: null,
-            _batchCloseUrl: null,
-            _batchDeleteUrl: null,
-        
             gridConfig: {
                 idField: null,
                 codeField: null,
@@ -56,11 +52,15 @@ Ext.define('school.view.basic.student.StudentList', {
                 },
                 hiddenTools: false,
                 toolBtns: [{
-                    xtype: 'button',
-                    text: '下载模板'
-                }, {
-                    xtype: 'button',
-                    text: '上传数据'
+                    xtype: 'importbutton',
+                    belong: me,
+                    caller: me.caller,
+                    pathKey: me.pathKey,
+                    onSuccess: function() {
+                        //刷新界面
+                        var g = me.down('grid');
+                        g.store.loadPage(g.store.currentPage);
+                    }
                 }, {
                     xtype: 'button',
                     text: '一键开通'

+ 1 - 1
frontend/pc-web/app/view/core/base/BasePanel.js

@@ -228,7 +228,7 @@ Ext.define('school.view.core.base.BasePanel', {
         return conditionValue;
     },
 
-    getExtraParams: function(store, op, condition) {
+    getDefaultExtraParams: function(store, op, condition) {
         return {
             number: store.exportNumber?store.exportNumber:op._page,
             size: store.exportPageSize?store.exportPageSize:store.pageSize,

+ 2 - 1
frontend/pc-web/app/view/core/base/GridPanel.js

@@ -79,7 +79,8 @@ Ext.define('school.view.core.base.GridPanel', {
                         }
 
                         var obj = basePanel.getExtraParams(store, op, condition);
-                        Ext.apply(store.proxy.extraParams, obj);
+                        var defaultObj = basePanel.getDefaultExtraParams(store, op, condition);
+                        Ext.apply(store.proxy.extraParams, obj, defaultObj);
                     }
                 }
             });

+ 51 - 0
frontend/pc-web/app/view/core/button/import/Button.js

@@ -0,0 +1,51 @@
+Ext.define('school.view.core.button.import.Button', {
+    extend: 'Ext.button.Button',
+    xtype: 'importbutton',
+
+    text: '导入',
+
+    caller: null,
+
+    initComponent: function () {
+        let me = this;
+        Ext.apply(me, {
+            handler: me.onClick
+        });
+        me.callParent(arguments);
+    },
+
+    listeners: {
+        boxready: function() {
+            let me = this;
+            me.belong = me.belong || me.up('core-tab-panel');
+        },
+    },
+
+    onClick: function () {
+        let me = this;
+        let belong = me.belong;
+        let boxEl = belong.getEl();
+        let box = boxEl.getBox();
+        let height = box.height * 0.8;
+        let width = box.width * 0.8;
+        let win = belong.add(Ext.create('school.view.core.button.import.Window', {
+            cls: 'x-window-dbfind',
+            belong: belong,
+            modal: true,
+            height: height,
+            width: width,
+            title: '导入',
+            scrollable: true,
+            bodyPadding: 10,
+            constrain: true,
+            closable: true,
+            layout: 'fit',
+            caller: me.caller,
+            pathKey: me.pathKey,
+            renderTo: boxEl,
+            onSuccess: me.onSuccess || Ext.emptyFn,
+            onFailure: me.onFailure || Ext.emptyFn
+        }));
+        win.show();
+    }
+});

+ 121 - 115
frontend/pc-web/app/view/core/base/ImportWindow.js → frontend/pc-web/app/view/core/button/import/Window.js

@@ -1,18 +1,19 @@
-Ext.define('school.view.core.base.ImportWindow', {
+Ext.define('school.view.core.button.import.Window', {
     extend: 'Ext.window.Window',
     xtype: 'importwindow',
-    layout:'fit',
+
+    layout: 'fit',
 
     requires: [
         'Ext.form.field.File',
         'Ext.container.ButtonGroup'
     ],
 
-    bbar:['->',{
-        hidden:true,
-        name:'prev',
-        text:'上一步',
-        handler:function(b){
+    bbar: ['->', {
+        hidden: true,
+        name: 'prev',
+        text: '上一步',
+        handler: function (b) {
             var p = this.ownerCt.ownerCt.items.items[0];
             var tbar = p.dockedItems.items[0];
             //first
@@ -40,10 +41,10 @@ Ext.define('school.view.core.base.ImportWindow', {
             p.down('[name=detail]').show();
             p.down('[name=message]').hide();
         }
-    },{
-        name:'next',
-        text:'下一步',
-        handler:function(b){
+    }, {
+        name: 'next',
+        text: '下一步',
+        handler: function (b) {
             var p = this.ownerCt.ownerCt.items.items[0];
             var tbar = p.dockedItems.items[0];
             //first
@@ -71,41 +72,42 @@ Ext.define('school.view.core.base.ImportWindow', {
             p.down('[name=detail]').hide();
             p.down('[name=message]').show();
         }
-    },{
-        hidden:true,
-        name:'over',
-        text:'完成',
-        disabled:true,
-        handler:function(b){
+    }, {
+        hidden: true,
+        name: 'over',
+        text: '完成',
+        disabled: true,
+        handler: function (b) {
+            var win = b.up('window');
             var form = b.ownerCt.ownerCt;
             var id = form.importId;
-            if(id){
+            if (id) {
                 form.setLoading(true);
                 Ext.Ajax.request({
-                    url: '/api/document/'+form.ownerCt.caller.toLocaleLowerCase()+'/saveToFormal',//这里是填写需要跨域访问的URL
+                    // url: '/api/document/'+form.ownerCt.caller.toLocaleLowerCase()+'/saveToFormal',//这里是填写需要跨域访问的URL
+                    // url: 'http://10.1.80.47:9560/' + win.pathKey + '/saveToFormal', //这里是填写需要跨域访问的URL
+                    url: '/api/school/' + win.pathKey + '/saveToFormal', //这里是填写需要跨域访问的URL
                     method: 'post',
                     headers: {
                         'Access-Control-Allow-Origin': '*',
-                        'Authorization':  school.util.State.get('session').token,
+                        'Authorization': school.util.State.get('session').token,
                         "Content-Type": 'application/x-www-form-urlencoded;charset=UTF-8'
                     },
-                    params:{
-                        id:id,
-                        update:false
+                    params: {
+                        id: id,
+                        update: false
                     },
                     success: function (response, opts) {
                         form.setLoading(false);
                         var res = Ext.decode(response.responseText);
-                        if(!res.success){
+                        if (!res.success) {
                             var upload = form.down('[name=upload]');
                             upload.reset();
                             form.dockedItems.items[1].down('[name=over]').setDisabled(true);
                             form.down('[name=messagedetail]').setHtml(res.message + '</br></br><span style="color:#ff0000">请修改后重新上传</span>');
-                        }else{
-                            //刷新界面
-                            var g = form.ownerCt.down('grid');
-                            g.store.loadPage(g.store.currentPage);
-                            form.close();
+                        } else {
+                            win.onSuccess(res);
+                            win.close();
                         }
                     },
                     failure: function (response, opts) {
@@ -115,97 +117,98 @@ Ext.define('school.view.core.base.ImportWindow', {
                         form.dockedItems.items[1].down('[name=over]').setDisabled(true);
                         var res = Ext.decode(response.responseText);
                         school.util.BaseUtil.showErrorToast('导入数据失败: ' + res.message);
-                        
+                        win.onFailure(response);
                     }
                 });
-            }else{
+            } else {
                 form.close();
             }
         }
-    },{
-        name:'close',
-        text:'关闭',
-        handler:function(b){
+    }, {
+        name: 'close',
+        text: '关闭',
+        handler: function (b) {
             b.ownerCt.ownerCt.close()
         }
     }],
 
-    initComponent: function() {
+    initComponent: function () {
         var me = this;
         Ext.apply(me, {
-            items:[{
-                cls:'x-panel-import',
-                padding:'10px 100px 10px 100px',
-                xtype:'panel',
-                layout:'vbox',
-                tbar:['->',{
-                    name:'first',
-                    cls:'x-btn-import-first',
-                    style:'background: #34baf6;border-color: #35baf6;    opacity: 1;',
-                    focusable:false,
-                    disabled:true,
-                    width:300,
-                    text:'下载模板并填写',
-                },{
-                    name:'middle',
-                    disabled:true,
-                    focusable:false,
-                    style:'width: 20px;margin: 0px;margin-left: -16px;border-width: 1px 0px;min-width: 0px;border-style: solid;border-color: rgb(53, 186, 246);    opacity: 1;    background-color: #fff;',
-                    width:20,
-                    cls:'x-btn-import-middle'
-                },{
-                    name:'last',
-                    disabled:true,
-                    cls:'x-btn-import-last',
-                    style:'border-left-width: 0px;background: #fff;border-color: #35baf6;opacity:1;background-color: #fff;',
-                    focusable:false,
-                    margin:'0 0 0 -1',
-                    width:300,
-                    text:'上传导入文件',
-                },'->'],
-                items:[{
-                    margin:'15px 0 0 0',
+            items: [{
+                cls: 'x-panel-import',
+                padding: '10px 100px 10px 100px',
+                xtype: 'panel',
+                layout: 'vbox',
+                tbar: ['->', {
+                    name: 'first',
+                    cls: 'x-btn-import-first',
+                    style: 'background: #34baf6;border-color: #35baf6;    opacity: 1;',
+                    focusable: false,
+                    disabled: true,
+                    width: 300,
+                    text: '下载模板并填写',
+                }, {
+                    name: 'middle',
+                    disabled: true,
+                    focusable: false,
+                    style: 'width: 20px;margin: 0px;margin-left: -16px;border-width: 1px 0px;min-width: 0px;border-style: solid;border-color: rgb(53, 186, 246);    opacity: 1;    background-color: #fff;',
+                    width: 20,
+                    cls: 'x-btn-import-middle'
+                }, {
+                    name: 'last',
+                    disabled: true,
+                    cls: 'x-btn-import-last',
+                    style: 'border-left-width: 0px;background: #fff;border-color: #35baf6;opacity:1;background-color: #fff;',
+                    focusable: false,
+                    margin: '0 0 0 -1',
+                    width: 300,
+                    text: '上传导入文件',
+                }, '->'],
+                items: [{
+                    margin: '15px 0 0 0',
                     width: 240,
-                    labelWidth:160,
-                    buttonOnly:true,
-                    fieldLabel:'导入模板下载',
-                    name:'download',
+                    labelWidth: 160,
+                    buttonOnly: true,
+                    fieldLabel: '导入模板下载',
+                    name: 'download',
                     xtype: 'filefield',
                     buttonText: '下载模板',
-                    buttonConfig:{
-                        xtype:'button',
-                        handler:function(b){
-                            var caller = b.ownerCt.ownerCt.ownerCt.ownerCt.caller;
+                    buttonConfig: {
+                        xtype: 'button',
+                        handler: function (b) {
                             //获取模版
                             var serverOptions = Ext.manifest.server;
-                            window.location.href = (serverOptions.basePath.https?serverOptions.basePath.https:serverOptions.basePath) + '/api/commons/excel/import/templet?caller='+caller;
+                            // window.location.href = (serverOptions.basePath.https?serverOptions.basePath.https:serverOptions.basePath) + '/api/commons/excel/import/templet?caller='+me.caller;
+                            // window.location.href = 'http://10.1.80.47:9560/' + 'excel/import/templet?caller=' + me.caller;
+                            window.location.href = '/api/school/' + 'excel/import/templet?caller=' + me.caller;
                         }
                     }
-                },{
-                    margin:'10px 0 0 45px',
+                }, {
+                    margin: '10px 0 0 45px',
                     xtype: 'fieldset',
                     title: '导入说明',
-                    name:'detail',
+                    name: 'detail',
                     collapsible: false,
                     items: [{
-                        xtype : 'fieldcontainer',
-                        html: '1.下载模板后打开</br>2.查看模板内说明、并修改模板内容,保存后点击下一步按钮</br>3.上传Excel文件,此时会校验文件的字段格式,有问题则需要修改错误数据后再次上传文件</br>4.校验成功后'+
-                        '点击完成按钮将数据进行数据库校验'
+                        xtype: 'fieldcontainer',
+                        html: '1.下载模板后打开</br>2.查看模板内说明、并修改模板内容,保存后点击下一步按钮</br>3.上传Excel文件,此时会校验文件的字段格式,有问题则需要修改错误数据后再次上传文件</br>4.校验成功后' +
+                            '点击完成按钮将数据进行数据库校验'
                     }]
-                },{
-                    hidden:true,
-                    margin:'15px 0 0 0',
-                    labelWidth:100,
-                    allowBlank : true, 
-                    width:180,
-                    buttonOnly:true,
-                    fieldLabel:'上传文件',
+                }, {
+                    hidden: true,
+                    margin: '15px 0 0 0',
+                    labelWidth: 100,
+                    allowBlank: true,
+                    width: 180,
+                    buttonOnly: true,
+                    fieldLabel: '上传文件',
                     xtype: 'filefield',
-                    name:'upload',
+                    name: 'upload',
                     buttonText: '选择文件',
-                    createFileInput : function() {
-                            var me = this;
-                            me.fileInputEl = me.button.el.createChild({
+                    createFileInput: function () {
+                        var me = this;
+                        me.fileInputEl = me.button.el.createChild({
                             name: me.getName(),
                             cls: Ext.baseCSSPrefix + 'form-file-input',
                             tag: 'input',
@@ -214,13 +217,13 @@ Ext.define('school.view.core.base.ImportWindow', {
                         }).on('change', me.onFileChange, me);
                     },
                     listeners: {
-                        change: function(field){
+                        change: function (field) {
                             var form = field.ownerCt.ownerCt;
                             var myForm = field.ownerCt;
                             var fileEl = field.fileInputEl.dom;
                             var file = fileEl.files[0];
-                            var type = file.name.substring(file.name.lastIndexOf('.'),file.name.length);
-                            if(type.indexOf('xlsx')<0||type.indexOf('xls')<0){
+                            var type = file.name.substring(file.name.lastIndexOf('.'), file.name.length);
+                            if (type.indexOf('xlsx') < 0 || type.indexOf('xls') < 0) {
                                 school.util.BaseUtil.showErrorToast('文件格式不正确,只能选择xlsx或xls格式的文件进行上传');
                                 field.reset();
                                 return;
@@ -244,14 +247,14 @@ Ext.define('school.view.core.base.ImportWindow', {
                             //     school.util.BaseUtil.showErrorToast('上传失败:没有 导入 权限');
                             //     return false;
                             // }
-                            
+
                             var fd = new FormData();
                             fd.append('file', fileEl.files[0]);
-                            fd.append('caller', 'GradeAndCLass');
+                            fd.append('caller', me.caller);
                             form.setLoading(true);
-                            debugger
                             Ext.Ajax.request({
-                                url: '/excel/import/parse',//这里是填写需要跨域访问的URL
+                                // url: 'http://10.1.80.47:9560/excel/import/parse', //这里是填写需要跨域访问的URL
+                                url: '/api/school/excel/import/parse', //这里是填写需要跨域访问的URL
                                 cors: true,
                                 useDefaultXhrHeader: false,
                                 method: 'post',
@@ -260,22 +263,22 @@ Ext.define('school.view.core.base.ImportWindow', {
                                     'Access-Control-Allow-Origin': '*',
                                     //'Authorization':  school.util.State.get('session').token,
                                     //"Content-Type": 'multipart/form-data'  //文件上传的格式, 
-                                    "Content-Type":null
+                                    "Content-Type": null
                                 },
                                 success: function (response, opts) {
                                     form.setLoading(false);
                                     var res = Ext.decode(response.responseText);
-                                    if(res.success){
+                                    if (res.success) {
                                         var id = res.data;
-                                        if(id){
+                                        if (id) {
                                             field.ownerCt.down('[name=messagedetail]').setHtml('文件名: ' + file.name + ' 导入格式校验成功!</br></br>请点击 <span style="color:#35baf6">完成</span> 执行数据库校验');
                                             form.importId = id;
                                             field.ownerCt.ownerCt.dockedItems.items[1].down('[name=over]').setDisabled(false)
-                                        }else{
+                                        } else {
                                             field.reset();
                                             school.util.BaseUtil.showErrorToast('上传失败:后台未返回信息');
                                         }
-                                    }else{
+                                    } else {
                                         field.reset();
                                         field.ownerCt.down('[name=messagedetail]').setHtml(res.message + '</br><span style="color:#ff0000">请修改后重新上传</span>');
                                     }
@@ -289,22 +292,25 @@ Ext.define('school.view.core.base.ImportWindow', {
                             });
                         }
                     }
-                },{
-                    hidden:true,
-                    margin:'10px 0 0 45px',
+                }, {
+                    hidden: true,
+                    margin: '10px 0 0 45px',
                     xtype: 'fieldset',
                     title: '导入详情',
-                    name:'message',
+                    name: 'message',
                     collapsible: false,
                     items: [{
-                        name:'messagedetail',
-                        xtype : 'fieldcontainer',
-                        html:'暂无导入信息'
+                        name: 'messagedetail',
+                        xtype: 'fieldcontainer',
+                        html: '暂无导入信息'
                     }]
                 }]
             }]
         });
         me.callParent(arguments);
-    }
+    },
+
+    onSuccess: Ext.emptyFn,
+    onFailure: Ext.emptyFn
 
 });

+ 56 - 2
frontend/pc-web/app/view/core/form/FormPanel.js

@@ -25,6 +25,8 @@ Ext.define('school.view.core.form.FormPanel', {
     items: [],
     toolBtns: [],
 
+    _idField: 'id',
+
     invalidText: '表单校验有误,请检查后重试', // 校验未通过提示内容
     dirtyAuditText: '表单数据有修改,是否先保存修改?', // 有修改时点击审核提示内容
     noDirtySaveText: '表单数据无修改', // 无修改点击保存提示内容
@@ -37,7 +39,6 @@ Ext.define('school.view.core.form.FormPanel', {
             dockedItems: [{
                 xtype: 'toolbar',
                 dock: 'top',
-                hidden: me.toolBtns.length == 0,
                 items: me.getToolBarItems(),
             }],
         });
@@ -49,7 +50,60 @@ Ext.define('school.view.core.form.FormPanel', {
     getToolBarItems: function() {
         let me = this, items = [];
         
-        items = Ext.Array.merge(['->'], me.toolBtns);
+        me.defaultToolBtns = [{
+            cls: 'x-formpanel-btn-blue',
+            xtype: 'button',
+            text: '新增',
+            hidden: true,
+            bind: {
+                hidden: '{!showAddBtn || !' + me._idField + '}'
+            },
+            handler: 'add'
+        }, {
+            hidden: true,
+            xtype: 'button',
+            text: '复制',
+            handler: 'onCopy',
+            bind: {
+                hidden: '{!showCopyBtn || !'+ me._idField + '}',
+            }
+        }, {
+            hidden: true,
+            xtype: 'button',
+            text: '保存',
+            handler: 'onSave',
+            bind: {
+                hidden: '{!showSaveBtn}',
+                disabled: '{!base.valid}'
+            }
+        }, {
+            hidden: true,
+            xtype: 'button',
+            text: '删除',
+            bind: {
+                hidden: '{!showDeleteBtn || !'+ me._idField + '}'
+            },
+            handler: 'delete'
+        }, {
+            cls: 'x-formpanel-btn-white',
+            xtype: 'button',
+            text: '刷新',
+            hidden: true,
+            bind: {
+                hidden: '{!showRefreshBtn || !' + me._idField + '}'
+            },
+            handler: 'refresh'
+        }, {
+            cls:'x-formpanel-btn-white',
+            text:'操作日志',
+            hidden: true,
+            // bind: {
+            //     hidden: '{!showLogBtn || !' + me._idField + '}'
+            // },
+            handler:"showMessageLog"
+        }];
+
+        items = Ext.Array.merge(['->'], me.toolBtns, me.defaultToolBtns);
 
         return items;
     },

+ 11 - 11
frontend/pc-web/app/view/core/form/FormPanelController.js

@@ -59,18 +59,18 @@ Ext.define('school.view.core.form.FormPanelController', {
         // 单号、id清空
         main[form._idField] = 0;
         main[form._codeField] = '';
-        // 单据状态为录入状态(未审核)
-        main[form._statusCodeField] = auditTexts.unAuditCode;
-        main[form._statusField] = auditTexts.unAuditText;
+        // // 单据状态为录入状态(未审核)
+        // main[form._statusCodeField] = auditTexts.unAuditCode;
+        // main[form._statusField] = auditTexts.unAuditText;
         //重设录入人,录入日期,审核人,审核日期
-        main['creatorId'] = school.util.BaseUtil.getCurrentUser().id;
-        main['creatorName'] = school.util.BaseUtil.getCurrentUser().realname;
-        main['createTime'] = Ext.Date.format(new Date(), 'Y-m-d H:i:s');
-        main['updaterId'] = school.util.BaseUtil.getCurrentUser().id;
-        main['updaterName'] = school.util.BaseUtil.getCurrentUser().realname;
-        main['updateTime'] = Ext.Date.format(new Date(), 'Y-m-d H:i:s');
-        main[form._auditmanField] = undefined;
-        main[form._auditdateField] = undefined;
+        // main['creatorId'] = school.util.BaseUtil.getCurrentUser().id;
+        // main['creatorName'] = school.util.BaseUtil.getCurrentUser().realname;
+        // main['createTime'] = Ext.Date.format(new Date(), 'Y-m-d H:i:s');
+        // main['updaterId'] = school.util.BaseUtil.getCurrentUser().id;
+        // main['updaterName'] = school.util.BaseUtil.getCurrentUser().realname;
+        // main['updateTime'] = Ext.Date.format(new Date(), 'Y-m-d H:i:s');
+        // main[form._auditmanField] = undefined;
+        // main[form._auditdateField] = undefined;
 
 
 

+ 7 - 0
frontend/pc-web/app/view/core/form/FormPanelModel.js

@@ -11,5 +11,12 @@ Ext.define('school.view.core.form.FormPanelModel', {
         },
         detailBindeFields: [], // 从表绑定列
         detailStore: null, // 从表store
+
+        showAddBtn: true,
+        showRefreshBtn: true,
+        showCopyBtn: true,
+        showSaveBtn: true,
+        showDeleteBtn: true,
+        showLogBtn: true
     },
 });

+ 20 - 15
frontend/pc-web/app/view/core/form/field/DetailGridField.js

@@ -23,6 +23,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
     showIndex: true,
     configUrl: '',
     editable: true,
+    readOnly: false,
     allowEmpty: false, // 表格为空时校验合法
     showCount: true, // 显示合计栏
 
@@ -37,7 +38,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
 
         addRows = function(id) {
             var grid = Ext.getCmp(id);
-            if(grid.editable) {
+            if(grid.editable && !grid.readOnly) {
                 grid.addDetail(0);
             }
         };
@@ -88,7 +89,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
                     this.fireEvent('validChange');
                 },
                 itemmouseenter: function(view, record, item, index, e, eOpts) {
-                    if(!view.up('detailGridField').editable) {
+                    if(!view.up('detailGridField').editable || view.up('detailGridField').readOnly) {
                         return;
                     }
                     var lockedItems = view.el.dom.parentElement.parentElement.getElementsByClassName('x-grid-scrollbar-clipper-locked')[0].getElementsByClassName('x-grid-item');
@@ -100,7 +101,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
                     iconsItem.style.display = 'flex';
                 },
                 itemmouseleave: function(view, record, item, index, e, eOpts) {
-                    if(!view.up('detailGridField').editable) {
+                    if(!view.up('detailGridField').editable || view.up('detailGridField').readOnly) {
                         return;
                     }
                     var lockedItems = view.el.dom.parentElement.parentElement.getElementsByClassName('x-grid-scrollbar-clipper-locked')[0].getElementsByClassName('x-grid-item');
@@ -125,6 +126,10 @@ Ext.define('school.view.core.form.field.DetailGridField', {
             }
         });
         me.callParent(arguments);
+
+        if(!!me.readOnly) {
+            me.setGridDisabled(true);
+        }
     },
 
     initColumns: function() {
@@ -224,7 +229,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
 
     addDetail: function(v, d) {
         var me = this;
-        if(!me.editable) {
+        if(!me.editable || me.readOnly) {
             return;
         }
         var detnoColumn = me.detnoColumn,
@@ -271,7 +276,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
 
     deleteDetail: function(v) {
         var me = this;
-        if(!me.editable) {
+        if(!me.editable || me.readOnly) {
             return;
         }
 
@@ -282,7 +287,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
             return r.get(detnoColumn) == v;
         });
 
-        var id = selectedRecord.data.id;
+        var id = selectedRecord.data[me.idColumn];
 
         if(id&&id!=0&&(typeof id) == 'number') {
             school.util.BaseUtil.showConfirm('警告', '确定删除该条明细')
@@ -317,7 +322,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
     swapUp: function() {
         var me = this;
         var me = this;
-        if(!me.editable) {
+        if(!me.editable || me.readOnly) {
             return;
         }
         var store = me.getStore(),
@@ -330,7 +335,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
     swapDown: function() {
         var me = this;
         var me = this;
-        if(!me.editable) {
+        if(!me.editable || me.readOnly) {
             return;
         }
         var store = me.getStore(),
@@ -461,8 +466,8 @@ Ext.define('school.view.core.form.field.DetailGridField', {
         Ext.Array.each(storeData, function(item){
             var d = Object.assign({}, item.data);
 
-            if((typeof d.id) != "number" && d.id.indexOf('-')>-1){
-                d.id = 0;
+            if(d[me.idColumn] && (typeof d[me.idColumn]) != "number" && d[me.idColumn].indexOf('-')>-1){
+                d[me.idColumn] = 0;
             }
             for(k in d) {
                 if(Ext.isDate(d[k])) {
@@ -486,8 +491,8 @@ Ext.define('school.view.core.form.field.DetailGridField', {
             dirty = item.dirty;
 
             if(dirty){
-                if((typeof d.id) != "number" && d.id.indexOf('-')>-1){
-                    d.id = 0;
+                if(d[me.idColumn] && (typeof d[me.idColumn]) != "number" && d[me.idColumn].indexOf('-')>-1){
+                    d[me.idColumn] = 0;
                 }
                 for(k in d) {
                     if(Ext.isDate(d[k])) {
@@ -514,8 +519,8 @@ Ext.define('school.view.core.form.field.DetailGridField', {
             dirty = item.dirty;
 
             if(dirty){
-                if((typeof d.id) != "number" && d.id.indexOf('-')>-1){
-                    d.id = 0;
+                if(d[me.idColumn] && (typeof d[me.idColumn]) != "number" && d[me.idColumn].indexOf('-')>-1){
+                    d[me.idColumn] = 0;
                 }
                 for(k in d) {
                     if(Ext.isDate(d[k])) {
@@ -524,7 +529,7 @@ Ext.define('school.view.core.form.field.DetailGridField', {
                 }
                 trueData.push(d);
             }else {
-                if(typeof d.id == "number") {
+                if(d[me.idColumn] && typeof d[me.idColumn] == "number") {
                     for(k in d) {
                         if(Ext.isDate(d[k])) {
                             d[k] = Ext.Date.format(d[k], 'Y-m-d H:i:s');

+ 7 - 4
frontend/wechat-web/src/components/HomeWorkItem.jsx

@@ -26,14 +26,17 @@ export default class HomeWorkItem extends Component {
             <div style={{padding: '0 10px'}} onClick={this.onItemClick}>
                 <div className='recharge-item-root'>
                     <div className='common-flex-row homework-item-title-layout'>
-                        <div style={{width:'85%'}} className='homework-item-title'>{homeWork.notifyName}</div>
-                        <div style={{width:'15%',textAlign:'right'}} className={homeWork.taskStatus === 2 ? 'homework-item-done'
-                            : 'homework-item-todo'}>{homeWork.readStatus}</div>
+                        <div style={{width: '85%'}} className='homework-item-title'>{homeWork.notifyName}</div>
+                        <div style={{width: '15%', textAlign: 'right'}}
+                             className={homeWork.taskStatus === 2 ? 'homework-item-done'
+                                 : 'homework-item-todo'}>{homeWork.readStatus}</div>
                     </div>
                     <div className='gray-line' style={{height: '1px', marginBottom: '10px'}}></div>
                     <div className='recharge-item-line'>
                         <div className='recharge-item-caption'>内容:</div>
-                        <div className='recharge-item-value'>{homeWork.notifyDetails}</div>
+                        <div className='recharge-item-value'
+                             dangerouslySetInnerHTML={{ __html: homeWork.notifyDetails.replaceAll('\n', '<br/>') }}>
+                        </div>
                     </div>
                     <div className='recharge-item-line'>
                         <div className='recharge-item-caption'>截止日期:</div>

+ 1 - 0
frontend/wechat-web/src/components/TargetSelect.jsx

@@ -69,6 +69,7 @@ export default class TargetSelect extends Component {
             treeCheckable: multiple,
             showCheckedStrategy: SHOW_PARENT,
             searchPlaceholder: `请选择${title}`,
+            showSearch: true,
             style: {
                 width: '100%',
             },

+ 98 - 83
frontend/wechat-web/src/configs/router.config.js

@@ -1,5 +1,5 @@
 import React, {Component} from 'react'
-import {BrowserRouter as Router, Route, Redirect} from 'react-router-dom'
+import {BrowserRouter as Router, Route, Redirect, Switch} from 'react-router-dom'
 import BindMenu from "../modules/accountBind/BindMenu";
 import AccountBind from "../modules/accountBind/AccountBind";
 import NewAlbum from "../modules/album/NewAlbum";
@@ -62,95 +62,110 @@ import ChangePhoneNumber from '../modules/hiPages/changephonenumber/ChangePhoneN
 import ScoreNotification from '../modules/hiPages/scorenotification/ScoreNotification';
 import AccessNoticeDetail from '../modules/hiPages/accessnoticedetail/AccessNoticeDetail';
 import ChartDemo from "../modules/chart/ChartDemo";
+import {connect} from "react-redux";
 
-
-export default class RouteConfig extends Component {
+class RouteConfig extends Component {
 
     render() {
         return (
             <Router>
                 <div>
-                    <Route exact path='/' render={() => (
-                        <Redirect to='/bindMenu/app/'/>
-                    )}/>
-
-                    {/*饶猛*/}
-                    <Route path="/homePage" component={HomePage}/>{/*首页*/}
-                    <Route path='/userInfoPage/:type?' component={UserInfo}/>{/*个人信息*/}
-
-                    <Route path='/bindMenu/:type/:openid?/:wxAvatar?' component={BindMenu}/>{/*绑定菜单页面*/}
-                    <Route path='/accountBind/:type?' component={AccountBind}/>{/*绑定页面*/}
-
-                    <Route path='/newAlbum/:classId/:name?' component={NewAlbum}/>{/*新建相册*/}
-                    <Route path='/uploadImage/:albumId' component={UploadImage}/>{/*照片上传*/}
-                    <Route path='/classAlbum/:type?' component={ClassAlbum}/>{/*班级相册*/}
-                    <Route path='/pictureList/:type/:albumId/:title?' component={PictureList}/>{/*相册详情*/}
-                    <Route path='/uploadVideo/:classId/:name?' component={UploadVideo}/>{/*视频上传*/}
-                    <Route path='/videoPlayer/:title?' component={VideoPlayer}/>{/*视频播放*/}
-
-                    <Route path='/phonesSelect' component={PhonesSelect}/>{/*教师端通讯录*/}
-                    <Route path='/phonesList/:type/:classId?/:classTitle?' component={PhonesList}/>{/*家长端通讯录*/}
-                    <Route path='/phonesSearch/:type' component={PhonesSearch}/>{/*通讯录搜索页面*/}
-
-                    <Route path='/principalMailbox' component={PrincipalMailbox}/>{/*校长信箱*/}
-                    <Route path='/meetingSignIn' component={MeetingSignIn}/>{/*会议列表*/}
-                    <Route path='/systemMessage' component={SystemMessage}/>{/*系统消息*/}
-                    <Route path='/useHelp' component={UseHelp}/>{/*使用帮助*/}
-                    <Route path='/wonderMoment/:type?' component={WonderMoment}/>{/*精彩瞬间*/}
-                    <Route path='/principalHistory' component={PrincipalHistory}/>{/*校长信箱历史投递*/}
-                    <Route path='/campusCardRecharge/:type' component={CampusCardRecharge}/>{/*校园卡*/}
-                    <Route path='/consumeRePage/:type/:cardId' component={ConsumeRePage}/>{/*校园卡 1:消费记录 2.充值记录*/}
-
-                    <Route path='/rechargeList/:userId?' component={RechargeList}/>{/*家长端收费列表*/}
-                    <Route path='/rechargeRelease' component={RechargeRelease}/>{/*发起收费*/}
-                    <Route path='/classRechargeList' component={ClassRechargeList}/>{/*班级收费列表*/}
-                    <Route path='/classRechargeDetail/:payId' component={ClassRechargeDetail}/>{/*收费详情*/}
-
-                    <Route path='/announceRelease' component={AnnounceRelease}/>{/*新建通知公告*/}
-                    <Route path='/notifyBoard/parent' component={NotifyBoardParent}/>{/*家长端通知公告列表*/}
-                    <Route path='/notifyBoard/teacher' component={NotifyBoardTeacher}/>{/*教师端通知公告列表*/}
-                    <Route path='/notifyDetail/:role/:notifyId' component={NotifyBoardDetail}/>{/*通知公告详情*/}
-
-                    <Route path='/releaseAssignment' component={ReleaseAssignmentPage}/>{/*作业发布*/}
-                    <Route path='/assignmentList/:role' component={HomeWorkList}/>{/*作业列表*/}
-                    <Route path='/assignmentDetail/:role/:id' component={AssignmentDetailPage}/>{/*作业详情*/}
-
-                    <Route path='/voteList' component={VoteListParent}/>{/*家长端投票列表*/}
-                    <Route path='/voteListTab' component={VoteListTeacher}/>{/*教师端投票列表*/}
-                    <Route path="/voteDetail/:id/:role?" component={VoteDetailPage}/>{/*投票详情*/}
-
-                    {/*测试demo*/}
-                    <Route path='/chartDemo' component={ChartDemo}/>{/*图表测试页面*/}
-
-                    {/*方龙海*/}
-                    <Route path='/access-notice/:stuId?' component={AccessNotice}/> {/*出入校通知*/}
-                    <Route path='/field-trip' component={FieldTrip}/> {/*//外勤出差*/}
-                    <Route path='/res_apply' component={ResApply}/>{/*//用品申请*/}
-                    <Route path='/send-vote' component={SendVote}/>{/*//发起投票*/}
-                    <Route path='/sendMeetting' component={SendMeet}/> {/*//发起会议*/}
-                    <Route path='/class-schedule' component={ClassSchedule}/> {/*//课程表*/}
-                    <Route path='/score-inquiry' component={ScoreInquiry}/> {/*//成绩查询*/}
-                    <Route path='/approvel' component={Approvel}/>{/*我的审批*/}
-                    <Route path='/approvel-detail/:approveId/:isMyApply' component={ApprovelDetail}/> {/*审批详情*/}
-                    <Route path='/meet-detail/:meetId?' component={MeetDetail}/> {/*会议签到详情 meetingSignIn*/}
-                    <Route path='/leavedetail/:role/:lvId' component={LeaveDetail}/> {/*学生请假详情*/}
-                    <Route path="/changephonenumber" component={ChangePhoneNumber}/> {/*更换手机号码*/}
-                    <Route path="/scorenotification/:stuId?" component={ScoreNotification}/> {/*成绩通知*/}
-                    <Route path="/accessnoticedetail/:stuId/:anId?" component={AccessNoticeDetail}/>     {/*出入校通知详情*/}
-                    {/*<Route path="/accessnoticedetail" component={AccessNoticeDetail}/> /!*出入校通知详情*!/*/}
-                    <Route path='/leaveAddC' component={LeaveAddCPage}/>{/*老师请假*/}
-                    <Route path='/leaveAdd' component={LeaveAddPage}/> {/*学生请假*/}
-                    <Route path='/leaveList/:role' component={LeaveListPage}/>{/*学生请假列表*/}
-
-                    {/*刘杰*/}
-                    <Route path={"/MobileUploadDemo"} component={MobileUploadDemo}/>
-                    <Route path={"/MobileUpload"} component={MobileUpload}/>
-                    <Route path={"/ImageGrid"} component={ImageGrid}/>
-                    <Route path={"/TestImagesViewer"} component={TestImagesViewer}/>
-                    <Route path={'/picturesWall'} component={PicturesWallItem}/>
-                    <Route path='/leaveApproval' component={LeaveApprovalPage}/>
+                    <Switch>
+                        <Route exact path='/' render={() => (
+                            <Redirect to={'/bindMenu/app/' + this.props.userInfo.appId}/>
+                        )}/>
+
+                        {/*饶猛*/}
+                        <Route path="/homePage" component={HomePage}/>{/*首页*/}
+                        <Route path='/userInfoPage/:type?' component={UserInfo}/>{/*个人信息*/}
+
+                        <Route path='/bindMenu/:type/:openid?/:wxAvatar?' component={BindMenu}/>{/*绑定菜单页面*/}
+                        <Route path='/accountBind/:type?' component={AccountBind}/>{/*绑定页面*/}
+
+                        <Route path='/newAlbum/:classId/:name?' component={NewAlbum}/>{/*新建相册*/}
+                        <Route path='/uploadImage/:albumId' component={UploadImage}/>{/*照片上传*/}
+                        <Route path='/classAlbum/:type?' component={ClassAlbum}/>{/*班级相册*/}
+                        <Route path='/pictureList/:type/:albumId/:title?' component={PictureList}/>{/*相册详情*/}
+                        <Route path='/uploadVideo/:classId/:name?' component={UploadVideo}/>{/*视频上传*/}
+                        <Route path='/videoPlayer/:title?' component={VideoPlayer}/>{/*视频播放*/}
+
+                        <Route path='/phonesSelect' component={PhonesSelect}/>{/*教师端通讯录*/}
+                        <Route path='/phonesList/:type/:classId?/:classTitle?' component={PhonesList}/>{/*家长端通讯录*/}
+                        <Route path='/phonesSearch/:type' component={PhonesSearch}/>{/*通讯录搜索页面*/}
+
+                        <Route path='/principalMailbox' component={PrincipalMailbox}/>{/*校长信箱*/}
+                        <Route path='/meetingSignIn' component={MeetingSignIn}/>{/*会议列表*/}
+                        <Route path='/systemMessage' component={SystemMessage}/>{/*系统消息*/}
+                        <Route path='/useHelp' component={UseHelp}/>{/*使用帮助*/}
+                        <Route path='/wonderMoment/:type?' component={WonderMoment}/>{/*精彩瞬间*/}
+                        <Route path='/principalHistory' component={PrincipalHistory}/>{/*校长信箱历史投递*/}
+                        <Route path='/campusCardRecharge/:type' component={CampusCardRecharge}/>{/*校园卡*/}
+                        <Route path='/consumeRePage/:type/:cardId' component={ConsumeRePage}/>{/*校园卡 1:消费记录 2.充值记录*/}
+
+                        <Route path='/rechargeList/:userId?' component={RechargeList}/>{/*家长端收费列表*/}
+                        <Route path='/rechargeRelease' component={RechargeRelease}/>{/*发起收费*/}
+                        <Route path='/classRechargeList' component={ClassRechargeList}/>{/*班级收费列表*/}
+                        <Route path='/classRechargeDetail/:payId' component={ClassRechargeDetail}/>{/*收费详情*/}
+
+                        <Route path='/announceRelease' component={AnnounceRelease}/>{/*新建通知公告*/}
+                        <Route path='/notifyBoard/parent' component={NotifyBoardParent}/>{/*家长端通知公告列表*/}
+                        <Route path='/notifyBoard/teacher' component={NotifyBoardTeacher}/>{/*教师端通知公告列表*/}
+                        <Route path='/notifyDetail/:role/:notifyId' component={NotifyBoardDetail}/>{/*通知公告详情*/}
+
+                        <Route path='/releaseAssignment' component={ReleaseAssignmentPage}/>{/*作业发布*/}
+                        <Route path='/assignmentList/:role' component={HomeWorkList}/>{/*作业列表*/}
+                        <Route path='/assignmentDetail/:role/:id' component={AssignmentDetailPage}/>{/*作业详情*/}
+
+                        <Route path='/voteList' component={VoteListParent}/>{/*家长端投票列表*/}
+                        <Route path='/voteListTab' component={VoteListTeacher}/>{/*教师端投票列表*/}
+                        <Route path="/voteDetail/:id/:role?" component={VoteDetailPage}/>{/*投票详情*/}
+
+                        {/*测试demo*/}
+                        <Route path='/chartDemo' component={ChartDemo}/>{/*图表测试页面*/}
+
+                        {/*方龙海*/}
+                        <Route path='/access-notice/:stuId?' component={AccessNotice}/> {/*出入校通知*/}
+                        <Route path='/field-trip' component={FieldTrip}/> {/*//外勤出差*/}
+                        <Route path='/res_apply' component={ResApply}/>{/*//用品申请*/}
+                        <Route path='/send-vote' component={SendVote}/>{/*//发起投票*/}
+                        <Route path='/sendMeetting' component={SendMeet}/> {/*//发起会议*/}
+                        <Route path='/class-schedule' component={ClassSchedule}/> {/*//课程表*/}
+                        <Route path='/score-inquiry' component={ScoreInquiry}/> {/*//成绩查询*/}
+                        <Route path='/approvel' component={Approvel}/>{/*我的审批*/}
+                        <Route path='/approvel-detail/:isMyApply/:approveId' component={ApprovelDetail}/> {/*审批详情*/}
+                        <Route path='/meet-detail/:meetId?' component={MeetDetail}/> {/*会议签到详情 meetingSignIn*/}
+                        <Route path='/leavedetail/:role/:lvId' component={LeaveDetail}/> {/*学生请假详情*/}
+                        <Route path="/changephonenumber" component={ChangePhoneNumber}/> {/*更换手机号码*/}
+                        <Route path="/scorenotification/:stuId?" component={ScoreNotification}/> {/*成绩通知*/}
+                        <Route path="/accessnoticedetail/:stuId/:anId?" component={AccessNoticeDetail}/> {/*出入校通知详情*/}
+                        {/*<Route path="/accessnoticedetail" component={AccessNoticeDetail}/> /!*出入校通知详情*!/*/}
+                        <Route path='/leaveAddC' component={LeaveAddCPage}/>{/*老师请假*/}
+                        <Route path='/leaveAdd' component={LeaveAddPage}/> {/*学生请假*/}
+                        <Route path='/leaveList/:role' component={LeaveListPage}/>{/*学生请假列表*/}
+
+                        {/*刘杰*/}
+                        <Route path={"/MobileUploadDemo"} component={MobileUploadDemo}/>
+                        <Route path={"/MobileUpload"} component={MobileUpload}/>
+                        <Route path={"/ImageGrid"} component={ImageGrid}/>
+                        <Route path={"/TestImagesViewer"} component={TestImagesViewer}/>
+                        <Route path={'/picturesWall'} component={PicturesWallItem}/>
+                        <Route path='/leaveApproval' component={LeaveApprovalPage}/>
+
+                        {/*404页面*/}
+                        <Route render={() => (
+                            <Redirect to={'/bindMenu/app/' + this.props.userInfo.appId}/>
+                        )}/>
+                    </Switch>
                 </div>
             </Router>
         );
     }
-}
+}
+
+let mapStateToProps = (state) => ({
+    userInfo: {...state.redUserInfo}
+})
+
+let mapDispatchToProps = (dispatch) => ({})
+
+export default connect(mapStateToProps, mapDispatchToProps)(RouteConfig)

+ 1 - 0
frontend/wechat-web/src/modules/accountBind/AccountBind.jsx

@@ -199,6 +199,7 @@ class AccountBind extends Component {
             userPhone: phone,
             code: code,
             openid: this.props.userInfo.userOpenid,
+            headimgurl: this.props.userInfo.userAvatar,
         }).then(response => {
             Toast.hide()
             if (mType == 'parents') {

+ 10 - 2
frontend/wechat-web/src/modules/accountBind/BindMenu.jsx

@@ -41,6 +41,9 @@ class BindMenu extends Component {
                     errorMsg: '公众号信息获取失败'
                 })
             } else {
+                switchUser({
+                    appId: this.paramId,
+                })()
                 this.setState({
                     errorMsg: ''
                 })
@@ -82,7 +85,8 @@ class BindMenu extends Component {
     obtainBindStatus = () => {
         fetchGet(API.USER_ISBINDING, {
             openid: this.openid,
-            schoolId: 1
+            schoolId: 1,//学校id暂时写死,后续需要添加选择学校的步骤
+            headimgurl: decodeURIComponent(this.wxAvatar),
         }).then(response => {
             switchUser({
                 userOpenid: this.openid,
@@ -143,6 +147,8 @@ class BindMenu extends Component {
                 this.setState({
                     bindStatus: 2
                 })
+
+                this.props.history.push('/homePage')
             } else {
                 this.setState({
                     bindStatus: 1
@@ -163,7 +169,9 @@ class BindMenu extends Component {
 
     getRedirectMain = () => {
         return (
-            <Redirect to='/homePage'></Redirect>
+            <div>
+                {/*<Redirect to='/homePage'></Redirect>*/}
+            </div>
         )
     }
 

+ 15 - 3
frontend/wechat-web/src/modules/album/ClassAlbum.jsx

@@ -4,6 +4,7 @@
  */
 
 import React, {Component} from 'react'
+import ReactDOM from 'react-dom'
 import AlbumItem from 'components/AlbumItem'
 import {getIntValue, getStrValue, isObjEmpty} from "../../utils/common";
 import {Icon} from 'antd'
@@ -14,6 +15,7 @@ import ClassBean from 'model/ClassBean'
 import AlbumBean from "../../model/AlbumBean";
 import {connect} from 'react-redux'
 import {saveClassData} from "../../redux/actions/classData";
+import {saveListState} from "../../redux/actions/listState";
 
 const uploadItem = new AlbumItem()
 uploadItem.coverImg = 'upload'
@@ -42,8 +44,9 @@ class ClassAlbum extends Component {
     }
 
     componentDidMount() {
+        console.log(this.props.listState)
         document.title = '班级相册'
-        this.node.scrollIntoView();
+        this.container.scrollIntoView();
 
         if (isObjEmpty(this.props.classData.classList)) {
             Toast.loading('', 0)
@@ -85,7 +88,7 @@ class ClassAlbum extends Component {
             }
         }
         return (
-            <div ref={node => this.node = node}>
+            <div ref={node => this.container = node} style={{height:'100vh',overflow:'scroll'}}>
                 <div className='gray-line'></div>
                 <Picker data={classList} title='选择班级' extra='请选择'
                         value={classValue} onChange={this.handleClassChange} cols={1}>
@@ -164,7 +167,11 @@ class ClassAlbum extends Component {
                         albumList.push(albumBean)
                     }
                 }
-                this.setState({albumList})
+                this.setState({albumList}, () => {
+                    if (this.props.listState) {
+                        ReactDOM.findDOMNode(this.container).scrollTop = this.props.listState.scrollTop
+                    }
+                })
             }
         }).catch(error => {
             Toast.hide()
@@ -181,6 +188,10 @@ class ClassAlbum extends Component {
             classList: classList,
             classValue: classValue,
         })()
+        console.log('dd',ReactDOM.findDOMNode(this.container))
+        saveListState({
+            scrollTop: ReactDOM.findDOMNode(this.container).scrollTop,
+        })()
         if (index == 0 && this.mType == 'teacher') {
             let classId = -1
             let classname = ''
@@ -252,6 +263,7 @@ class ClassAlbum extends Component {
 
 let mapStateToProps = (state) => ({
     userInfo: {...state.redUserInfo},
+    listState: {...state.redListState},
     classData: {...state.redClassData}
 })
 

+ 8 - 1
frontend/wechat-web/src/modules/announce/AnnounceRelease.jsx

@@ -196,7 +196,14 @@ class AnnounceRelease extends Component {
         const fileUrls = []
         if (fileList) {
             fileList.forEach((value, index) => {
-                fileUrls.push(value.picUrl)
+                if (value.status === 'uploading') {
+                    Toast.fail('有附件正在上传,请稍候')
+                    return
+                }
+
+                if (value.status === 'done') {
+                    fileUrls.push(value.picUrl)
+                }
             })
         }
         const stuList = [], teacherList = []

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/LeaveDetail/LeaveDetail.js

@@ -104,7 +104,7 @@ class LeaveDetail extends Component {
                     </div>
                     <div  style={{marginTop: 10}} className="leave_reason">
                         <div style={{fontSize: 12, color: "#666666",width:'20%'}}>请假事由:</div>
-                        <div style={{fontSize: 12, color: "#333333",width:'80%'}}>{itemdetail.content}</div>
+                        <div style={{fontSize: 12, color: "#333333",width:'80%',wordWrap:'break-word'}}>{itemdetail.content}</div>
                     </div>
                     <div style={{display: 'flex', width: '100%', flexDirection: 'column'}}>
                         <div style={{flex: '1', overflow: 'scroll', padding: '5px', webkitOverflowScrolling: 'touch'}}>
@@ -127,7 +127,7 @@ class LeaveDetail extends Component {
                                 <List.Item>
                                     <div>
                                         <span className=" margin_left_right_20"
-                                              style={{color: '#333333'}}>{item.replyContent}</span>
+                                              style={{color: '#333333',wordWrap:'break-word'}}>{item.replyContent}</span>
                                     </div>
                                 </List.Item>
                             )}

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/access-notice/AccessNotice.css

@@ -1,6 +1,6 @@
 .header_sty1{position: fixed;top: 0px;width: 100%;}
-.header_sty{  position: fixed;top: 0px;height: 97px;width: 100%;background-color:#E7EDF6;align-content: center;display: flex;flex-direction: row;  }
-.header{height: 60px;width: 60px;margin: 10px 10px 0 80px;}
+.header_sty{  position: fixed;top: 0px;height: 90px;width: 100%;background-color:#E7EDF6;align-content: center;display: flex;flex-direction: row;  }
+.header{height: 60px;width: 60px;margin: 20px 10px 0 80px;}
 .timeList_sty{height: auto;display: flex;flex-direction: row;align-items: center}
 .out_in{height: 38px;width: 38px;padding-top: 0px;border: none;}
 .lineimg_sty{height: 24px;width: 2px;margin-left: 18px;}

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/access-notice/AccessNotice.js

@@ -97,7 +97,7 @@ class AccessNotice extends Component {
                             <Avatar size={50} icon='user'/>
                         </div>}
 
-                    <div style={{marginTop: 20, marginLeft: 10}}>
+                    <div style={{marginTop: 20}}>
                         <div style={{color: "#4087DC", fontSize: 18}}>{this.state.studentName}</div>
                         <div style={{color: "#666666", fontSize: 12, marginTop: 5}}>{this.state.studentGrade}</div>
                     </div>

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/access-notice/ItemComp.js

@@ -15,7 +15,7 @@ export default class ItemComp extends Component{
    constructor(props){
         super(props);
         this.state = {
-            showTime1:this.props.itemdata.inDate==null ? this.props.itemdata.outDate : this.props.itemdata.inDate,
+            showTime1:(this.props.itemdata.inDate==''||this.props.itemdata.inDate==null) ? this.props.itemdata.outDate : this.props.itemdata.inDate,
         }
     }
      render(){
@@ -28,7 +28,7 @@ export default class ItemComp extends Component{
                          style={{height: '100%', justifyContent: 'center', alignItems: 'center'}}>
                         {this.props.isFirst ? <div style={{flex: 1}}></div>
                             : <div style={{background: '#E9E9E9', flex: '1', width: '2px'}}></div>}
-                        {this.props.itemdata.inDate == null ? <img className="mg-circle out_in" src={exit_img} alt=""/> :
+                        {(this.props.itemdata.inDate==''||this.props.itemdata.inDate==null) ? <img className="mg-circle out_in" src={exit_img} alt=""/> :
                             <img className="mg-circle out_in" src={enter_img} alt=""/>
                         }
                         {this.props.isLast ? <div style={{flex: 1}}></div>

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/approvel-detail/ApprovelDetail.js

@@ -129,7 +129,7 @@ class ApprovelDetail extends Component{
                     cancelText={'取消'}
                     onCancel={this.doApprovel.bind(this,0)}>
                     <div onChange={this.handelValueCom}>
-                        <textarea autoFocus="autoFocus" ref='approveOpinion' className="form-control" rows="5" placeholder="填写意见说明(非必填)" ></textarea>
+                        <textarea autoFocus="autoFocus" ref='approveOpinion' className="form-control" rows="5" placeholder="填写意见说明(非必填)"  maxLength={50}></textarea>
                     </div>
                 </Modal>
                 {this.state.previewVisible ?

+ 3 - 3
frontend/wechat-web/src/modules/hiPages/approvel-detail/DetailItem.js

@@ -11,11 +11,11 @@ function DetailItem2(props) {
        <div>
            <div style={{ display: 'flex',flexDirection:'row',fontsize:15,marginLeft:10,marginRight:10,marginTop:10}}>
                <span style={{width:"35%",textAlign:'left',color:'#666666'}}>{props.itemdata1[0].key}</span>
-               <span  style={{width:"65%",textAlign:'right',color:'#333333'}}>{props.itemdata1[0].value}</span>
+               <span  style={{width:"65%",textAlign:'right',color:'#333333',wordWrap:'break-word'}}>{props.itemdata1[0].value}</span>
            </div>
            <div style={{ display: 'flex',flexDirection:'row',fontsize:15,marginLeft:10,marginRight:10,marginTop:10}}>
                <span style={{width:"35%",textAlign:'left',color:'#666666'}}>{props.itemdata1[1].key}</span>
-               <span  style={{width:"65%",textAlign:'right',color:'#333333'}}>{props.itemdata1[1].value}</span>
+               <span  style={{width:"65%",textAlign:'right',color:'#333333',wordWrap:'break-word'}}>{props.itemdata1[1].value}</span>
            </div>
            <div className='comhline_sty'></div>
        </div>
@@ -38,7 +38,7 @@ export default class DetailItem extends Component{
                         </div> :<div>
                         <div style={{ display: 'flex',flexDirection:'row',fontsize:15,marginLeft:10,marginRight:10,marginTop:10}}>
                             <span style={{width:"35%",textAlign:'left',color:'#666666'}}>{this.props.itemdata.key}</span>
-                            <span  style={{width:"65%",textAlign:'right',color:'#333333'}}>{this.props.itemdata.value}</span>
+                            <span  style={{width:"65%",textAlign:'right',color:'#333333',wordWrap:'break-word'}}>{this.props.itemdata.value}</span>
                         </div>
                         <div className="comhline_sty1"></div>
                     </div>

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/approvel-detail/ItemApprovel.js

@@ -22,7 +22,7 @@ export default class ItemApprovel extends Component{
                     <img className="img-circle out_in" src={hi2_img} alt=""/>
                     <div style={{marginLeft:30,width:"62%"}}>
                         <div style={{color:'#666666',fontSize:12}}>{this.props.approveDate}</div>
-                        <div style={{color:"#666666",fontSize:15,marginTop:5}}>{this.props.itemdata.value }<span>{this.props.suggest.value==null?"":"("+this.props.suggest.value+")"}</span></div>
+                        <div style={{color:"#666666",fontSize:15,marginTop:5,wordWrap:'break-word'}}>{this.props.itemdata.value }<span>{this.props.suggest.value==null?"":"("+this.props.suggest.value+")"}</span></div>
                     </div>
                     <div style={{fontSize:12,textAlign:'right'}} className={this.props.approveStatus == 1?'doing':'done'}>
                         {this.props.approveStatus == 1 ? '待审批' : (this.props.approveStatus == 2 ? '已审批' : '已拒绝')}</div>

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/approvel/ApprovelItem.js

@@ -37,7 +37,7 @@ export default class ApprovelItem extends Component{
         const {itemdata,isMyApply,approveId} = this.state
         return(
                     <div style={{padding:10}}>
-                        <Link to={"/approvel-detail/" + approveId +"/"+isMyApply}>
+                        <Link to={"/approvel-detail/" + isMyApply +"/"+ approveId }>
                             <div className="item-Style" onClick={this.ItemClick.bind(this,isMyApply,itemdata,this.props.index)}>
                                 <div style={{width:'20%'}}>
                                     <div style={{width:76,height:'100%'}}>

+ 1 - 3
frontend/wechat-web/src/modules/hiPages/changephonenumber/ChangePhoneNumber.js

@@ -71,9 +71,7 @@ let mSeconds = 0;
              Toast.show("请输入验证码")
              return
          }
-         this.setState({
-             changeSuccess:true
-         })
+
          var params = {
              userPhone:this.state.phoneNumber,
              openid:this.props.userInfo.user.userOpenid,

+ 4 - 1
frontend/wechat-web/src/modules/hiPages/meet-detail/MeetDetail.css

@@ -63,9 +63,9 @@
     letter-spacing: 0;
 }
 
+
 .contentItem {
     display: flex;
-    align-items: center;
     padding: 6px 0;
     background: white;
 }
@@ -86,6 +86,9 @@
     font-size: 12px;
     color: #333333;
     letter-spacing: 0;
+    -ms-word-wrap: break-word;
+    word-wrap: break-word;
+    overflow: hidden;
 }
 
 .bottomLayout {

+ 2 - 1
frontend/wechat-web/src/modules/hiPages/meet-detail/MeetDetail.js

@@ -12,7 +12,7 @@ import {fetchPost, fetchGet, fetchGetNoSession} from '../../../utils/fetchReques
 import {API} from '../../../configs/api.config';
 import {Toast} from 'antd-mobile'
 import {connect} from 'react-redux';
-import {isObjEmpty} from "../../../utils/common";
+import {isObjEmpty,getSearchParams} from "../../../utils/common";
 import {saveListState} from "../../../redux/actions/listState";
 
 function SignItem(props) {
@@ -146,6 +146,7 @@ class MeetDetail extends Component {
             meetingSignData: meetBean,
             meetId:meetId
         })
+        var urlObject = getSearchParams(this.props.location.search)
 
         let params = {
             teacherId:this.props.userInfo.user.userFunId,

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/res_apply/UserItem.js

@@ -25,12 +25,12 @@ export default class UserItem extends Component{
                 </div>
                 <div className="item_sty">
                     <div className="left_title">物品名称</div>
-                    <input  ref='itemuser'  className="text-right right_input" type="text" placeholder="请输入"  maxLength={10} value={this.props.itemata.artName} />
+                    <input  ref='itemuser'  className="text-right right_input" type="text" placeholder="请输入"  maxLength={20} value={this.props.itemata.artName} />
                 </div>
                 <div className="comhline_sty1"></div>
                 <div className="item_sty">
                     <div className="left_title">数量</div>
-                    <input   ref='itemnumber' className="text-right right_input" type="number" placeholder="请输入" value={this.props.itemata.artCount} />
+                    <input   ref='itemnumber' className="text-right right_input" type="number" placeholder="请输入" maxLength={3} value={this.props.itemata.artCount} />
                 </div>
                 <div className="comhline_sty1"></div>
             </div>

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/scorenotification/ScoreNotification.js

@@ -46,8 +46,8 @@ class ScoreNotification extends Component {
         this.setState({
             stuId: stuId
         }, function () {
+            pageIndex = 0
             this.getScoreData()
-            console.log("stuId", stuId)
         })
     }
 

+ 1 - 1
frontend/wechat-web/src/modules/home/HomePage.jsx

@@ -15,7 +15,7 @@ import {clearListState} from 'action/listState'
 import {clearClassData} from "action/classData";
 import {connect} from "react-redux";
 import {CONFIG_TEACHER_MENU, CONFIG_PARENT_MENU, CONFIG_HOME_TOP_MENU} from "../../utils/homePage.constants";
-import {getIntValue, getStrValue, isObjEmpty} from "../../utils/common";
+import {getIntValue, getSearchParams, getStrValue, isObjEmpty} from "../../utils/common";
 import 'css/home-page.css'
 import {fetchGet, fetchPost} from "../../utils/fetchRequest";
 import {_baseURL, API} from "../../configs/api.config";

+ 1 - 1
frontend/wechat-web/src/modules/homework/AssignmentDetailPage.js

@@ -200,7 +200,7 @@ class AssignmentDetailPage extends React.Component {
                 </div>
                 <div className="homework-detail-title">{this.state.title} </div>
                 <div className="homework-detail-content"
-                     dangerouslySetInnerHTML={{__html: this.state.content}}></div>
+                     dangerouslySetInnerHTML={{__html: this.state.content.replaceAll('\n', '<br/>')}}></div>
                 <div className="margin_top_bottom_10 flex_center">
                     {this.state.previewVisible ?
                         <ImagesViewer onClose={this.handleCancel} urls={this.state.files}

+ 2 - 2
frontend/wechat-web/src/modules/leave/LeaveAddPage.js

@@ -160,8 +160,8 @@ class LeaveAddPage extends Component{
             lvType: 1,
             lvProposer:this.props.userInfo.user.student.stuId,
             lvStatus:1,
-            startDate: moment(this.state.startDate).format('YYYY-MM-DD HH:mm:ss'),
-            endDate: moment(this.state.endDate).format('YYYY-MM-DD HH:mm:ss'),
+            startDate: moment(this.state.startValue).format('YYYY-MM-DD HH:mm:ss'),
+            endDate: moment(this.state.endValue).format('YYYY-MM-DD HH:mm:ss'),
             lvRemarks: "备注",
             lvNotifier:JSON.stringify(this.state.votePerson),
             lvFiles:JSON.stringify(approveFiles),

+ 2 - 2
frontend/wechat-web/src/modules/leave/LeaveItem.js

@@ -20,7 +20,7 @@ export default class LeaveItem extends Component {
         return (
             <div style={{padding:10}}>
                 <Link to={'/leavedetail/' + this.props.role + '/' + item.lvId}>
-                    <div style={{backgroundColor:'#FFF',width:'100%',padding:10,borderRadius:10}}>
+                    <div style={{backgroundColor:'#FFF',width:'100%',padding:10,borderRadius:10}} onClick = {this.ItemClick.bind(this,this.props.index)}>
                         <div className="leave_row_sty">
                             <div style={{fontSize: 15, color: "#333333",width:'60%',textAlign:'left'}}> {item.title}</div>
                             <div style={{width:'40%',textAlign:'right'}}>
@@ -43,7 +43,7 @@ export default class LeaveItem extends Component {
 
                         <div className="leave_row_sty" style={{marginTop:5}}>
                             <div style={{fontSize: 12, color: "#666666",width:'20%'}}>请假事由:</div>
-                            <div style={{fontSize: 12, color: "#333333",width:'80%'}}>{item.content}</div>
+                            <div style={{fontSize: 12, color: "#333333",width:'80%',wordWrap:'break-word'}}>{item.content}</div>
                         </div>
                     </div>
                 </Link>

+ 23 - 6
frontend/wechat-web/src/modules/notificationCenter/NotifyBoardDetail.jsx

@@ -5,7 +5,7 @@
 
 import React, {Component} from 'react'
 import ImagesViewer from "../../components/imagesVIewer";
-import {getArrayValue, getIntValue, getStrValue, isObjEmpty} from "../../utils/common";
+import {getArrayValue, getIntValue, getSearchParams, getStrValue, isObjEmpty} from "../../utils/common";
 import NotifyBoBean from "../../model/NotifyBoBean";
 import {fetchGet, fetchPost} from "../../utils/fetchRequest";
 import {_baseURL, API} from "../../configs/api.config";
@@ -25,11 +25,15 @@ class NotifyBoardDetail extends Component {
         }
     }
 
-    componentDidMount() {
-        document.title = '通知公告详情'
+    componentWillMount() {
+        this.searchParams = getSearchParams(this.props.location.search)
 
         this.notifyId = this.props.match.params.notifyId
         this.role = this.props.match.params.role
+    }
+
+    componentDidMount() {
+        document.title = '通知公告详情'
 
         this.obtainDetail()
     }
@@ -89,7 +93,12 @@ class NotifyBoardDetail extends Component {
                                 className={notifyDetail.noStatu === '已读' ?
                                     'notify-item-statuAl' : 'notify-item-statuNo'}>{notifyDetail.noStatu}</span>
                         </div>
-                        <div className='notify-detail-modal-content-text'>{notifyDetail.noContent}</div>
+                        <div className='notify-detail-modal-content-text'
+                             dangerouslySetInnerHTML={{
+                                 __html: notifyDetail.noContent ?
+                                     notifyDetail.noContent.replaceAll('\n', '<br/>')
+                                     : ''
+                             }}></div>
                         <div style={{padding: '10px'}}>
                             {enclosureItem}
                         </div>
@@ -120,15 +129,23 @@ class NotifyBoardDetail extends Component {
         let url = '', params = {}
         if (this.role === 'teacher') {
             url = API.NOTIFY_DETAIL_TEACHER
+            let id = this.props.userInfo.user.userFunId
+            if (this.searchParams && this.searchParams.teacherId) {
+                id = this.searchParams.teacherId
+            }
             params = {
                 notifyId: this.notifyId,
-                teacherId: this.props.userInfo.user.userFunId
+                teacherId: id
             }
         } else if (this.role === 'parent') {
             url = API.NOTIFY_DETAIL_PARENT
+            let id = this.props.userInfo.user.student.stuId
+            if (this.searchParams && this.searchParams.stuId) {
+                id = this.searchParams.stuId
+            }
             params = {
                 notifyId: this.notifyId,
-                stuId: this.props.userInfo.user.student.stuId
+                stuId: id
             }
         } else {
             return

+ 19 - 1
frontend/wechat-web/src/modules/phonesBook/PhonesSelect.jsx

@@ -17,6 +17,7 @@ import {Toast} from "antd-mobile";
 import RefreshLayout from "../../components/RefreshLayout";
 import {getStrValue} from "../../utils/common";
 import {connect} from 'react-redux'
+import {saveListState} from "../../redux/actions/listState";
 
 let mySwiper
 
@@ -61,6 +62,14 @@ class PhonesSelect extends Component {
             }
         })
 
+        if (this.props.listState.tabIndex >= 0) {
+            this.setState({
+                selectIndex: this.props.listState.tabIndex
+            }, () => {
+                mySwiper.slideTo(this.state.selectIndex, 0, false)
+            })
+        }
+
         mPageIndex = 0
         this.getTeacherPhones()
         this.getClassList()
@@ -276,6 +285,10 @@ class PhonesSelect extends Component {
             selectIndex: 0
         }, () => {
             mySwiper.slideTo(this.state.selectIndex, 300, false)
+
+            saveListState({
+                tabIndex: this.state.selectIndex,
+            })()
         })
     }
 
@@ -284,12 +297,17 @@ class PhonesSelect extends Component {
             selectIndex: 1
         }, () => {
             mySwiper.slideTo(this.state.selectIndex, 300, false)
+
+            saveListState({
+                tabIndex: this.state.selectIndex,
+            })()
         })
     }
 }
 
 let mapStateToProps = (state) => ({
-    userInfo: {...state.redUserInfo}
+    userInfo: {...state.redUserInfo},
+    listState: {...state.redListState}
 })
 
 let mapDispatchToProps = (dispatch) => ({})

+ 18 - 6
frontend/wechat-web/src/modules/vote/VoteDetailPage.js

@@ -11,7 +11,7 @@ import {API, _baseURL} from "../../configs/api.config";
 import {Toast} from 'antd-mobile'
 import ImageGrid from "../../components/image/ImageGrid";
 import {connect} from 'react-redux'
-import {getIntValue, getStrValue, isObjEmpty} from "../../utils/common";
+import {getIntValue, getSearchParams, getStrValue, isObjEmpty} from "../../utils/common";
 import {saveListState} from "../../redux/actions/listState";
 
 let role   //parent ,teacher
@@ -34,7 +34,7 @@ class VoteDetailPage extends React.Component {
                 endTime: '2018-11-15 08:00',
                 selectState: 0,//0 单选 1 多选
                 votes: [],
-                voteStatus:''
+                voteStatus: ''
             }
         };
     }
@@ -43,6 +43,8 @@ class VoteDetailPage extends React.Component {
     componentWillMount() {
         document.title = "投票";
         role = this.props.match.params.role
+
+        this.searchParams = getSearchParams(this.props.location.search)
     }
 
     componentDidMount() {
@@ -59,14 +61,24 @@ class VoteDetailPage extends React.Component {
         // console.log("voteId",this.state.id)
         if (role === 'teacher') {
             url_detail = API.voteDetailTeacher
+
+            let id = this.props.userInfo.user.userFunId
+            if (this.searchParams && this.searchParams.teacherId) {
+                id = this.searchParams.teacherId
+            }
             params = {
-                teacherId: this.props.userInfo.user.userFunId,
+                teacherId: id,
                 voteId: this.state.id
             }
         } else if (role === 'parent') {
             url_detail = API.voteDetailParent
+
+            let id = this.props.userInfo.user.student.stuId
+            if (this.searchParams && this.searchParams.stuId) {
+                id = this.searchParams.stuId
+            }
             params = {
-                stuId: this.props.userInfo.user.student.stuId,
+                stuId: id,
                 voteId: this.state.id
             }
         }
@@ -122,9 +134,9 @@ class VoteDetailPage extends React.Component {
                 voteBean.voteStatusCode = getIntValue(item, 'voteStatus')
                 if (voteBean.voteStatusCode === 1) {
                     voteBean.voteStatus = '进行中'
-                }else if(voteBean.voteStatusCode === 4){
+                } else if (voteBean.voteStatusCode === 4) {
                     voteBean.voteStatus = '已截止'
-                }else {
+                } else {
                     voteBean.voteStatus = '已投票'
                 }
                 voteBean.creatDate = getStrValue(item, 'creatDate')

+ 1 - 0
frontend/wechat-web/src/redux/reducers/redUserInfo.js

@@ -54,6 +54,7 @@ const initListState = {
     userAvatar: '',
     userSex: 0,*/
 
+    appId: '',
     userOpenid: '',
     userRole: 0,
     userAvatar: '',

+ 3 - 1
frontend/wechat-web/src/style/css/meeting.css

@@ -63,7 +63,6 @@
 
 .contentItem {
     display: flex;
-    align-items: center;
     padding: 6px 0;
     background: white;
 }
@@ -84,6 +83,9 @@
     font-size: 12px;
     color: #333333;
     letter-spacing: 0;
+    -ms-word-wrap: break-word;
+    word-wrap: break-word;
+    overflow: hidden;
 }
 
 .bottomLayout {

+ 15 - 2
frontend/wechat-web/src/utils/common.js

@@ -315,13 +315,13 @@ export function getDirFiles(directory, useSubdirectories, regExp) {
 }
 
 export const getCheckedNodes = (extra) => {
+    console.log('checkNodes', extra)
     let checkedNodes = extra.allCheckedNodes || [extra.triggerNode]
     let count = getCheckedCount(checkedNodes)
     if (isObjEmpty(checkedNodes)) {
         checkedNodes = []
     }
     checkedNodes = getNodes(checkedNodes)
-    console.log('checkNodes', checkedNodes)
     return {checkedNodes, count}
 }
 
@@ -387,7 +387,7 @@ export const getNodes = (checkedNodes) => {
                         }
                     }
                 }
-            }else {
+            } else {
                 continue
             }
         }
@@ -425,3 +425,16 @@ export function randomNum(minNum, maxNum) {
     }
 }
 
+//解析url的search参数
+export function getSearchParams(searchStr) {
+    let params = new Object();
+    if (searchStr.indexOf("?") != -1) {
+        searchStr = searchStr.substr(1);
+        const searchArray = searchStr.split("&");
+        for (let i = 0; i < searchArray.length; i++) {
+            params[searchArray[i].split("=")[0]] = unescape(searchArray[i].split("=")[1]);
+        }
+    }
+    return params;
+}
+