Просмотр исходного кода

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

koul 7 лет назад
Родитель
Сommit
8f387852a9
84 измененных файлов с 1423 добавлено и 628 удалено
  1. 4 0
      applications/school/school-dto/src/main/java/com/usoftchina/smartschool/school/dto/DocBaseDTO.java
  2. 43 5
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/controller/GradeController.java
  3. 15 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/GradeService.java
  4. 64 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/GradeServiceImpl.java
  5. 2 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/SysGradeMapper.java
  6. 36 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/Messagelog.java
  7. 13 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/SysClazz.java
  8. 11 1
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/SysGrade.java
  9. 9 0
      applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/TreeNode.java
  10. 3 0
      applications/school/school-server/src/main/resources/mapper/SysClazzMapper.xml
  11. 11 4
      applications/school/school-server/src/main/resources/mapper/SysGradeMapper.xml
  12. 55 0
      frontend/pc-web/app/model/basic/StudentParents.js
  13. 3 2
      frontend/pc-web/app/util/BaseUtil.js
  14. 0 1
      frontend/pc-web/app/util/FormUtil.js
  15. 30 6
      frontend/pc-web/app/view/Interaction/homework/Release.js
  16. 20 0
      frontend/pc-web/app/view/Interaction/notice/SchoolNotice.js
  17. 7 7
      frontend/pc-web/app/view/basic/class/ClassDetail.js
  18. 13 0
      frontend/pc-web/app/view/basic/class/ClassDetailModel.js
  19. 114 74
      frontend/pc-web/app/view/basic/class/ClassInfo.js
  20. 210 41
      frontend/pc-web/app/view/basic/class/ClassInfoController.js
  21. 1 1
      frontend/pc-web/app/view/basic/class/ListCard.js
  22. 1 1
      frontend/pc-web/app/view/basic/school/SchoolInfo.js
  23. 4 4
      frontend/pc-web/app/view/basic/staff/StaffDetail.js
  24. 19 43
      frontend/pc-web/app/view/basic/staff/StaffList.js
  25. 9 7
      frontend/pc-web/app/view/basic/student/StudentDetail.js
  26. 13 13
      frontend/pc-web/app/view/basic/student/StudentList.js
  27. 1 1
      frontend/pc-web/app/view/core/base/BasePanel.js
  28. 2 1
      frontend/pc-web/app/view/core/base/GridPanel.js
  29. 51 0
      frontend/pc-web/app/view/core/button/import/Button.js
  30. 121 115
      frontend/pc-web/app/view/core/button/import/Window.js
  31. 56 2
      frontend/pc-web/app/view/core/form/FormPanel.js
  32. 11 11
      frontend/pc-web/app/view/core/form/FormPanelController.js
  33. 7 0
      frontend/pc-web/app/view/core/form/FormPanelModel.js
  34. 20 15
      frontend/pc-web/app/view/core/form/field/DetailGridField.js
  35. 2 1
      frontend/pc-web/app/view/viewport/ViewportModel.js
  36. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.eot
  37. 0 0
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.js
  38. 9 0
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.svg
  39. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.ttf
  40. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff
  41. BIN
      frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff2
  42. 12 8
      frontend/pc-web/packages/font-school/sass/etc/icons.scss
  43. 0 2
      frontend/pc-web/packages/font-school/sass/src/all.scss
  44. 7 4
      frontend/wechat-web/src/components/HomeWorkItem.jsx
  45. 2 1
      frontend/wechat-web/src/components/MeetingSignItem.jsx
  46. 98 83
      frontend/wechat-web/src/configs/router.config.js
  47. 4 1
      frontend/wechat-web/src/index.css
  48. 1 0
      frontend/wechat-web/src/modules/accountBind/AccountBind.jsx
  49. 10 2
      frontend/wechat-web/src/modules/accountBind/BindMenu.jsx
  50. 15 3
      frontend/wechat-web/src/modules/album/ClassAlbum.jsx
  51. 15 2
      frontend/wechat-web/src/modules/announce/AnnounceRelease.jsx
  52. 2 2
      frontend/wechat-web/src/modules/hiPages/LeaveDetail/LeaveDetail.js
  53. 2 1
      frontend/wechat-web/src/modules/hiPages/approvel-detail/ApprovelDetail.js
  54. 3 3
      frontend/wechat-web/src/modules/hiPages/approvel-detail/DetailItem.js
  55. 2 2
      frontend/wechat-web/src/modules/hiPages/approvel/Approvel.css
  56. 50 21
      frontend/wechat-web/src/modules/hiPages/approvel/Approvel.js
  57. 18 16
      frontend/wechat-web/src/modules/hiPages/approvel/ApprovelItem.js
  58. 3 4
      frontend/wechat-web/src/modules/hiPages/changephonenumber/ChangePhoneNumber.js
  59. 1 1
      frontend/wechat-web/src/modules/hiPages/field-trip/FieldTrip.js
  60. 4 1
      frontend/wechat-web/src/modules/hiPages/meet-detail/MeetDetail.css
  61. 2 1
      frontend/wechat-web/src/modules/hiPages/meet-detail/MeetDetail.js
  62. 2 11
      frontend/wechat-web/src/modules/hiPages/res_apply/ResApply.js
  63. 22 8
      frontend/wechat-web/src/modules/hiPages/res_apply/UserItem.js
  64. 1 1
      frontend/wechat-web/src/modules/hiPages/scorenotification/ScoreNotification.js
  65. 2 2
      frontend/wechat-web/src/modules/hiPages/send-vote/SendVote.js
  66. 17 12
      frontend/wechat-web/src/modules/hiPages/sendMeetting/SendMeet.js
  67. 1 1
      frontend/wechat-web/src/modules/home/HomePage.jsx
  68. 2 2
      frontend/wechat-web/src/modules/homework/AssignmentDetailPage.js
  69. 7 1
      frontend/wechat-web/src/modules/homework/ReleaseAssignmentPage.js
  70. 1 1
      frontend/wechat-web/src/modules/leave/LeaveAddCPage.js
  71. 3 3
      frontend/wechat-web/src/modules/leave/LeaveAddPage.js
  72. 1 1
      frontend/wechat-web/src/modules/leave/LeaveItem.css
  73. 13 16
      frontend/wechat-web/src/modules/leave/LeaveItem.js
  74. 10 7
      frontend/wechat-web/src/modules/leave/LeaveListPage.js
  75. 4 3
      frontend/wechat-web/src/modules/meeting/MeetingSignIn.jsx
  76. 23 6
      frontend/wechat-web/src/modules/notificationCenter/NotifyBoardDetail.jsx
  77. 1 1
      frontend/wechat-web/src/modules/phonesBook/PhonesList.jsx
  78. 1 1
      frontend/wechat-web/src/modules/phonesBook/PhonesSearch.jsx
  79. 19 7
      frontend/wechat-web/src/modules/vote/VoteDetailPage.js
  80. 1 0
      frontend/wechat-web/src/redux/reducers/redUserInfo.js
  81. 2 2
      frontend/wechat-web/src/style/css/consume-re.css
  82. 3 1
      frontend/wechat-web/src/style/css/meeting.css
  83. 1 1
      frontend/wechat-web/src/style/css/payment.css
  84. 45 24
      frontend/wechat-web/src/utils/common.js

+ 4 - 0
applications/school/school-dto/src/main/java/com/usoftchina/smartschool/school/dto/DocBaseDTO.java

@@ -50,6 +50,10 @@ public class DocBaseDTO implements Serializable{
         this.name = name;
     }
 
+    public DocBaseDTO(Long id) {
+        this.id = id;
+    }
+
     public DocBaseDTO() {
     }
 }

+ 43 - 5
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/controller/GradeController.java

@@ -2,12 +2,13 @@ package com.usoftchina.smartschool.school.basic.controller;
 
 import com.usoftchina.smartschool.base.Result;
 import com.usoftchina.smartschool.school.basic.service.GradeService;
+import com.usoftchina.smartschool.school.dto.DocBaseDTO;
+import com.usoftchina.smartschool.school.po.SysClazz;
+import com.usoftchina.smartschool.school.po.SysGrade;
 import com.usoftchina.smartschool.school.po.SysSchool;
 import com.usoftchina.smartschool.school.po.TreeNode;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author: guq
@@ -27,17 +28,54 @@ public class GradeController {
     * @Author: guq
     * @Date: 2019/1/22
     */
-    @RequestMapping("/read/{id}")
+    @GetMapping("/read/{id}")
     public Result getSchoolTree(@PathVariable("id") Long id) {
         TreeNode school = gradeService.getSchoolTree(id);
         return Result.success(school);
     }
 
     //导入保存至列表
-    @RequestMapping("/saveToFormal")
+     @PostMapping("/saveToFormal")
     public Result saveToFormal(Integer id, boolean update) {
         gradeService.saveToFormal(id, update);
         return Result.success();
     }
 
+
+    @PostMapping("/save")
+    public Result saveGrade(String grade, Integer no) {
+        DocBaseDTO docBaseDTO = gradeService.saveGrade(grade, no);
+        return Result.success(docBaseDTO);
+    }
+
+    @PostMapping("/addClass")
+    public Result addClass(@RequestBody SysClazz sysClazz) {
+        DocBaseDTO baseDTO = gradeService.addClass(sysClazz);
+        return Result.success(baseDTO);
+    }
+
+    @PostMapping("/update")
+    public Result update(@RequestBody SysGrade grade) {
+        gradeService.update(grade);
+        return Result.success();
+    }
+
+    @PostMapping("/updateClass")
+    public Result updateClass(@RequestBody SysClazz sysClass) {
+        gradeService.updateClass(sysClass);
+        return Result.success();
+    }
+
+
+    @PostMapping("/delete/{id}")
+    public Result delete(@PathVariable("id") Long id) {
+        gradeService.delete(id);
+        return Result.success();
+    }
+
+    @PostMapping("/deleteClass/{id}")
+    public Result deleteClass(@PathVariable("id") Long id) {
+        gradeService.deleteClass(id);
+        return Result.success();
+    }
 }

+ 15 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/GradeService.java

@@ -1,5 +1,8 @@
 package com.usoftchina.smartschool.school.basic.service;
 
+import com.usoftchina.smartschool.school.dto.DocBaseDTO;
+import com.usoftchina.smartschool.school.po.SysClazz;
+import com.usoftchina.smartschool.school.po.SysGrade;
 import com.usoftchina.smartschool.school.po.SysSchool;
 import com.usoftchina.smartschool.school.po.TreeNode;
 
@@ -7,4 +10,16 @@ public interface GradeService {
     TreeNode getSchoolTree(Long id);
 
     void saveToFormal(Integer id, boolean update);
+
+    DocBaseDTO saveGrade(String grade, Integer no);
+
+    DocBaseDTO addClass(SysClazz sysClazz);
+
+    void delete(Long id);
+
+    void deleteClass(Long id);
+
+    void update(SysGrade grade);
+
+    void updateClass(SysClazz sysClass);
 }

+ 64 - 1
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/basic/service/impl/GradeServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.usoftchina.smartschool.context.BaseContextHolder;
 import com.usoftchina.smartschool.exception.BizException;
 import com.usoftchina.smartschool.school.basic.service.GradeService;
+import com.usoftchina.smartschool.school.dto.DocBaseDTO;
 import com.usoftchina.smartschool.school.exception.BizExceptionCode;
 import com.usoftchina.smartschool.school.mapper.DataImportMapper;
 import com.usoftchina.smartschool.school.mapper.SysClazzMapper;
@@ -51,7 +52,7 @@ public class GradeServiceImpl implements GradeService{
         TreeNode gradeNode = null;
         TreeNode classNode = null;
         List<TreeNode> gradesTree = new ArrayList<>();
-        List<TreeNode> classesTree = new ArrayList<>();
+        List<TreeNode> classesTree = null;
         schoolTree.setId(school.getSchool_id());
         schoolTree.setLeaf(false);
         schoolTree.setText(school.getSchool_name());
@@ -66,6 +67,8 @@ public class GradeServiceImpl implements GradeService{
                 gradeNode.setLeaf(false);
                 gradeNode.setText(grade.getGrade_name());
                 gradeNode.setId(grade.getGrade_id());
+                gradeNode.setNo(grade.getGrade_no());
+                classesTree = new ArrayList<>();
 
                 List<SysClazz> classes = sysClazzMapper.selectBygrade(grade.getGrade_id());
                 if (null != classes && classes.size() > 0) {
@@ -75,6 +78,7 @@ public class GradeServiceImpl implements GradeService{
                         classNode.setLeaf(true);
                         classNode.setText(class_.getClazz_name());
                         classNode.setType(SCHOOLTYPE.CLASS.name());
+                        classNode.setNo(class_.getClazz_no());
                         classesTree.add(classNode);
                     }
                 }
@@ -147,4 +151,63 @@ public class GradeServiceImpl implements GradeService{
             dataImportMapper.updateDataImport(id);
         }
     }
+
+    @Override
+    public DocBaseDTO saveGrade(String grade, Integer no) {
+        if (StringUtils.isEmpty(grade)) {
+            throw new BizException(BizExceptionCode.USELESS_DATA);
+        }
+        Long school_id = BaseContextHolder.getSchoolId();
+        school_id = 1l;
+        SysGrade sysGrade = new SysGrade();
+        sysGrade.setGrade_status(1);
+        sysGrade.setSchool_id(school_id);
+        sysGrade.setGrade_no(no);
+        sysGrade.setGrade_name(grade);
+        sysGradeMapper.insertGrade(sysGrade);
+        return new DocBaseDTO(sysGrade.getGrade_id());
+    }
+
+    @Override
+    public DocBaseDTO addClass(SysClazz sysClazz) {
+        if (StringUtils.isEmpty(sysClazz)) {
+            throw new BizException(BizExceptionCode.USELESS_DATA);
+        }
+        sysClazz.setClazz_status(1);
+        sysClazzMapper.insertSelective(sysClazz);
+        return new DocBaseDTO(sysClazz.getClazz_id());
+    }
+
+    @Override
+    public void delete(Long id) {
+        if (StringUtils.isEmpty(id)) {
+            throw new BizException(BizExceptionCode.USELESS_DATA);
+        }
+        sysGradeMapper.deleteByPrimaryKey(id);
+    }
+
+    @Override
+    public void deleteClass(Long id) {
+        if (StringUtils.isEmpty(id)) {
+            throw new BizException(BizExceptionCode.USELESS_DATA);
+        }
+        sysClazzMapper.deleteByPrimaryKey(id);
+    }
+
+    @Override
+    public void update(SysGrade grade) {
+        if (StringUtils.isEmpty(grade)) {
+            throw new BizException(BizExceptionCode.USELESS_DATA);
+        }
+        sysGradeMapper.updateByPrimaryKeySelective(grade);
+
+    }
+
+    @Override
+    public void updateClass(SysClazz sysClass) {
+        if (StringUtils.isEmpty(sysClass)) {
+            throw new BizException(BizExceptionCode.USELESS_DATA);
+        }
+        sysClazzMapper.updateByPrimaryKeySelective(sysClass);
+    }
 }

+ 2 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/mapper/SysGradeMapper.java

@@ -23,4 +23,6 @@ public interface SysGradeMapper {
     List<SysGrade> selectBySchool(Long id);
 
     SysGrade selectByName(@Param("grade") String grade, @Param("school_id") Long school_id);
+
+    int insertGrade(SysGrade grade);
 }

+ 36 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/Messagelog.java

@@ -0,0 +1,36 @@
+package com.usoftchina.smartschool.school.po;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class Messagelog implements Serializable{
+
+    private Integer ml_id;
+
+    private String ml_code;
+
+    private String ml_content;
+
+    private String ml_result;
+
+    private String ml_caller;
+
+    private String ml_man;
+
+    private Integer school_id;
+
+    private Date createTime;
+
+    private Integer creatorId;
+
+    private Integer ml_keyvalue;
+
+    private String ml_name;
+
+    private String creatorName;
+
+}

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

@@ -1,10 +1,12 @@
 package com.usoftchina.smartschool.school.po;
 
+import java.io.Serializable;
+
 /**
  * @author: guq
  * @create: 2019-01-22 16:12
  **/
-public class SysClazz {
+public class SysClazz implements Serializable{
 
     private Long clazz_id;
 
@@ -18,6 +20,8 @@ public class SysClazz {
 
     private Long grade_id;
 
+    private Integer clazz_no;
+
     private Boolean leaf = true;
 
     public Boolean getLeaf() {
@@ -76,4 +80,12 @@ public class SysClazz {
         this.grade_id = grade_id;
     }
 
+
+    public Integer getClazz_no() {
+        return clazz_no;
+    }
+
+    public void setClazz_no(Integer clazz_no) {
+        this.clazz_no = clazz_no;
+    }
 }

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

@@ -1,12 +1,13 @@
 package com.usoftchina.smartschool.school.po;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
  * @author: guq
  * @create: 2019-01-22 16:11
  **/
-public class SysGrade {
+public class SysGrade implements Serializable{
 
     private Long grade_id;
 
@@ -20,6 +21,8 @@ public class SysGrade {
 
     private Long school_id;
 
+    private Integer grade_no;
+
     private List<SysClazz> children;
 
     private Boolean leaf = false;
@@ -88,4 +91,11 @@ public class SysGrade {
         this.school_id = school_id;
     }
 
+    public Integer getGrade_no() {
+        return grade_no;
+    }
+
+    public void setGrade_no(Integer grade_no) {
+        this.grade_no = grade_no;
+    }
 }

+ 9 - 0
applications/school/school-server/src/main/java/com/usoftchina/smartschool/school/po/TreeNode.java

@@ -14,6 +14,15 @@ public class TreeNode implements Serializable{
     private String text;
     private boolean leaf;
     private List<TreeNode> children;
+    private Integer no;
+
+    public Integer getNo() {
+        return no;
+    }
+
+    public void setNo(Integer no) {
+        this.no = no;
+    }
 
     public Long getId() {
         return id;

+ 3 - 0
applications/school/school-server/src/main/resources/mapper/SysClazzMapper.xml

@@ -32,6 +32,9 @@
       )
   </insert>
   <insert id="insertSelective" parameterType="com.usoftchina.smartschool.school.po.SysClazz" >
+    <selectKey  resultType="java.lang.Long" keyProperty="clazz_id">
+      SELECT LAST_INSERT_ID() AS ID
+    </selectKey>
     insert into sys_clazz
     <trim prefix="(" suffix=")" suffixOverrides="," >
       <if test="clazz_name != null" >

+ 11 - 4
applications/school/school-server/src/main/resources/mapper/SysGradeMapper.xml

@@ -8,6 +8,7 @@
     <result column="grade_remarks" property="grade_remarks" jdbcType="VARCHAR" />
     <result column="grade_address" property="grade_address" jdbcType="VARCHAR" />
     <result column="school_id" property="school_id" jdbcType="BIGINT" />
+    <result column="grade_no" property="grade_no" jdbcType="INTEGER"/>
   </resultMap>
   <sql id="Base_Column_List" >
     grade_id, grade_name, grade_status, grade_remarks, grade_address, school_id
@@ -85,9 +86,6 @@
       <if test="grade_address != null" >
         grade_address = #{grade_address,jdbcType=VARCHAR},
       </if>
-      <if test="school_id != null" >
-        school_id = #{school_id,jdbcType=BIGINT},
-      </if>
     </set>
     where grade_id = #{grade_id,jdbcType=BIGINT}
   </update>
@@ -101,9 +99,18 @@
     where grade_id = #{grade_id,jdbcType=BIGINT}
   </update>
   <select id="selectBySchool" parameterType="java.lang.Long" resultMap="BaseResultMap">
-    select * from sys_grade where school_id = #{id}
+    select * from sys_grade where school_id = #{id} order by grade_no,grade_id
   </select>
   <select id="selectByName" resultMap="BaseResultMap">
     select * from sys_grade where grade_name=#{grade} and school_id=#{school_id}
   </select>
+
+  <insert id="insertGrade" parameterType="com.usoftchina.smartschool.school.po.SysGrade">
+    <selectKey  resultType="java.lang.Long" keyProperty="grade_id">
+      SELECT LAST_INSERT_ID() AS ID
+    </selectKey>
+    insert into sys_grade (grade_name,grade_no,school_id) select #{grade_name},#{grade_no},#{school_id} from dual where
+    not  exists (select 1 from sys_grade where grade_name = #{grade_name} and school_id = #{school_id})
+  </insert>
+
 </mapper>

+ 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'
+    }],
+});

+ 3 - 2
frontend/pc-web/app/util/BaseUtil.js

@@ -191,9 +191,10 @@ Ext.define('school.util.BaseUtil', {
                         }catch(e) {
                             res = response.responseJson || {};
                         }
-                        console.error('ajax request failure: ', res);
                         res.message = res.message || '未知错误';
-                        throw new Error(res.message);
+                        console.error('ajax request failure: ', res);
+                        // throw new Error(res.message);
+                        return reject(res);
                     }
                 });
             })

+ 0 - 1
frontend/pc-web/app/util/FormUtil.js

@@ -290,7 +290,6 @@ Ext.define('school.util.FormUtil', {
                     });
 
                     cnames.push(item.detnoColumn);
-                    console.log(cnames);
 
                     formModel.set('detail' + index + '.detailBindFields', cnames);
                     item.bind = {

+ 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
+    },
+});

+ 114 - 74
frontend/pc-web/app/view/basic/class/ClassInfo.js

@@ -15,84 +15,124 @@ 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}'
-        },
-        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,
+
+    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'
-        }
-    }, {
-        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'
+    }
 });

+ 210 - 41
frontend/pc-web/app/view/basic/class/ClassInfoController.js

@@ -2,32 +2,42 @@ Ext.define('school.view.basic.class.ClassInfoController', {
     extend: 'Ext.app.ViewController',
     alias: 'controller.basic-class-classinfo',
 
-    onItemMouseEnter: function(tree, record, item, index, e, eOpts)  {
-        var icons = item.getElementsByClassName('action-icon');
-        if(record.data.leaf) {
-            icons[1].classList.remove('x-hidden');
-            return;
-        }
+    onAfterRender: function() {
+        let me = this,
+        view = me.getView(),
+        viewModel = me.getViewModel();
 
-        if(record.data.id == 'root') {
-            icons[0].classList.remove('x-hidden');
-            return;
-        }
+        viewModel.get('store_grade').load();
+    },
 
-        icons[0].classList.remove('x-hidden');
-        icons[1].classList.remove('x-hidden');
+    onItemMouseEnter: function(tree, record, item, index, e, eOpts)  {
+        let icons = item.getElementsByClassName('action-icon');
+        let addIcon = icons[0],
+        editIcon = icons[1],
+        deleteIcon = icons[2];
+        if(record.data.type == 'SCHOOL') {
+            addIcon.classList.remove('x-hidden');
+        }else if(record.data.type == 'GRADE') {
+            addIcon.classList.remove('x-hidden');
+            editIcon.classList.remove('x-hidden');
+            deleteIcon.classList.remove('x-hidden');
+        }else if(record.data.type == 'CLASS') {
+            // addIcon.classList.remove('x-hidden');
+            editIcon.classList.remove('x-hidden');
+            deleteIcon.classList.remove('x-hidden');
+        } 
     },
 
     onItemMouseLeave: function(tree, record, item, index, e, eOpts) {
-        var icons = item.getElementsByClassName('action-icon');
+        let icons = item.getElementsByClassName('action-icon');
 
-        for(var x = 0; x < icons.length; x++) {
+        for(let x = 0; x < icons.length; x++) {
             icons[x].classList.add('x-hidden');
         }
     },
 
-    onItemclick: function(tree, record, item, index, e, eOpts) {
-        var me = this,
+    onItemClick: function(tree, record, item, index, e, eOpts) {
+        let me = this,
         refs = me.getReferences(),
         listCard = refs.listcard;
 
@@ -35,8 +45,24 @@ Ext.define('school.view.basic.class.ClassInfoController', {
 
     },
 
+    onItemBeforeDrop: function(node, data, overModel, dropPosition, dropHandlers) {
+        let cdata = data.records[0].data;
+        let tdata = overModel.data;
+        dropHandlers.wait = true;
+
+        if(cdata.type == tdata.type && dropPosition != 'append') {
+            dropHandlers.processDrop();
+        }else {
+            dropHandlers.cancelDrop();
+        }
+    },
+
+    onItemDrop: function() {
+
+    },
+
     onToggleTree: function() {
-        var me = this,
+        let me = this,
         viewModel = me.getViewModel(),
         refs = me.getReferences(),
         treeList = refs.treelist,
@@ -59,7 +85,7 @@ Ext.define('school.view.basic.class.ClassInfoController', {
     },
 
     onTreeUp: function() {
-        var me = this,
+        let me = this,
         viewModel = me.getViewModel(),
         refs = me.getReferences(),
         treeList = refs.treelist,
@@ -78,49 +104,77 @@ Ext.define('school.view.basic.class.ClassInfoController', {
     },
 
     onTreeAddClick: function(tree, row, col, item, e, eOpts, tr) {
-        var me = this,
+        let me = this,
         store = tree.store,
         record = store.getAt(row);
 
-        me.showTreeAddWin(record.data);
+        me.showTreeAddWin(record.data, record);
+
+    },
+
+    onTreeEditClick: function(tree, row, col, item, e, eOpts, tr) {
+        let me = this,
+        store = tree.store,
+        record = store.getAt(row);
 
+        me.showTreeEditWin(record.data, true);
     },
 
     onTreeDeleteClick: function(tree, row, col, item, e, eOpts, tr) {
-        var me = this,
+        let me = this,
         refs = me.getReferences(),
         listCard = refs.listcard,
         treeList = refs.treelist,
         store = treeList.store,
         record = store.getAt(row),
         rootNode = treeList.getRootNode(),
+        _id = record.data._id,
         id = record.data.id,
+        type = record.data.type,
         currentNode = rootNode.findChild('id', id, true),
         parentNode = currentNode.parentNode;
 
-        treeList.setSelection(parentNode);
-        currentNode.remove();
-        
-        listCard.showNode(parentNode);
+        let url;
+
+        if(type == 'GRADE') {
+            // url = 'http://10.1.80.47:9560/grade/delete'
+            url = '/api/school/grade/delete'
+        }else {
+            // url = 'http://10.1.80.47:9560/grade/deleteClass'
+            url = '/api/school/grade/deleteClass'
+        }
+
+        school.util.BaseUtil.request({
+            url: url + '/' +  _id,
+            method: 'POST'
+        }).then(function(res) {
+            treeList.setSelection(parentNode);
+            currentNode.remove();
+            listCard.showNode(parentNode);
+        }).catch(function(e) {
+            school.util.BaseUtil.showErrorToast(e.message);
+        });
     },
 
-    showTreeAddWin: function(data) {
-        var me = this,
+    showTreeAddWin: function(data, record) {
+        let me = this,
         view = me.getView(),
         refs = me.getReferences(),
         treeList = refs.treelist,
         listCard = refs.listcard,
         win = refs.treeaddwin,
         id = data.id,
-        type = data.type;
+        _id = data._id,
+        type = data.type,
+        childCount = record.childNodes.length;
 
-        var title = type == 'SCHOOL' ? '新增年级' : '新增班级';
-        var sumType = type == 'SCHOOL' ? 'GRADE' : 'CLASS';
+        let title = type == 'SCHOOL' ? '新增年级' : '新增班级';
+        let sumType = type == 'SCHOOL' ? 'GRADE' : 'CLASS';
         if(!win) {
             win = Ext.create('Ext.window.Window', {
                 width: 300,
                 height: 180,
-                renderTo: Ext.getBody(),
+                constrain: true,
                 references: 'treeaddwin',
                 modal: true,
                 bodyPadding: 10,
@@ -142,26 +196,141 @@ Ext.define('school.view.basic.class.ClassInfoController', {
                         text: '确定',
                         formBind: true,
                         handler: function() {
-                            var form = this.up('form');
-                            var text = form.getValues().text;
-                            var rootNode = treeList.getRootNode();
-                            var currentNode;
-                            var childNode = {
+                            let form = this.up('form');
+                            let text = form.getValues().text;
+                            let rootNode = treeList.getRootNode();
+                            let currentNode;
+                            let childNode = {
                                 text: text,
                                 type: sumType
                             };
-                            if(id == 'root') {
+                            let url, params, headers;
+                            if(type == 'SCHOOL') {
                                 currentNode = rootNode;
                                 childNode.leaf = false;
                                 childNode.children = [];
+                                // url = 'http://10.1.80.47:9560/grade/save';
+                                url = '/api/school/grade/save';
+                                params = {
+                                    grade: text,
+                                    no: childCount
+                                };
+                                headers = {
+                                    "Content-Type": 'application/x-www-form-urlencoded; charset=UTF-8'
+                                }
                             }else {
                                 currentNode = rootNode.findChild('id', id, true);
                                 childNode.leaf = true;
+                                // url = 'http://10.1.80.47:9560/grade/addClass';
+                                url = '/api/school/grade/addClass';
+                                params = JSON.stringify({
+                                    grade_id: _id,
+                                    clazz_name: text,
+                                    no: childCount
+                                });
                             }
-                            
-                            currentNode.appendChild(childNode);
-                            listCard.showNode(currentNode);
-                            win.close();
+
+                            view.setLoading(true);
+                            school.util.BaseUtil.request({
+                                url: url,
+                                method: 'POST',
+                                params: params,
+                                headers: headers
+                            }).then(function(res) {
+                                view.setLoading(false);
+                                childNode._id = res.data.id;
+                                currentNode.appendChild(childNode);
+                                listCard.showNode(currentNode);
+                                win.close();
+                            }).catch(function(e) {
+                                view.setLoading(false);
+                                school.util.BaseUtil.showErrorToast(e.message);
+                            });
+                        }
+                    }]
+                }]
+            });
+            view.add(win);
+        }
+        win.setTitle(title);
+        win.show();
+    },
+
+    showTreeEditWin: function(data) {
+        let me = this,
+        view = me.getView(),
+        refs = me.getReferences(),
+        treeList = refs.treelist,
+        listCard = refs.listcard,
+        win = refs.treeaddwin,
+        _id = data._id,
+        id = data.id,
+        type = data.type;
+
+        let title = type == 'GRADE' ? '修改年级' : '修改班级';
+        if(!win) {
+            win = Ext.create('Ext.window.Window', {
+                width: 300,
+                height: 180,
+                references: 'treeaddwin',
+                constrain: true,
+                modal: true,
+                bodyPadding: 10,
+                layout: 'fit',
+                items: [{
+                    xtype: 'form',
+                    layout: 'column',
+                    defaults: {
+                        columnWidth: 1
+                    },
+                    items: [{
+                        xtype: 'textfield',
+                        name: 'text',
+                        emptyText: '名称',
+                        value: data.text,
+                        allowBlank: false
+                    }],
+                    buttonAlign: 'center',
+                    buttons: [{
+                        text: '确定',
+                        formBind: true,
+                        handler: function() {
+                            let form = this.up('form');
+                            let text = form.getValues().text;
+                            let rootNode = treeList.getRootNode();
+                            let currentNode = rootNode.findChild('id', id, true);
+                            let url, params, headers;
+                            if(type == 'GRADE') {
+                                // url = 'http://10.1.80.47:9560/grade/update';
+                                url = '/api/school/grade/update';
+                                params = JSON.stringify({
+                                    grade_id: _id,
+                                    grade_name: text
+                                });
+                            }else {
+                                // url = 'http://10.1.80.47:9560/grade/updateClass';
+                                url = '/api/school/grade/updateClass';
+                                params = JSON.stringify({
+                                    clazz_id: _id,
+                                    clazz_name: text
+                                });
+                            }
+
+                            view.setLoading(true);
+                            school.util.BaseUtil.request({
+                                url: url,
+                                method: 'POST',
+                                params: params,
+                                headers: headers
+                            }).then(function(res) {
+                                view.setLoading(false);
+                                currentNode.set('text', text);
+                                currentNode.commit();
+                                win.close();
+                            }).catch(function(e) {
+                                view.setLoading(false);
+                                school.util.BaseUtil.showErrorToast(e.message);
+                            });
                         }
                     }]
                 }]

+ 1 - 1
frontend/pc-web/app/view/basic/class/ListCard.js

@@ -39,7 +39,7 @@ Ext.define('school.view.basic.class.ListCard', {
     },
 
     showNode: function(node) {
-        var me = this,
+        let me = this,
         classInfo = me.up('basic-class-classinfo'),
         viewModel = classInfo.getViewModel(),
         currentlist = viewModel.get('currentlist'),

+ 1 - 1
frontend/pc-web/app/view/basic/school/SchoolInfo.js

@@ -91,7 +91,7 @@ Ext.define('school.view.basic.school.SchoolInfo', {
         me.setLoading(true);
         school.util.BaseUtil.request({
             // url: 'http://10.1.80.35:9560/school/save',
-            url: '/school/save',
+            url: '/api/school/school/save',
             method: 'POST',
             params: JSON.stringify(values)
         })

+ 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');

+ 2 - 1
frontend/pc-web/app/view/viewport/ViewportModel.js

@@ -34,13 +34,14 @@ Ext.define('school.view.viewport.ViewportModel', {
             }],
             proxy: {
                 type: 'ajax',
-                // url: 'http://10.1.80.35:9520/grade/read/1',
+                // url: 'http://10.1.80.47:9560/grade/read/1',
                 url: '/api/school/grade/read/1',
                 reader: {
                     transform: {
                         fn: function(data) {
                             let schools = data.data.children;
                             schools.map(function(s) {
+                                s._id = s.id;
                                 s.id = 'school-' + s.id;
                                 let classes = s.children;
                                 classes.map(function(c) {

BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.eot


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
frontend/pc-web/packages/font-school/resources/fonts/iconfont.js


Разница между файлами не показана из-за своего большого размера
+ 9 - 0
frontend/pc-web/packages/font-school/resources/fonts/iconfont.svg


BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.ttf


BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff


BIN
frontend/pc-web/packages/font-school/resources/fonts/iconfont.woff2


+ 12 - 8
frontend/pc-web/packages/font-school/sass/etc/icons.scss

@@ -1,15 +1,19 @@
-.font-school {
-  font-family: "font-school" !important;
-  font-size: 16px;
-  font-style: normal;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
 .ss-nav-interaction:before {
   content: "\e905";
 }
 
+.ss-move:before {
+  content: "\e908";
+}
+
+.ss-down:before {
+  content: "\e906";
+}
+
+.ss-up:before {
+  content: "\e907";
+}
+
 .ss-nav-setting:before {
   content: "\e904";
 }

Разница между файлами не показана из-за своего большого размера
+ 0 - 2
frontend/pc-web/packages/font-school/sass/src/all.scss


+ 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 className='homework-item-title'>{homeWork.notifyName}</div>
-                        <span className={homeWork.taskStatus === 2 ? 'homework-item-done'
-                            : 'homework-item-todo'}>{homeWork.readStatus}</span>
+                        <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>

+ 2 - 1
frontend/wechat-web/src/components/MeetingSignItem.jsx

@@ -30,7 +30,8 @@ export default class MeetingSignItem extends Component {
         const {meetingBean} = this.state
 
         return (
-            <div className='meet-signItemLayout' onClick={this.onItemClick}>
+            <div className='meet-signItemLayout' onClick={this.onItemClick}
+                 style={{paddingBottom: this.props.isLast ? '80px' : '10px'}}>
                 <div className='signCreateTime'>{meetingBean.createTime}</div>
                 <div className='signContentlayout'>
                     <div className='titleLayout'>

+ 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)

+ 4 - 1
frontend/wechat-web/src/index.css

@@ -126,6 +126,10 @@ span.ant-select-selection.ant-select-selection--multiple {
     background: white !important;
 }
 
+.am-list-item .am-list-line .am-list-extra {
+    flex-basis: 30% !important;
+}
+
 /***************************公共样式****************************************/
 .common-column-layout {
     width: 100%;
@@ -238,7 +242,6 @@ span.ant-select-selection.ant-select-selection--multiple {
 .common-flex-row {
     display: flex;
     flex-direction: row;
-    align-items: center;
 }
 
 .common-flex-row-10 {

+ 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}
 })
 

+ 15 - 2
frontend/wechat-web/src/modules/announce/AnnounceRelease.jsx

@@ -169,6 +169,10 @@ class AnnounceRelease extends Component {
     }
 
     releaseAnnounce = () => {
+        if (this.isRequesting == true) {
+            return
+        }
+
         const {announceTitle, announceContent, fileList} = this.state
 
         if (isObjEmpty(announceTitle)) {
@@ -188,12 +192,18 @@ class AnnounceRelease extends Component {
             Toast.fail('通知标题过长')
             return
         }
-        Toast.loading('正在发布...', 0)
 
         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 = []
@@ -221,6 +231,8 @@ class AnnounceRelease extends Component {
 
         console.log(paramObj)
 
+        this.isRequesting = true
+        Toast.loading('正在发布...', 0)
         fetchPost(API.NOTIFY_CREATE, {
             jsonNotify: JSON.stringify(paramObj)
         }).then(response => {
@@ -237,6 +249,7 @@ class AnnounceRelease extends Component {
                 this.props.history.goBack()
             }, 1000)
         }).catch(error => {
+            this.isRequesting = false
             Toast.hide()
             if (typeof error === 'string') {
                 Toast.fail(error, 2)

+ 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 - 1
frontend/wechat-web/src/modules/hiPages/approvel-detail/ApprovelDetail.js

@@ -182,7 +182,8 @@ class ApprovelDetail extends Component{
                     showButton:false
                 })
                 this.backTask = setTimeout(()=>{
-                    this.props.history.push("/approvel")
+                    // this.props.history.push("/approvel")
+                    this.props.history.goBack()
                 },1000)
             }
         }).catch((error) =>{

+ 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>

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/approvel/Approvel.css

@@ -1,6 +1,6 @@
 .item-Style{
-    margin: 0px 10px;background-color: #FFFFFF;height: 76px;border-radius: 6px;
-    display: flex;flex-direction: row;width:50vh;
+    background-color: #FFFFFF;height: 76px;border-radius: 6px;
+    display: flex;flex-direction: row;width:100%;
 }
 .img_sty{
     height:45px;width: 45px;margin: 15px 10px;

+ 50 - 21
frontend/wechat-web/src/modules/hiPages/approvel/Approvel.js

@@ -21,7 +21,6 @@ import {Skeleton, List} from 'antd';
 import {getIntValue, getStrValue, isObjEmpty} from "../../../utils/common";
 import {saveListState} from "../../../redux/actions/listState";
 
-let mySwiper;
 let myApplypageIndex = 0;
 let myApprovepageIndex = 0;
 const mPageSize = 10
@@ -52,7 +51,7 @@ class Approvel extends Component {
         this.setState({
             height: hei
         })
-        mySwiper = new Swiper('.swiper-container', {
+      this.mySwiper = new Swiper('.swiper-container', {
             autoplay: false,
             loop: false,
             on: {
@@ -63,6 +62,14 @@ class Approvel extends Component {
                 }
             }
         })
+        console.log('listState', this.props.listState)
+        if (this.props.listState.tabIndex >= 0) {
+            this.setState({
+                selectIndex: this.props.listState.tabIndex
+            },function () {
+                this.mySwiper.slideTo(this.state.selectIndex, 0, false)
+            })
+        }
         if (this.props.listState && !isObjEmpty(this.props.listState.listData)) {
             console.log('11111')
             this.setState({
@@ -106,12 +113,17 @@ class Approvel extends Component {
                 onRefresh={this.getMyApplyData}
                 height={this.state.height}>
                 <Skeleton loading={this.state.isMyapplyding} active paragraph={{rows: 3}}>
-                    <List dataSource={this.state.applyList}
-                          renderItem={(applyListBean,index) => (
-                              <List.Item>
-                                  <ApprovelItem itemdata={applyListBean} isMyApply={true}   index={index} onItemClick={this.onItemClick.bind(this)}/>
-                              </List.Item>
-                          )}/>
+                    {
+                        this.state.applyList.map((itemdata,index) =>
+                            <ApprovelItem itemdata={itemdata} isMyApply={true}   index={index} onItemClick={this.onItemClick.bind(this)}/>
+                        )
+                    }
+                    {/*<List dataSource={this.state.applyList}*/}
+                          {/*renderItem={(applyListBean,index) => (*/}
+                              {/*<List.Item>*/}
+                                  {/*<ApprovelItem itemdata={applyListBean} isMyApply={true}   index={index} onItemClick={this.onItemClick.bind(this)}/>*/}
+                              {/*</List.Item>*/}
+                          {/*)}/>*/}
                 </Skeleton>
             </RefreshLayout>
 
@@ -124,12 +136,17 @@ class Approvel extends Component {
                 onRefresh={this.getMyApproveData}
                 height={this.state.height}>
                 <Skeleton loading={this.state.isMyapprovedload} active paragraph={{rows: 3}}>
-                    <List dataSource={this.state.approvelList}
-                          renderItem={(approvelListBean,index) => (
-                              <List.Item>
-                                  <ApprovelItem itemdata={approvelListBean}isMyApply={false}  index={index} onItemClick={this.onItemClick.bind(this)}/>
-                              </List.Item>
-                          )}/>
+                    {
+                        this.state.approvelList.map((itemdata,index) =>
+                            <ApprovelItem itemdata={itemdata}isMyApply={false}  index={index} onItemClick={this.onItemClick.bind(this)}/>
+                        )
+                    }
+                    {/*<List dataSource={this.state.approvelList}*/}
+                          {/*renderItem={(approvelListBean,index) => (*/}
+                              {/*<List.Item>*/}
+                                  {/*<ApprovelItem itemdata={approvelListBean}isMyApply={false}  index={index} onItemClick={this.onItemClick.bind(this)}/>*/}
+                              {/*</List.Item>*/}
+                          {/*)}/>*/}
                 </Skeleton>
             </RefreshLayout>
 
@@ -220,10 +237,15 @@ class Approvel extends Component {
                         applyList: response.data.proposes,
                     })
                 } else if(response.data.proposes.length > 0 && response.data.proposes != []){
-                    this.setState({
-                        applyList: this.state.applyList.push(response.data.proposes),
+                    var applyList = this.state.applyList
+                    response.data.proposes.forEach((itemdata,index) =>{
+                        applyList.push(itemdata)
+                    },() =>{
+                        this.setState({
+                            applyList: applyList,
+                        })
                     })
-                    console.log("proposes.length",response.data.proposes.length)
+                    console.log("applyList.length",applyList.length)
                 }
                 console.log("applyList",this.state.applyList)
                 console.log("myApplypageIndex",myApplypageIndex)
@@ -233,6 +255,7 @@ class Approvel extends Component {
                 isMyapplydload: false,
             })
         }).catch((error) => {
+            console.log('error',error)
             if (typeof error === 'string') {
                 Toast.fail(error, 2)
             } else {
@@ -267,9 +290,15 @@ class Approvel extends Component {
                         approvelList: response.data.approves
                     })
                 } else if(response.data.approves.length > 0){
-                    this.setState({
-                        approvelList: this.state.approvelList.push(response.data.approves)
+                    var approvelList = this.state.approvelList
+                    response.data.proposes.forEach((itemdata,index) =>{
+                        approvelList.push(itemdata)
+                    },() =>{
+                        this.setState({
+                            approvelList: approvelList,
+                        })
                     })
+                    console.log("approvelList.length",approvelList.length)
                 }
                 console.log("approvelList",this.state.approvelList)
             }
@@ -300,7 +329,7 @@ class Approvel extends Component {
         this.setState({
             selectIndex: 0
         }, () => {
-            mySwiper.slideTo(this.state.selectIndex, 300, false)
+            this.mySwiper.slideTo(this.state.selectIndex, 300, false)
         })
     }
 
@@ -308,7 +337,7 @@ class Approvel extends Component {
         this.setState({
             selectIndex: 1
         }, () => {
-            mySwiper.slideTo(this.state.selectIndex, 300, false)
+            this.mySwiper.slideTo(this.state.selectIndex, 300, false)
         })
     }
 

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

@@ -36,25 +36,27 @@ export default class ApprovelItem extends Component{
 
         const {itemdata,isMyApply,approveId} = this.state
         return(
-                    <Link to={"/approvel-detail/" + approveId +"/"+isMyApply}>
-                        <div className="item-Style" onClick={this.ItemClick.bind(this,isMyApply,itemdata,this.props.index)}>
-                            <div style={{width:'20%'}}>
-                                <div style={{width:76,height:'100%'}}>
-                                    <img src={itemdata.approveType == 1 ? icon_trip : (itemdata.approveType == 2 ? icon_res : icon_leave)} className={isMyApply==true?'img_sty':"img_circle"}/>
+                    <div style={{padding:10}}>
+                        <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%'}}>
+                                        <img src={itemdata.approveType == 1 ? icon_trip : (itemdata.approveType == 2 ? icon_res : icon_leave)} className={isMyApply==true?'img_sty':"img_circle"}/>
+                                    </div>
                                 </div>
-                            </div>
-                            <div style={{width:'65%'}}>
-                                <div style={{color:"#333333",fontSize:15,marginTop:10}}>
-                                    {itemdata.approveType == 1 ? '出差申请' :  (itemdata.approveType == 2 ? '用品申请' : '请假申请' )}
+                                <div style={{width:'65%'}}>
+                                    <div style={{color:"#333333",fontSize:15,marginTop:10}}>
+                                        {itemdata.approveType == 1 ? '出差申请' :  (itemdata.approveType == 2 ? '用品申请' : '请假申请' )}
+                                    </div>
+                                    <div style={{color:"#666666",fontSize:12,marginTop:15}}>{this.props.itemdata.creatDate}</div>
+                                </div>
+                                <div className={itemdata.approveStatus==1?'doing':'done'}
+                                     style={{textAlign:'left',marginTop:10,fontSize:12,width:'15%'}}>
+                                    {itemdata.approveStatus == 1 ? "待审批" :"已审批"}
                                 </div>
-                                <div style={{color:"#666666",fontSize:12,marginTop:15}}>{this.props.itemdata.creatDate}</div>
-                            </div>
-                            <div className={itemdata.approveStatus==1?'doing':'done'}
-                                 style={{textAlign:'left',marginTop:10,fontSize:12,width:'15%'}}>
-                                {itemdata.approveStatus == 1 ? "待审批" :"已审批"}
                             </div>
-                        </div>
-                    </Link>
+                        </Link>
+                    </div>
         )
     }
     ItemClick =(isMyApply,data,index)=>{

+ 3 - 4
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,
@@ -86,7 +84,8 @@ let mSeconds = 0;
                      this.setState({
                          changeSuccess:true
                      },function () {
-                         this.props.history.push('/homepage/')
+                         // this.props.history.push('/homepage/')
+                         this.props.history.goBack()
                      })
                  }
              })

+ 1 - 1
frontend/wechat-web/src/modules/hiPages/field-trip/FieldTrip.js

@@ -146,7 +146,7 @@ class FieldTrip extends Component {
                 <div className="comhline_sty"></div>
 
                 <textarea ref='tripsReason' className="form-control textarea_sty" rows="5" placeholder="请填写出差事由…"
-                          value={this.state.tripsReason}></textarea>
+                          value={this.state.tripsReason} maxLength={100}></textarea>
                 <div className="comhline_sty1"></div>
                 {this.state.targetData.length > 0 ? <TargetSelect {...targetProps}/>
                     : <TargetSelect {...defaultTargetProps}/>}

+ 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 - 11
frontend/wechat-web/src/modules/hiPages/res_apply/ResApply.js

@@ -87,7 +87,7 @@ class ResApply extends Component{
                 <div className="comhline_sty"></div>
                 <div className="item_sty">
                     <div className="left_title">物品用途</div>
-                    <input ref='resUser' className="text-right right_input" type="text" placeholder="请输入"  autoFocus="autoFocus" value={this.state.resUser}/>
+                    <input ref='resUser' className="text-right right_input" type="text" placeholder="请输入" maxLength={20} autoFocus="autoFocus" value={this.state.resUser}/>
                 </div>
 
                 <div >
@@ -95,19 +95,10 @@ class ResApply extends Component{
                     <div onClick={this.addUserItem} className="text-center" style={{color:"#0CE11D",fontSize:12,margin:10}}>+ <span style={{color:"#666666",borderBottom:"1px #000 solid"}}>添加物品明细</span></div>
                 </div>
 
-                <textarea ref='receivingSays' className="form-control textarea_sty" rows="5"  placeholder="领取说明"  value={this.state.receivingSays}  maxLength={400}></textarea>
+                <textarea ref='receivingSays' className="form-control textarea_sty" rows="5"  placeholder="领取说明"  value={this.state.receivingSays}  maxLength={100}></textarea>
                 <div className="comhline_sty1"></div>
 
 
-                {/*<div className="common-column-layout">*/}
-                {/*<Picker*/}
-                {/*data={this.state.receiverPerson} title='接收人' extra='请选择'*/}
-                {/*value={this.state.Receiver}*/}
-                {/*onChange={this.handleSelectChange}*/}
-                {/*onOk={this.handleSelectChange} cols={1}>*/}
-                {/*<List.Item arrow="horizontal" >接收人</List.Item>*/}
-                {/*</Picker>*/}
-                {/*</div>*/}
                 {this.state.targetData.length > 0 ? <TargetSelect {...targetProps}/>
                     : <TargetSelect {...defaultTargetProps}/>}
                 <div className="comhline_sty"></div>

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

@@ -7,6 +7,8 @@ import React,{Component} from 'react';
 import './ResApply.css';
 import delete_img from '../../../style/imgs/delete.png';
 import {Icon} from 'antd';
+import {Toast} from 'antd-mobile';
+
 
 export default class UserItem extends Component{
     constructor(props){
@@ -23,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="请输入"  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>
@@ -42,11 +44,23 @@ export default class UserItem extends Component{
         //请输入选项内容
         let itemuser = this.refs.itemuser.value;
         let itemnumber = this.refs.itemnumber.value;
-        // console.log('itemuser',itemuser)
-        // console.log('itemnumber',itemnumber)
-        this.props.handelRItem({
-            artName:itemuser,
-            artCount:itemnumber
-        },this.props.index)
+        console.log('itemuser',itemuser)
+        console.log('itemnumber',itemnumber)
+        console.log('itemnumber%1 === 0',itemnumber%1 == 0)
+        if(itemnumber.length > 0){
+            if(itemnumber%1 == 0 && itemnumber > 0){
+                this.props.handelRItem({
+                    artName:itemuser,
+                    artCount:itemnumber
+                },this.props.index)
+            }else {
+                Toast.show('请输入正整数',1)
+                this.props.handelRItem({
+                    artName:itemuser,
+                    artCount:''
+                },this.props.index)
+                return
+            }
+        }
     }
 }

+ 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)
         })
     }
 

+ 2 - 2
frontend/wechat-web/src/modules/hiPages/send-vote/SendVote.js

@@ -269,7 +269,7 @@ class SendVote extends Component {
             return
         }
 
-        if (this.state.voteTitle.trim().length > 80) {
+        if (this.state.voteTitle.trim().length > 100) {
             Toast.fail('投票主题内容过长')
             return
         }
@@ -280,7 +280,7 @@ class SendVote extends Component {
                 return
             }
 
-            if (this.state.voteOptionss[i].trim().length > 80) {
+            if (this.state.voteOptionss[i].trim().length > 100) {
                 Toast.fail('选项' + (i + 1) + '内容过长...')
                 return
             }

+ 17 - 12
frontend/wechat-web/src/modules/hiPages/sendMeetting/SendMeet.js

@@ -64,7 +64,7 @@ class SendMeet extends Component {
                         title: `全体老师`,
                         value: `0`,
                         key: `0`,
-                        selectable:false,
+                        selectable: false,
                         children: teacherData,
                     })
                 }
@@ -138,12 +138,13 @@ class SendMeet extends Component {
             onTargetFocus: this.onTargetFocus.bind(this)
         }
         return (
-            <div onChange={this.handelValueCom} style={{fontFamily: "PingFangSC-Regular", letterSpacing: 2.5}} className='common-column-layout'>
+            <div onChange={this.handelValueCom} style={{fontFamily: "PingFangSC-Regular", letterSpacing: 2.5}}
+                 className='common-column-layout'>
                 {/*<p>{new Date().getTime()}</p>*/}
                 <textarea autoFocus="autoFocus" ref='meetTitle' className="form-control textarea_sty" rows="2"
-                          placeholder="请填写会议主题…"  maxLength={20}></textarea>
+                          placeholder="请填写会议主题…"  maxLength={50}></textarea>
                 <textarea ref='meetAddress' className="form-control textarea_sty" rows="3"
-                          placeholder="请填写会议地址…"  maxLength={50}></textarea>
+                          placeholder="请填写会议地址…"  maxLength={100}></textarea>
                 <div className="comhline_sty"></div>
                 <div className="common-column-layout" style={{fontSize: 15}}>
                     <DatePicker
@@ -179,7 +180,7 @@ class SendMeet extends Component {
                 {this.state.targetData.length > 0 ? <TargetSelect {...targetProps}/>
                     : <TargetSelect {...defaultTargetProps}/>}
                 {/*<center><Button type="button" className="btn btn-primary comBtn_sty"*/}
-                                {/*onClick={this.doSaveClick}>创建</Button></center>*/}
+                {/*onClick={this.doSaveClick}>创建</Button></center>*/}
 
                 <Button className='commonButton' type='primary' style={{margin: '35px'}}
                         onClick={this.doSaveClick}>创建</Button>
@@ -188,7 +189,7 @@ class SendMeet extends Component {
     }
 
     doSaveClick = (event) => {
-        if(this.isRequesting == true){
+        if (this.isRequesting == true) {
             return
         }
         console.log('state', this.state)
@@ -200,15 +201,15 @@ class SendMeet extends Component {
             Toast.fail('请填写会议地址...')
             return
         }
-        if (this.state.startValue == null ) {
+        if (this.state.startValue == null) {
             Toast.fail('请选择开始时间...')
             return
         }
-        if (this.state.endValue == null ) {
+        if (this.state.endValue == null) {
             Toast.fail('请选择结束时间...')
             return
         }
-        if (this.state.earlyTime == null ){
+        if (this.state.earlyTime == null) {
             Toast.fail('请选择提醒时间...')
             return
         }
@@ -221,6 +222,10 @@ class SendMeet extends Component {
             this.checkNodes.forEach((node, index) => {
                 userList.push(node.userId)
             })
+
+            if (!isObjEmpty(this.props.userInfo.user.userFunId) && userList.indexOf(this.props.userInfo.user.userFunId) === -1) {
+                userList.push(this.props.userInfo.user.userFunId)
+            }
         }
         var nowT = new Date().getTime()
         var startT = new Date(this.state.startValue).getTime()
@@ -245,7 +250,7 @@ class SendMeet extends Component {
         console.log('noticeT', new Date(noticeT))
 
         let params = {
-            meetingCreator:this.props.userInfo.user.userFunId,
+            meetingCreator: this.props.userInfo.user.userFunId,
             meetingStatus: 1,
             meetingName: this.state.titleValue,
             meetingAddress: this.state.meetAddress,
@@ -254,7 +259,7 @@ class SendMeet extends Component {
             reminderDate: moment(new Date(noticeT)).format('YYYY-MM-DD HH:mm:ss'),
             meetingNotifier: JSON.stringify(userList),
             meetingRemarks: "会议备注",
-            meetingFiles:"[]",
+            meetingFiles: "[]",
             meetingDetails: "一定要参加",
         }
 
@@ -263,7 +268,7 @@ class SendMeet extends Component {
         Toast.loading("会议创建中...", 0)
         this.isRequesting = true
         fetchPost(API.createMeeting, {
-            jsonMeeting:JSON.stringify(params)
+            jsonMeeting: JSON.stringify(params)
         }, {})
             .then((response) => {
                 this.isRequesting = false

+ 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";

+ 2 - 2
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}
@@ -209,7 +209,7 @@ class AssignmentDetailPage extends React.Component {
                     {this.state.files.length != 0 ? (<img onClick={this.onClickImage.bind(this)}
                                                           style={{margin: "0px"}}
                                                           src={this.state.files[0]}
-                                                          width={260} height={130}/>) : ("")}
+                                                          height={130}/>) : ("")}
 
                 </div>
                 <div className="margin_top_bottom_10 homework-detail-leave-caption">留言{this.state.data.length != 0 ? (

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

@@ -114,6 +114,11 @@ class ReleaseAssignmentPage extends React.Component {
             Toast.fail("请输入作业名称");
             return;
         }
+        if (taskTitle.length > 50) {
+            Toast.fail('作业名称过长')
+            return
+        }
+
         if (isObjEmpty(taskContent)) {
             Toast.fail('请输入作业内容')
             return;
@@ -138,8 +143,9 @@ class ReleaseAssignmentPage extends React.Component {
                 fileUrls.push(value.picUrl)
             })
         }
-        Toast.loading('正在发布...', 0)
 
+
+        Toast.loading('正在发布...', 0)
         const params = {
             subjectId: 1,
             taskTitle: taskTitle,

+ 1 - 1
frontend/wechat-web/src/modules/leave/LeaveAddCPage.js

@@ -114,7 +114,7 @@ class LeaveAddCPage extends Component {
                 <div className="comhline_sty"></div>
                 <div onChange={this.handelValueCom}>
                     <textarea  ref='leaveReason' className="form-control textarea_sty" rows="4"
-                               placeholder="请填写请假内容" maxLength={400}></textarea>
+                               placeholder="请填写请假内容" maxLength={100}></textarea>
                 </div>
                 <div className="comhline_sty"></div>
                 {this.state.targetData.length > 0 ? <TargetSelect {...targetProps}/>

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

@@ -93,7 +93,7 @@ class LeaveAddPage extends Component{
                 <div className="comhline_sty"></div>
                 <div onChange={this.handelValueCom}>
                     <textarea  ref='leaveReason' className="form-control textarea_sty" rows="4"
-                               placeholder="请填写请假事由" maxLength={400}></textarea>
+                               placeholder="请填写请假事由" maxLength={100}></textarea>
                 </div>
                 <div className="comhline_sty"></div>
                 {this.state.targetData.length > 0 ? <TargetSelect {...targetProps}/>
@@ -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),

+ 1 - 1
frontend/wechat-web/src/modules/leave/LeaveItem.css

@@ -1,7 +1,7 @@
 .item_contain{
  height: 115px;background: #FFFFFF;  border-radius: 10px;text-align: center;padding: 10px;
 }
-.row_sty{
+.leave_row_sty{
     display: flex;flex-direction: row;
 }
 .title_sty{

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

@@ -5,6 +5,7 @@
 
 import React,{Component} from 'react';
 import {Link} from 'react-router-dom';
+import './LeaveItem.css';
 
 export default class LeaveItem extends Component {
     constructor(props) {
@@ -17,13 +18,12 @@ export default class LeaveItem extends Component {
     render() {
         const {item} = this.state;
         return (
-            <div>
+            <div style={{padding:10}}>
                 <Link to={'/leavedetail/' + this.props.role + '/' + item.lvId}>
-                    <div className="col-xs-12 " style={{backgroundColor: '#FFF', width: '53vh'}}
-                         onClick={this.ItemClick.bind(this, this.props.index)}>
-                        <div className="row flex">
-                            <div id="global_page_title" style={{fontSize: 15, color: "#333333"}}>  {item.title}</div>
-                            <div className="item_flex_1  flex_row_right margin_left_right_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'}}>
                                 {
                                     this.state.role == "parent" ? '' :
                                         <div>
@@ -36,17 +36,14 @@ export default class LeaveItem extends Component {
                                 }
                             </div>
                         </div>
-                        <div className="row">
-                            <div className="col-xs-3" id="col-clear" style={{fontSize: 12, color: "#666666"}}>请假时间:
-                            </div>
-                            <div className="col-xs-9" id="col-clear-start"
-                                 style={{fontSize: 12, color: "#333333"}}>{item.startTime}—{item.endTime}</div>
+                        <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.startTime}—{item.endTime}</div>
                         </div>
-                        <div className="row " style={{marginTop: 10, marginBottom: 10}}>
-                            <div className="col-xs-3" id="col-clear" style={{fontSize: 12, color: "#666666"}}>请假事由:
-                            </div>
-                            <div className="col-xs-9" id="col-clear-start"
-                                 style={{fontSize: 12, color: "#333333"}}>{item.content}</div>
+
+                        <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%',wordWrap:'break-word'}}>{item.content}</div>
                         </div>
                     </div>
                 </Link>

+ 10 - 7
frontend/wechat-web/src/modules/leave/LeaveListPage.js

@@ -66,7 +66,7 @@ class LeaveListPage extends React.Component{
 
 
     render(){
-        return <div  style={{background: '#F2F2F2'}}>
+        return <div   style={{background: '#F2F2F2'}}>
 
             <RefreshLayout
                         refreshing={this.state.isRefreshing}
@@ -75,12 +75,15 @@ class LeaveListPage extends React.Component{
                         }}
                         onRefresh={this.getListData}>
                         <Skeleton loading={this.state.isLoading} active paragraph={{rows: 3}}>
-                            <List dataSource={this.state.data}
-                                  renderItem={(itemdata,index) =>(
-                                      <List.Item   id="row_background"  >
-                                          <LeaveItem itemdata={itemdata} role={this.state.role} index = {index} onItemClick={this.onItemClick.bind(this)}></LeaveItem>
-                                      </List.Item>
-                                  )}/>
+                            {/*{this.state.selectContentArray.map((itemata,index) => <UserItem index ={index} itemata = {itemata} handelRItem={this.handelRItem} removeSItem={this.removeSItem}></UserItem>)}*/}
+                            {this.state.data.map((itemdata,index) =>  <LeaveItem itemdata={itemdata} role={this.state.role} index = {index} onItemClick={this.onItemClick.bind(this)}></LeaveItem>
+                            )}
+                            {/*<List dataSource={this.state.data}*/}
+                                  {/*renderItem={(itemdata,index) =>(*/}
+                                      {/*<List.Item  >*/}
+                                          {/*<LeaveItem itemdata={itemdata} role={this.state.role} index = {index} onItemClick={this.onItemClick.bind(this)}></LeaveItem>*/}
+                                      {/*</List.Item>*/}
+                                  {/*)}/>*/}
                         </Skeleton>
                     </RefreshLayout>
                     {

+ 4 - 3
frontend/wechat-web/src/modules/meeting/MeetingSignIn.jsx

@@ -66,6 +66,7 @@ class MeetingSignIn extends Component {
                                   <MeetingSignItem
                                       meetingBean={item}
                                       index={index}
+                                      isLast={index === (meetingSignList.length - 1)}
                                       onMeetingSign={this.onMeetingSign.bind(this)}
                                       onItemClick={this.onItemClick.bind(this)}/>
                               )}/>
@@ -167,8 +168,8 @@ class MeetingSignIn extends Component {
         const {meetingSignList} = this.state
 
         Toast.loading('', 0)
-        console.log("teacherId:",this.props.userInfo.user.userFunId)
-        console.log("meetingId:",meetingSignList[index].meetId)
+        console.log("teacherId:", this.props.userInfo.user.userFunId)
+        console.log("meetingId:", meetingSignList[index].meetId)
         fetchPost(API.MEETING_SIGN, {
             teacherId: this.props.userInfo.user.userFunId,
             meetingId: meetingSignList[index].meetId,
@@ -178,7 +179,7 @@ class MeetingSignIn extends Component {
             meetingSignList[index].signStatus = '已签到'
             meetingSignList[index].signStatusCode = 3
 
-            this.setState({meetingSignList},()=>{
+            this.setState({meetingSignList}, () => {
                 saveListState({
                     scrollTop: ReactDOM.findDOMNode(this.container).scrollTop,
                     listData: this.state.meetingSignList,

+ 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

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

@@ -130,7 +130,7 @@ class PhonesList extends Component {
         this.setState({
             isLoading: true,
             isRefreshing: false,
-            searchKey: value
+            searchKey: value.trim()
         }, () => {
             this.loadPhones()
         })

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

@@ -110,7 +110,7 @@ class PhonesSearch extends Component {
         this.setState({
             isLoading: true,
             isRefreshing: false,
-            searchKey: value
+            searchKey: value.trim()
         }, () => {
             this.loadPhones()
         })

+ 19 - 7
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: ''
             }
         };
     }
@@ -42,10 +42,12 @@ class VoteDetailPage extends React.Component {
 
     componentWillMount() {
         document.title = "投票";
+        role = this.props.match.params.role
+
+        this.searchParams = getSearchParams(this.props.location.search)
     }
 
     componentDidMount() {
-        role = this.props.match.params.role
         this.getVoteDetail();
     }
 
@@ -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: '',

+ 2 - 2
frontend/wechat-web/src/style/css/consume-re.css

@@ -219,8 +219,8 @@
     border-radius: 6px 6px 0 0;
     padding-bottom: 20px;
     text-align: left;
-    min-height: 250px;
-    max-height: 70vh;
+    /*min-height: 250px;*/
+    /*max-height: 70vh;*/
     overflow-y: scroll;
 }
 

+ 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 {

+ 1 - 1
frontend/wechat-web/src/style/css/payment.css

@@ -112,10 +112,10 @@
     width: 100%;
     display: flex;
     padding: 5px 0 5px 20px;
-    align-items: center;
     font-family: PingFangSC-Regular;
     font-size: 13px;
     letter-spacing: 0;
+    flex-direction: row;
 }
 
 .recharge-item-caption {

+ 45 - 24
frontend/wechat-web/src/utils/common.js

@@ -330,24 +330,28 @@ export const getCheckedCount = (checkedNodes) => {
         let quantity = 0
         for (let i = 0; i < checkedNodes.length; i++) {
             let checkedNode = checkedNodes[i]
-            if (checkedNode.node) {
-                if (checkedNode.children) {
-                    checkedNode = checkedNode.children
-                    quantity = quantity + getCheckedCount(checkedNode)
-                } else {
-                    quantity = quantity + 1
-                    continue
-                }
-            } else {
-                if (checkedNode.props) {
-                    if (checkedNode.props.children.length > 0) {
-                        checkedNode = checkedNode.props.children
+            if (checkedNode) {
+                if (checkedNode.node) {
+                    if (checkedNode.children) {
+                        checkedNode = checkedNode.children
                         quantity = quantity + getCheckedCount(checkedNode)
                     } else {
                         quantity = quantity + 1
                         continue
                     }
+                } else {
+                    if (checkedNode.props) {
+                        if (checkedNode.props.children.length > 0) {
+                            checkedNode = checkedNode.props.children
+                            quantity = quantity + getCheckedCount(checkedNode)
+                        } else {
+                            quantity = quantity + 1
+                            continue
+                        }
+                    }
                 }
+            } else {
+                continue
             }
         }
         return quantity
@@ -361,18 +365,9 @@ export const getNodes = (checkedNodes) => {
         let childNodes = []
         for (let i = 0; i < checkedNodes.length; i++) {
             let checkedNode = checkedNodes[i]
-            if (checkedNode.node && checkedNode.node.props) {
-                const checkProps = checkedNode.node.props
-                if (!isObjEmpty(checkProps.children)) {
-                    checkedNode = checkProps.children
-                    childNodes = childNodes.concat(getNodes(checkedNode))
-                } else {
-                    childNodes.push(checkProps)
-                    continue
-                }
-            } else {
-                if (checkedNode.props) {
-                    const checkProps = checkedNode.props
+            if (checkedNode) {
+                if (checkedNode.node && checkedNode.node.props) {
+                    const checkProps = checkedNode.node.props
                     if (!isObjEmpty(checkProps.children)) {
                         checkedNode = checkProps.children
                         childNodes = childNodes.concat(getNodes(checkedNode))
@@ -380,7 +375,20 @@ export const getNodes = (checkedNodes) => {
                         childNodes.push(checkProps)
                         continue
                     }
+                } else {
+                    if (checkedNode.props) {
+                        const checkProps = checkedNode.props
+                        if (!isObjEmpty(checkProps.children)) {
+                            checkedNode = checkProps.children
+                            childNodes = childNodes.concat(getNodes(checkedNode))
+                        } else {
+                            childNodes.push(checkProps)
+                            continue
+                        }
+                    }
                 }
+            } else {
+                continue
             }
         }
         return childNodes
@@ -417,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;
+}
+

Некоторые файлы не были показаны из-за большого количества измененных файлов