xiongzhu 4 년 전
부모
커밋
dff75423bf

+ 12 - 0
db_migrate/2021-04-26.001.sql

@@ -0,0 +1,12 @@
+update article set main_type = '通知通告' where type_id = 1108;
+update article set main_type = '热点推荐' where type_id = 1002;
+update article set main_type = '新闻资讯' where type_id = 1003;
+update article set main_type = '行业动态' where type_id = 1004;
+update article set main_type = '首页轮播' where type_id = 1005;
+update article set main_type = '首页置顶' where type_id = 1006;
+update article set main_type = '政策法规', sub_type = '国家政策法规' where type_id = 1067;
+update article set main_type = '政策法规', sub_type = '部改委政策法规' where type_id = 1068;
+update article set main_type = '政策法规', sub_type = '军方政策法规' where type_id = 1069;
+update article set main_type = '政策法规', sub_type = '创新政策法规' where type_id = 1070;
+update article set main_type = '政策法规', sub_type = '地方政策法规' where type_id = 1071;
+update article set main_type = '政策法规', sub_type = '其他政策法规' where type_id = 1072;

+ 6 - 0
src/main/java/com/izouma/jmrh/domain/Article.java

@@ -40,6 +40,12 @@ public class Article extends BaseEntity {
     //@JsonIgnore
     private DataType type;
 
+    @ApiModelProperty("一级分类")
+    private String mainType;
+
+    @ApiModelProperty("二级分类")
+    private String subType;
+
     @ApiModelProperty("审核状态")
     @Enumerated(EnumType.STRING)
     private AuditStatus status;

+ 34 - 0
src/main/java/com/izouma/jmrh/domain/ArticleType.java

@@ -0,0 +1,34 @@
+package com.izouma.jmrh.domain;
+
+import com.izouma.jmrh.annotations.Searchable;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.validation.constraints.Pattern;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+public class ArticleType extends AuditedEntity {
+
+    @Id
+    @Column(length = 50, unique = true)
+    @ApiModelProperty("名称")
+    @Searchable
+    private String name;
+
+    @Searchable
+    @ApiModelProperty("描述")
+    private String description;
+
+    @ApiModelProperty("上级分类")
+    private String parent;
+
+    private int level;
+}

+ 52 - 0
src/main/java/com/izouma/jmrh/domain/Editing.java

@@ -0,0 +1,52 @@
+package com.izouma.jmrh.domain;
+
+import com.izouma.jmrh.annotations.Searchable;
+import com.izouma.jmrh.enums.AuditStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel("采编")
+public class Editing extends BaseEntity {
+    @Searchable
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("封面")
+    private String cover;
+
+    @ApiModelProperty("内容")
+    @Column(columnDefinition = "TEXT")
+    private String content;
+
+    @ApiModelProperty("发布")
+    private boolean publish;
+
+    @ApiModelProperty("类型")
+    private Long typeId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "typeId", referencedColumnName = "id", insertable = false, updatable = false)
+    //@JsonIgnore
+    private DataType type;
+
+    @ApiModelProperty("一级分类")
+    private String mainType;
+
+    @ApiModelProperty("二级分类")
+    private String subType;
+
+    @ApiModelProperty("审核状态")
+    @Enumerated(EnumType.STRING)
+    private AuditStatus status;
+}

+ 8 - 0
src/main/java/com/izouma/jmrh/repo/ArticleTypeRepo.java

@@ -0,0 +1,8 @@
+package com.izouma.jmrh.repo;
+
+import com.izouma.jmrh.domain.ArticleType;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface ArticleTypeRepo extends JpaRepository<ArticleType, String>, JpaSpecificationExecutor<ArticleType> {
+}

+ 8 - 0
src/main/java/com/izouma/jmrh/repo/EditingRepo.java

@@ -0,0 +1,8 @@
+package com.izouma.jmrh.repo;
+
+import com.izouma.jmrh.domain.Editing;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface EditingRepo extends JpaRepository<Editing, Long>, JpaSpecificationExecutor<Editing> {
+}

+ 14 - 0
src/main/java/com/izouma/jmrh/service/ArticleTypeService.java

@@ -0,0 +1,14 @@
+package com.izouma.jmrh.service;
+
+import com.izouma.jmrh.domain.ArticleType;
+import com.izouma.jmrh.repo.ArticleTypeRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ArticleTypeService {
+
+    private ArticleTypeRepo articleTypeRepo;
+
+}

+ 14 - 0
src/main/java/com/izouma/jmrh/service/EditingService.java

@@ -0,0 +1,14 @@
+package com.izouma.jmrh.service;
+
+import com.izouma.jmrh.domain.Editing;
+import com.izouma.jmrh.repo.EditingRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class EditingService {
+
+    private EditingRepo editingRepo;
+
+}

+ 63 - 0
src/main/java/com/izouma/jmrh/web/ArticleTypeController.java

@@ -0,0 +1,63 @@
+package com.izouma.jmrh.web;
+
+import com.izouma.jmrh.domain.ArticleType;
+import com.izouma.jmrh.service.ArticleTypeService;
+import com.izouma.jmrh.dto.PageQuery;
+import com.izouma.jmrh.exception.BusinessException;
+import com.izouma.jmrh.repo.ArticleTypeRepo;
+import com.izouma.jmrh.utils.ObjUtils;
+import com.izouma.jmrh.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/articleType")
+@AllArgsConstructor
+public class ArticleTypeController extends BaseController {
+    private ArticleTypeService articleTypeService;
+    private ArticleTypeRepo    articleTypeRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public ArticleType save(@RequestBody ArticleType record) {
+        if (record.getName() != null) {
+            ArticleType orig = articleTypeRepo.findById(record.getName()).orElse(null);
+            if (orig != null) {
+                ObjUtils.merge(orig, record);
+                return articleTypeRepo.save(orig);
+            }
+        }
+        return articleTypeRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<ArticleType> all(PageQuery pageQuery) {
+        return articleTypeRepo.findAll(toSpecification(pageQuery, ArticleType.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public ArticleType get(@PathVariable String id) {
+        return articleTypeRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable String id) {
+        articleTypeRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<ArticleType> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 60 - 0
src/main/java/com/izouma/jmrh/web/EditingController.java

@@ -0,0 +1,60 @@
+package com.izouma.jmrh.web;
+import com.izouma.jmrh.domain.Editing;
+import com.izouma.jmrh.service.EditingService;
+import com.izouma.jmrh.dto.PageQuery;
+import com.izouma.jmrh.exception.BusinessException;
+import com.izouma.jmrh.repo.EditingRepo;
+import com.izouma.jmrh.utils.ObjUtils;
+import com.izouma.jmrh.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/editing")
+@AllArgsConstructor
+public class EditingController extends BaseController {
+    private EditingService editingService;
+    private EditingRepo editingRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Editing save(@RequestBody Editing record) {
+        if (record.getId() != null) {
+            Editing orig = editingRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return editingRepo.save(orig);
+        }
+        return editingRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<Editing> all(PageQuery pageQuery) {
+        return editingRepo.findAll(toSpecification(pageQuery,Editing.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public Editing get(@PathVariable Long id) {
+        return editingRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        editingRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Editing> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 1 - 1
src/main/resources/genjson/ArticleType.json

@@ -1 +1 @@
-{"tableName":"ArticleType","className":"ArticleType","remark":"文章类型管理","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":false,"javaPath":"/Users/drew/Projects/Java/jmrh-back/src/main/java/com/izouma/jmrh","viewPath":"/Users/drew/Projects/Java/jmrh-back/src/main/vue/src/views","routerPath":"/Users/drew/Projects/Java/jmrh-back/src/main/vue/src","resourcesPath":"/Users/drew/Projects/Java/jmrh-back/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"名称","showInList":true,"showInForm":true,"formType":"singleLineText","required":true},{"name":"remark","modelName":"remark","remark":"备注","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.jmrh","tablePackage":"com.izouma.jmrh.domain.ArticleType"}
+{"tableName":"ArticleType","className":"ArticleType","remark":"类型管理","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/drew/Projects/Java/jmrh/src/main/java/com/izouma/jmrh","viewPath":"/Users/drew/Projects/Java/jmrh/src/main/vue/src/views","routerPath":"/Users/drew/Projects/Java/jmrh/src/main/vue/src","resourcesPath":"/Users/drew/Projects/Java/jmrh/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"名称","showInList":true,"showInForm":true,"formType":"singleLineText","required":true},{"name":"description","modelName":"description","remark":"描述","showInList":true,"showInForm":true,"formType":"singleLineText","required":true},{"name":"parent","modelName":"parent","remark":"上级分类","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"level","modelName":"level","remark":"level","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.jmrh","tablePackage":"com.izouma.jmrh.domain.ArticleType"}

+ 1 - 0
src/main/resources/genjson/Editing.json

@@ -0,0 +1 @@
+{"tableName":"Editing","className":"Editing","remark":"采编管理","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/drew/Projects/Java/jmrh/src/main/java/com/izouma/jmrh","viewPath":"/Users/drew/Projects/Java/jmrh/src/main/vue/src/views","routerPath":"/Users/drew/Projects/Java/jmrh/src/main/vue/src","resourcesPath":"/Users/drew/Projects/Java/jmrh/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"title","modelName":"title","remark":"标题","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"cover","modelName":"cover","remark":"封面","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"content","modelName":"content","remark":"内容","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"publish","modelName":"publish","remark":"发布","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"typeId","modelName":"typeId","remark":"类型","showInList":true,"showInForm":true,"formType":"number"},{"name":"type","modelName":"type","remark":"type","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"mainType","modelName":"mainType","remark":"一级分类","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"subType","modelName":"subType","remark":"二级分类","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"status","modelName":"status","remark":"审核状态","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"待审核\",\"value\":\"PENDING\"},{\"label\":\"审核通过\",\"value\":\"PASS\"},{\"label\":\"审核失败\",\"value\":\"DENY\"}]"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.jmrh","tablePackage":"com.izouma.jmrh.domain.Editing"}

+ 39 - 35
src/main/vue/src/mixins/pageableTable.js

@@ -7,8 +7,9 @@ export default {
             totalElements: 0,
             tableData: [],
             sort: {},
-            sortStr: '',
-            tableHeight: 200
+            sortStr: 'createdAt,desc',
+            tableHeight: 200,
+            fetchingData: false
         };
     },
     created() {
@@ -93,6 +94,39 @@ export default {
                 }); */
                 });
         },
+        // getData() {
+        //     this.tableData = [];
+        //     let urlQuery = { ...this.$route.query };
+        //     delete urlQuery.sort;
+        //     delete urlQuery.page;
+        //     delete urlQuery.size;
+        //     let data = {
+        //         page: this.page - 1,
+        //         size: this.pageSize,
+        //         sort: this.sortStr,
+        //         query: urlQuery
+        //     };
+        //     if (this.beforeGetData) {
+        //         let mergeData = this.beforeGetData();
+        //         if (mergeData) {
+        //             data = { ...data, ...mergeData };
+        //         }
+        //     }
+        //     this.$http
+        //         .post(this.url, data)
+        //         .then(res => {
+        //             this.tableData = res.content;
+        //             this.totalPages = res.totalPages;
+        //             this.totalElements = res.totalElements;
+        //             if (this.afterGetData) {
+        //                 this.afterGetData(res);
+        //             }
+        //         })
+        //         .catch(e => {
+        //             console.log(e);
+        //             this.$message.error(e.error);
+        //         });
+        // },
         getData() {
             this.tableData = [];
             let urlQuery = { ...this.$route.query };
@@ -111,42 +145,11 @@ export default {
                     data = { ...data, ...mergeData };
                 }
             }
-            this.$http
-                .post(this.url, data)
-                .then(res => {
-                    this.tableData = res.content;
-                    this.totalPages = res.totalPages;
-                    this.totalElements = res.totalElements;
-                    if (this.afterGetData) {
-                        this.afterGetData(res);
-                    }
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        },
-        getData() {
-            this.tableData = [];
-            let urlQuery = { ...this.$route.query };
-            delete urlQuery.sort;
-            delete urlQuery.page;
-            delete urlQuery.size;
-            let data = {
-                page: this.page - 1,
-                size: this.pageSize,
-                sort: this.sortStr,
-                query: urlQuery
-            };
-            if (this.beforeGetData) {
-                let mergeData = this.beforeGetData();
-                if (mergeData) {
-                    data = { ...data, ...mergeData };
-                }
-            }
+            this.fetchingData = true;
             this.$http
                 .get(this.url, data)
                 .then(res => {
+                    this.fetchingData = false;
                     this.tableData = res.content;
                     this.totalPages = res.totalPages;
                     this.totalElements = res.totalElements;
@@ -155,6 +158,7 @@ export default {
                     }
                 })
                 .catch(e => {
+                    this.fetchingData = false;
                     console.log(e);
                     this.$message.error(e.error);
                 });

+ 36 - 4
src/main/vue/src/router.js

@@ -108,7 +108,7 @@ const router = new Router({
                     name: 'ArticleEdit',
                     component: () => import(/* webpackChunkName: "articleEdit" */ '@/views/ArticleEdit.vue'),
                     meta: {
-                        title: '数据类型编辑'
+                        title: '文章编辑'
                     }
                 },
                 {
@@ -116,7 +116,7 @@ const router = new Router({
                     name: 'ArticleList',
                     component: () => import(/* webpackChunkName: "articleList" */ '@/views/ArticleList.vue'),
                     meta: {
-                        title: '公告管理'
+                        title: '采编管理'
                     }
                 },
                 {
@@ -173,7 +173,7 @@ const router = new Router({
                     name: 'AuthorityEdit',
                     component: () => import(/* webpackChunkName: "authorityEdit" */ './views/AuthorityEdit.vue'),
                     meta: {
-                        title: '角色详情'
+                        title: '角色编辑'
                     }
                 },
                 {
@@ -181,7 +181,7 @@ const router = new Router({
                     name: 'AuthorityList',
                     component: () => import(/* webpackChunkName: "authorityList" */ './views/AuthorityList.vue'),
                     meta: {
-                        title: '角色列表'
+                        title: '角色管理'
                     }
                 },
                 {
@@ -258,6 +258,38 @@ const router = new Router({
                     meta: {
                         title: '技术交易'
                     }
+                },
+                {
+                    path: '/articleTypeEdit',
+                    name: 'ArticleTypeEdit',
+                    component: () => import(/* webpackChunkName: "articleTypeEdit" */ '@/views/ArticleTypeEdit.vue'),
+                    meta: {
+                        title: '类型编辑'
+                    }
+                },
+                {
+                    path: '/articleTypeList',
+                    name: 'ArticleTypeList',
+                    component: () => import(/* webpackChunkName: "articleTypeList" */ '@/views/ArticleTypeList.vue'),
+                    meta: {
+                        title: '类型管理'
+                    }
+                },
+                {
+                    path: '/editingEdit',
+                    name: 'EditingEdit',
+                    component: () => import(/* webpackChunkName: "editingEdit" */ '@/views/EditingEdit.vue'),
+                    meta: {
+                        title: '采编管理编辑'
+                    }
+                },
+                {
+                    path: '/editingList',
+                    name: 'EditingList',
+                    component: () => import(/* webpackChunkName: "editingList" */ '@/views/EditingList.vue'),
+                    meta: {
+                        title: '采编管理'
+                    }
                 }
                 /**INSERT_LOCATION**/
             ]

+ 35 - 23
src/main/vue/src/views/ArticleEdit.vue

@@ -4,7 +4,7 @@
             :model="formData"
             :rules="rules"
             ref="form"
-            label-width="52px"
+            label-width="72px"
             label-position="right"
             size="small"
             style="max-width: 500px;"
@@ -22,9 +22,15 @@
                 <el-radio v-model="formData.publish" :label="true">是</el-radio>
                 <el-radio v-model="formData.publish" :label="false">否</el-radio>
             </el-form-item>
-            <el-form-item prop="typeId" label="类型">
-                <el-select v-model="formData.typeId" clearable filterable placeholder="请选择">
-                    <el-option v-for="item in typeIdOptions" :key="item.value" :label="item.label" :value="item.value">
+            <el-form-item prop="mainType" label="主类型">
+                <el-select v-model="formData.mainType" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in mainTypeOptions" :key="item.name" :label="item.name" :value="item.name">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="subType" label="子类型">
+                <el-select v-model="formData.subType" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in subTypeOptions" :key="item.name" :label="item.name" :value="item.name">
                     </el-option>
                 </el-select>
             </el-form-item>
@@ -51,22 +57,9 @@ export default {
                     this.$message.error(e.error);
                 });
         }
-        this.$http
-            .post('/dataType/all', { query: { keyType: 'gg' } }, { emulateJSON: true })
-            .then(res => {
-                if (res.content.length > 0) {
-                    res.content.forEach(item => {
-                        this.typeIdOptions.push({
-                            label: item.name,
-                            value: item.id
-                        });
-                    });
-                }
-            })
-            .catch(e => {
-                console.log(e);
-                this.$message.error(e.error);
-            });
+        this.$http.get('/articleType/all', { size: 1000, query: { level: 1 } }).then(res => {
+            this.mainTypeOptions = res.content;
+        });
     },
     data() {
         return {
@@ -87,6 +80,13 @@ export default {
                         trigger: 'blur'
                     }
                 ],
+                cover: [
+                    {
+                        required: true,
+                        message: '请添加图片',
+                        trigger: 'blur'
+                    }
+                ],
                 publish: [
                     {
                         required: true,
@@ -94,15 +94,16 @@ export default {
                         trigger: 'blur'
                     }
                 ],
-                typeId: [
+                mainType: [
                     {
                         required: true,
-                        message: '请输入类型',
+                        message: '请选择类型',
                         trigger: 'blur'
                     }
                 ]
             },
-            typeIdOptions: []
+            mainTypeOptions: [],
+            subTypeOptions: []
         };
     },
     methods: {
@@ -163,6 +164,17 @@ export default {
         //         this.formData = { applicationField: { id: '' }, advancedType: { id: '' }, dataType: { id: '' } };
         //     }
         // }
+    },
+    watch: {
+        'formData.mainType'(val) {
+            if (val) {
+                this.$http.get('/articleType/all', { size: 1000, query: { level: 2, parent: val } }).then(res => {
+                    this.subTypeOptions = res.content;
+                });
+            } else {
+                this.subTypeOptions = [];
+            }
+        }
     }
 };
 </script>

+ 19 - 22
src/main/vue/src/views/ArticleList.vue

@@ -1,9 +1,9 @@
 <template>
     <div class="list-view">
         <div class="filters-container">
-            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
-            <el-select v-model="query.type.id" clearable filterable placeholder="公告类型" class="filter-item">
-                <el-option v-for="item in typeIdOptions" :key="item.value" :label="item.label" :value="item.value">
+            <el-input placeholder="标题" v-model="search" clearable class="filter-item"></el-input>
+            <el-select v-model="mainType" clearable filterable placeholder="类型" class="filter-item">
+                <el-option v-for="item in mainTypeOptions" :key="item.name" :label="item.name" :value="item.name">
                 </el-option>
             </el-select>
             <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
@@ -26,11 +26,12 @@
             row-class-name="table-row"
             cell-class-name="table-cell"
             :height="tableHeight"
+            v-loading="fetchingData"
         >
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
             <el-table-column prop="title" label="标题" :show-overflow-tooltip="true"> </el-table-column>
-            <el-table-column prop="cover" label="封面">
+            <el-table-column prop="cover" label="封面" width="60px">
                 <template slot-scope="{ row }">
                     <el-image
                         v-if="row.cover"
@@ -39,25 +40,16 @@
                         fit="cover"
                         :preview-src-list="[row.cover]"
                     ></el-image>
-                    <p v-else>无</p>
                 </template>
             </el-table-column>
-            <el-table-column prop="content" label="内容" :show-overflow-tooltip="true">
-                <template slot-scope="scope">
-                    <div style="height: 30px" scope>
-                        <p>{{ scope.row.content | lable }}</p>
-                    </div>
-                </template>
-            </el-table-column>
-            <el-table-column prop="publish" label="发布" width="60" align="center">
+            <el-table-column prop="publish" label="发布" min-width="60" align="center">
                 <template v-slot="{ row }">
                     <el-tag type="success" v-if="row.publish">是</el-tag>
                     <el-tag type="info" v-else>否</el-tag>
                 </template>
             </el-table-column>
-            <el-table-column prop="type.name" label="类型"> </el-table-column>
+            <el-table-column prop="mainType" label="类型"> </el-table-column>
             <el-table-column prop="createdAt" label="发布日期" width="150"> </el-table-column>
-
             <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
@@ -113,12 +105,15 @@ export default {
                 { label: '审核通过', value: 'PASS' },
                 { label: '审核失败', value: 'DENY' }
             ],
-            typeIdOptions: []
+            mainType: null,
+            mainTypeOptions: []
             // selectId: 0
         };
     },
     created() {
-        this.getDataType({ query: { keyType: 'gg' } }, this.typeIdOptions);
+        this.$http.get('/articleType/all', { size: 10000, query: { level: 1 } }).then(res => {
+            this.mainTypeOptions = res.content;
+        });
     },
     computed: {
         selection() {
@@ -134,12 +129,14 @@ export default {
             return '';
         },
         beforeGetData() {
-            if (this.search || this.query) {
-                return {
-                    search: this.search,
-                    query: this.query
-                };
+            let data = {
+                search: this.search,
+                query: {}
+            };
+            if (this.mainType) {
+                data.query.mainType = this.mainType;
             }
+            return data;
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;

+ 128 - 0
src/main/vue/src/views/ArticleTypeEdit.vue

@@ -0,0 +1,128 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="80px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="name" label="名称">
+                <el-input v-model="formData.name"></el-input>
+            </el-form-item>
+            <el-form-item prop="description" label="描述">
+                <el-input v-model="formData.description"></el-input>
+            </el-form-item>
+            <el-form-item prop="parent" label="上级分类">
+                <el-select v-model="formData.parent" clearable>
+                    <el-option
+                        v-for="item in parents"
+                        :label="item.description"
+                        :value="item.name"
+                        :key="item.name"
+                    ></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.name">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'ArticleTypeEdit',
+    created() {
+        if (this.$route.query.name) {
+            this.$http
+                .get('articleType/get/' + this.$route.query.name)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+        this.$http.get('/articleType/all', { size: 10000, query: { level: 1 } }).then(res => {
+            this.parents = res.content;
+        });
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {
+                name: [
+                    {
+                        required: true,
+                        message: '请输入名称',
+                        trigger: 'blur'
+                    }
+                ],
+                description: [
+                    {
+                        required: true,
+                        message: '请输入描述',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            parents: []
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            if (data.parent) {
+                data.level = 2;
+            } else {
+                data.level = 1;
+            }
+            this.saving = true;
+            this.$http
+                .post('/articleType/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/articleType/del/${this.formData.name}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 159 - 0
src/main/vue/src/views/ArticleTypeList.vue

@@ -0,0 +1,159 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="名称" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="name" label="名称"> </el-table-column>
+            <el-table-column prop="description" label="描述"> </el-table-column>
+            <el-table-column prop="parent" label="上级分类"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'ArticleTypeList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/articleType/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.name);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            if (this.search) {
+                return { search: this.search };
+            }
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/articleTypeEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/articleTypeEdit',
+                query: {
+                    id: row.name
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/articleType/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/articleType/del/${row.name}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 2 - 1
src/main/vue/src/views/AuthorityList.vue

@@ -79,7 +79,8 @@ export default {
                 title: '',
                 editDialogVisible: false,
                 roleId: ''
-            }
+            },
+            sortStr: ''
         };
     },
     computed: {

+ 181 - 0
src/main/vue/src/views/EditingEdit.vue

@@ -0,0 +1,181 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="72px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="title" label="标题">
+                <el-input v-model="formData.title"></el-input>
+            </el-form-item>
+            <el-form-item prop="cover" label="封面">
+                <single-upload v-model="formData.cover"></single-upload>
+            </el-form-item>
+            <el-form-item prop="content" label="内容" style="width:1000px">
+                <rich-text v-model="formData.content"></rich-text>
+            </el-form-item>
+            <el-form-item prop="publish" label="发布">
+                <el-radio v-model="formData.publish" :label="true">是</el-radio>
+                <el-radio v-model="formData.publish" :label="false">否</el-radio>
+            </el-form-item>
+            <el-form-item prop="mainType" label="主类型">
+                <el-select v-model="formData.mainType" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in mainTypeOptions" :key="item.name" :label="item.name" :value="item.name">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="subType" label="子类型">
+                <el-select v-model="formData.subType" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in subTypeOptions" :key="item.name" :label="item.name" :value="item.name">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'EditingEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('editing/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+        this.$http.get('/articleType/all', { size: 1000, query: { level: 1 } }).then(res => {
+            this.mainTypeOptions = res.content;
+        });
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {
+                title: [
+                    {
+                        required: true,
+                        message: '请输入标题',
+                        trigger: 'blur'
+                    }
+                ],
+                content: [
+                    {
+                        required: true,
+                        message: '请输入内容',
+                        trigger: 'blur'
+                    }
+                ],
+                cover: [
+                    {
+                        required: true,
+                        message: '请添加图片',
+                        trigger: 'blur'
+                    }
+                ],
+                publish: [
+                    {
+                        required: true,
+                        message: '请输入发布',
+                        trigger: 'blur'
+                    }
+                ],
+                mainType: [
+                    {
+                        required: true,
+                        message: '请选择类型',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            mainTypeOptions: [],
+            subTypeOptions: []
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/editing/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/editing/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+        // changeForm(info) {
+        //     if (info) {
+        //         this.$http
+        //             .get('article/get/' + info.id)
+        //             .then(res => {
+        //                 this.formData = res;
+        //             })
+        //             .catch(e => {
+        //                 console.log(e);
+        //                 this.$message.error(e.error);
+        //             });
+        //     } else {
+        //         this.formData = { applicationField: { id: '' }, advancedType: { id: '' }, dataType: { id: '' } };
+        //     }
+        // }
+    },
+    watch: {
+        'formData.mainType'(val) {
+            if (val) {
+                this.$http.get('/articleType/all', { size: 1000, query: { level: 2, parent: val } }).then(res => {
+                    this.subTypeOptions = res.content;
+                });
+            } else {
+                this.subTypeOptions = [];
+            }
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 216 - 0
src/main/vue/src/views/EditingList.vue

@@ -0,0 +1,216 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="标题" v-model="search" clearable class="filter-item"></el-input>
+            <el-select v-model="mainType" clearable filterable placeholder="类型" class="filter-item">
+                <el-option v-for="item in mainTypeOptions" :key="item.name" :label="item.name" :value="item.name">
+                </el-option>
+            </el-select>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+            v-loading="fetchingData"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="title" label="标题" :show-overflow-tooltip="true"> </el-table-column>
+            <el-table-column prop="cover" label="封面" width="60px">
+                <template slot-scope="{ row }">
+                    <el-image
+                        v-if="row.cover"
+                        style="width: 30px; height: 30px"
+                        :src="row.cover"
+                        fit="cover"
+                        :preview-src-list="[row.cover]"
+                    ></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="publish" label="发布" min-width="60" align="center">
+                <template v-slot="{ row }">
+                    <el-tag type="success" v-if="row.publish">是</el-tag>
+                    <el-tag type="info" v-else>否</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="mainType" label="类型"> </el-table-column>
+            <el-table-column prop="createdAt" label="发布日期" width="150"> </el-table-column>
+            <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+export default {
+    name: 'EditingList',
+    mixins: [pageableTable],
+    filters: {
+        lable: function(str) {
+            var tmp = document.createElement('DIV');
+            tmp.innerHTML = str;
+            str = tmp.innerText.trim();
+            return str;
+        }
+    },
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/editing/all',
+            downloading: false,
+            sortStr: 'createdAt,desc',
+            query: {
+                type: {
+                    keyType: 'gg',
+                    id: ''
+                }
+            },
+            statusOptions: [
+                { label: '待审核', value: 'PENDING' },
+                { label: '审核通过', value: 'PASS' },
+                { label: '审核失败', value: 'DENY' }
+            ],
+            mainType: null,
+            mainTypeOptions: []
+            // selectId: 0
+        };
+    },
+    created() {
+        this.$http.get('/articleType/all', { size: 10000, query: { level: 1 } }).then(res => {
+            this.mainTypeOptions = res.content;
+        });
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        statusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.statusOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            let data = {
+                search: this.search,
+                query: {}
+            };
+            if (this.mainType) {
+                data.query.mainType = this.mainType;
+            }
+            return data;
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/editingEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/editingEdit',
+                query: {
+                    id: row.id
+                }
+            });
+
+            // this.$emit('addRow', row);
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/editing/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/editing/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 7 - 3
src/main/vue/src/views/editUserMenu.vue

@@ -22,8 +22,8 @@
         >
         </el-tree>
         <div slot="footer" class="dialog-footer">
-            <el-button @click="handleClose">取 消</el-button>
-            <el-button type="primary" @click="handleSubmit">确 定</el-button>
+            <el-button @click="handleClose" :disabled="saving">取 消</el-button>
+            <el-button type="primary" @click="handleSubmit" :loading="saving">确 定</el-button>
         </div>
     </el-dialog>
 </template>
@@ -41,7 +41,8 @@ export default {
             props1: {
                 label: 'name',
                 children: 'children'
-            }
+            },
+            saving: false
         };
     },
     components: {},
@@ -78,6 +79,7 @@ export default {
         },
         handleSubmit() {
             // 为该角色添加权限;
+            this.saving = true;
             this.$axios
                 .post(
                     '/authorityMenu/save',
@@ -85,6 +87,7 @@ export default {
                     { emulateJSON: true }
                 )
                 .then(res => {
+                    this.saving = false;
                     let success = res.data.success;
                     if (success === true) {
                         this.$message({
@@ -97,6 +100,7 @@ export default {
                     }
                 })
                 .catch(error => {
+                    this.saving = false;
                     console.log(error);
                     this.$message.error('服务器暂时无法连接,请稍后再试');
                 });