diff --git a/backend/src/main/java/com/supwisdom/dlpay/api/dao/PersonDaoRepository.java b/backend/src/main/java/com/supwisdom/dlpay/api/dao/PersonDaoRepository.java
new file mode 100644
index 0000000..d72573f
--- /dev/null
+++ b/backend/src/main/java/com/supwisdom/dlpay/api/dao/PersonDaoRepository.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.portal.bean.DtlGroupResultBean;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface PersonDaoRepository {
+  BigDecimal getMonthTotalDtlByUserid(String userid, String month);
+
+  List<DtlGroupResultBean> getMonthDtlGroupByTransType(String userid, String month);
+}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java b/backend/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
index 63e97ec..9c41010 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
@@ -8,6 +8,6 @@
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl> {
-    Page<TPersondtl> findByUseridAndStatus(String userid, String status, Pageable pageable);
+public interface PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl>,PersonDaoRepository {
+    Page<TPersondtl> findByUseridAndStatusAndTransdateBetween(String userid, String status,String startdate,String enddate, Pageable pageable);
 }
diff --git a/backend/src/main/java/com/supwisdom/dlpay/api/dao/impl/PersonDaoRepositoryImpl.java b/backend/src/main/java/com/supwisdom/dlpay/api/dao/impl/PersonDaoRepositoryImpl.java
new file mode 100644
index 0000000..4a18b8f
--- /dev/null
+++ b/backend/src/main/java/com/supwisdom/dlpay/api/dao/impl/PersonDaoRepositoryImpl.java
@@ -0,0 +1,46 @@
+package com.supwisdom.dlpay.api.dao.impl;
+
+import com.supwisdom.dlpay.api.dao.PersonDaoRepository;
+import com.supwisdom.dlpay.framework.jpa.BaseRepository;
+import com.supwisdom.dlpay.portal.bean.DtlGroupResultBean;
+import org.hibernate.query.NativeQuery;
+import org.hibernate.transform.Transformers;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.math.BigDecimal;
+import java.util.List;
+
+public class PersonDaoRepositoryImpl extends BaseRepository implements PersonDaoRepository {
+  @PersistenceContext
+  private EntityManager em;
+
+  @SuppressWarnings("JpaQueryApiInspection")
+  @Override
+  public BigDecimal getMonthTotalDtlByUserid(String userid, String month) {
+    String sql = "select sum(cast(amount as decimal(18,2))) total from tb_persondtl where userid =:userid and transdate between :startdate and :enddate and status = 'success' and tradeflag = 'out'";
+    Query query = em.createNativeQuery(sql);
+    query.setParameter("userid", userid);
+    query.setParameter("startdate", month + "00");
+    query.setParameter("enddate", month + "32");
+    List list = query.getResultList();
+    if (list.size() > 0) {
+      return (BigDecimal) list.get(0);
+    }
+    return new BigDecimal(0);
+  }
+
+  @Override
+  @SuppressWarnings({"JpaQueryApiInspection", "deprecation", "unchecked"})
+  public List<DtlGroupResultBean> getMonthDtlGroupByTransType(String userid, String month) {
+    String sql = "select transdesc transtype,sum(cast(amount as decimal(18,2))) amount from tb_persondtl where userid =:userid and transdate between :startdate and :enddate and status = 'success' and tradeflag = 'out' group by transdesc";
+    Query query = em.createNativeQuery(sql);
+    query.setParameter("userid", userid);
+    query.setParameter("startdate", month + "00");
+    query.setParameter("enddate", month + "32");
+    NativeQuery nativeQuery = query.unwrap(NativeQuery.class);
+    nativeQuery.setResultTransformer(Transformers.aliasToBean(DtlGroupResultBean.class));
+    return nativeQuery.getResultList();
+  }
+}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/ArticleRepositoryImpl.java b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/ArticleRepositoryImpl.java
index 3d77024..1fc7264 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/ArticleRepositoryImpl.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/ArticleRepositoryImpl.java
@@ -9,10 +9,12 @@
 import com.supwisdom.dlpay.portal.domain.TBArticle;
 import org.hibernate.transform.Transformers;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.sql.Timestamp;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.List;
 
 public class ArticleRepositoryImpl  extends BaseRepository implements ArticleRepository {
   @NotNull
@@ -72,4 +74,14 @@
     }
     return findNative(f, Transformers.aliasToBean(TBArticle.class), pageno, pagesize);
   }
+
+  @NotNull
+  @Override
+  @SuppressWarnings("unchecked")
+  public List<TBArticle> getArticleListByColumnid(@NotNull String columnid,int pageno, int pagesize) {
+    String sql = "select * from tb_article where isdelete='0' and isdisplay='1' and status='released' and columnid =:columnid order by releasetime desc";
+    Finder f = Finder.create(sql);
+    f.setParameter("columnid", columnid);
+    return (List<TBArticle>) findNative(f, Transformers.aliasToBean(TBArticle.class), pageno, pagesize).getList();
+  }
 }
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java
index ef6c456..131fb49 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java
@@ -16,17 +16,18 @@
   public Pagination getFeedbackList(@NotNull FeedbackSearchBean bean) {
     StringBuilder sql = new StringBuilder("select f.*,p.name username from tb_feedback f left join tb_person p on f.userid = p.userid where 1=1 ");
     String username = bean.getUsername();
-    String content = bean.getContent();
+    String title = bean.getTitle();
     String startdate = bean.getStartdate();
     String enddate = bean.getEnddate();
     String replystatus = bean.getReplystatus();
+    String mobileid = bean.getMobileid();
     int pageno = bean.getPageno();
     int pagesize = bean.getPagesize();
     if (!StringUtil.isEmpty(username)) {
       sql.append(" and p.name like :username");
     }
-    if (!StringUtil.isEmpty(content)) {
-      sql.append(" and f.content like :content");
+    if (!StringUtil.isEmpty(title)) {
+      sql.append(" and f.title like :title");
     }
     if (!StringUtil.isEmpty(startdate)) {
       sql.append(" and f.fbtime >= :startdate");
@@ -37,13 +38,16 @@
     if (!StringUtil.isEmpty(replystatus)) {
       sql.append(" and f.replystatus = :replystatus");
     }
+    if (!StringUtil.isEmpty(mobileid)) {
+      sql.append(" and f.mobileid = :mobileid");
+    }
     sql.append(" order by f.fbtime desc");
     Finder f = Finder.create(sql.toString());
     if (!StringUtil.isEmpty(username)) {
       f.setParameter("username", "%" + username.trim() + "%");
     }
-    if (!StringUtil.isEmpty(content)) {
-      f.setParameter("content", "%" + content.trim() + "%");
+    if (!StringUtil.isEmpty(title)) {
+      f.setParameter("title", "%" + title.trim() + "%");
     }
     if (!StringUtil.isEmpty(startdate)) {
       f.setParameter("startdate", startdate + "000000");
@@ -54,6 +58,9 @@
     if (!StringUtil.isEmpty(replystatus)) {
       f.setParameter("replystatus", replystatus);
     }
+    if (!StringUtil.isEmpty(mobileid)) {
+      f.setParameter("mobileid", mobileid);
+    }
     return findNative(f, Transformers.aliasToBean(TBFeedback.class), pageno, pagesize);
   }
 }
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBAnnex.java b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBAnnex.java
index 729cc71..22d8b79 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBAnnex.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBAnnex.java
@@ -18,7 +18,7 @@
   private String fbid;
   @Column(name = "picid", length = 32)
   private String picid;
-  @Column(name = "minpicid", length = 14)
+  @Column(name = "minpicid", length = 32)
   private String minpicid;
 
   public String getAnnexid() {
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBArticle.java b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBArticle.java
index 9c743eb..93ee786 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBArticle.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBArticle.java
@@ -62,6 +62,9 @@
   @Transient
   private String columnname;
 
+  @Transient
+  private String author;
+
 
   public String getArticleid() {
     return articleid;
@@ -182,4 +185,12 @@
   public void setColumnname(String columnname) {
     this.columnname = columnname;
   }
+
+  public String getAuthor() {
+    return author;
+  }
+
+  public void setAuthor(String author) {
+    this.author = author;
+  }
 }
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBColumn.java b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBColumn.java
index 500ac27..2e9d3ae 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBColumn.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBColumn.java
@@ -3,6 +3,7 @@
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
+import java.util.List;
 
 @Entity
 @Table(name = "tb_column")
@@ -49,6 +50,9 @@
   @Transient
   private String parentname;
 
+  @Transient
+  private List<TBArticle> articles;
+
   public String getColumnid() {
     return columnid;
   }
@@ -128,4 +132,12 @@
   public void setOrdernum(Integer ordernum) {
     this.ordernum = ordernum;
   }
+
+  public List<TBArticle> getArticles() {
+    return articles;
+  }
+
+  public void setArticles(List<TBArticle> articles) {
+    this.articles = articles;
+  }
 }
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBFeedback.java b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBFeedback.java
index 00db202..3372084 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBFeedback.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/domain/TBFeedback.java
@@ -7,16 +7,21 @@
 
 @Entity
 @Table(name = "tb_feedback",
-        indexes = {@Index(name = "feedback_idx1",columnList = "userid"),
-        @Index(name = "feedback_idx2",columnList = "fbtime,replystatus")})
+    indexes = {@Index(name = "feedback_idx1", columnList = "userid"),
+        @Index(name = "feedback_idx2", columnList = "title,fbtime,replystatus"),
+        @Index(name = "feedback_idx3", columnList = "mobileid")})
 public class TBFeedback {
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
   @GeneratedValue(generator = "idGenerator")
   @Column(name = "fbid", nullable = false, length = 32)
   private String fbid;
-  @Column(name = "userid", nullable = false, length = 32)
+  @Column(name = "userid", length = 32)
   private String userid;
+  @Column(name = "mobileid", length = 32)
+  private String mobileid;
+  @Column(name = "title", nullable = false, length = 20)
+  private String title;
   @Column(name = "content", nullable = false, length = 200)
   private String content;
   @Column(name = "fbtime", length = 14)
@@ -29,6 +34,8 @@
   private String username;
   @Transient
   private List<TBAnnex> pictures;
+  @Transient
+  private TBReply reply;
 
   public String getFbid() {
     return fbid;
@@ -95,4 +102,28 @@
   public void setPictures(List<TBAnnex> pictures) {
     this.pictures = pictures;
   }
+
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public String getMobileid() {
+    return mobileid;
+  }
+
+  public void setMobileid(String mobileid) {
+    this.mobileid = mobileid;
+  }
+
+  public TBReply getReply() {
+    return reply;
+  }
+
+  public void setReply(TBReply reply) {
+    this.reply = reply;
+  }
 }
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/UploadPicService.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/UploadPicService.kt
new file mode 100644
index 0000000..c52cd29
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/UploadPicService.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.api.service
+
+import org.springframework.transaction.annotation.Transactional
+import org.springframework.web.multipart.MultipartHttpServletRequest
+
+
+interface UploadPicService {
+    @Transactional
+    fun uploadPic(request: MultipartHttpServletRequest): Map<String, String>
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/UploadPicServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/UploadPicServiceImpl.kt
new file mode 100644
index 0000000..4f56960
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/UploadPicServiceImpl.kt
@@ -0,0 +1,204 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.service.UploadPicService
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.portal.util.PortalConstant
+import com.supwisdom.dlpay.portal.util.PutImageToServer
+import mu.KotlinLogging
+import net.coobird.thumbnailator.Thumbnails
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+import org.springframework.web.multipart.MultipartFile
+import org.springframework.web.multipart.MultipartHttpServletRequest
+import java.io.File
+import java.io.FileInputStream
+import java.io.IOException
+import java.util.HashMap
+import kotlin.math.sqrt
+
+@Service
+class UploadPicServiceImpl : UploadPicService{
+    @Autowired
+    lateinit var systemUtilService: SystemUtilService
+
+    val logger = KotlinLogging.logger { }
+
+    @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS",
+            "RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
+    override fun uploadPic(request: MultipartHttpServletRequest): Map<String, String> {
+        val map: MutableMap<String, String> = HashMap()
+        try {
+            logger.error("===put up pic")
+            val pathDir = "/files/"
+            /** 得到图片保存目录的真实路径  */
+            val logoRealPathDir = request.session.servletContext
+                    .getRealPath(pathDir)
+            /** 根据真实路径创建目录  */
+            val logoSaveFile = File(logoRealPathDir)
+            if (!logoSaveFile.exists()) logoSaveFile.mkdirs()
+            /** 页面控件的文件流  */
+            val multipartFile: MultipartFile = request.getFile("file")
+            //System.out.println(multipartFile);
+            /* 获取文件的后缀 */
+            val suffix = multipartFile.originalFilename.substring(
+                    multipartFile.originalFilename.lastIndexOf("."))
+            //* 拼成完整的文件保存路径加文件 *//*
+            val name = System.currentTimeMillis().toString() + suffix
+            val fileName = logoRealPathDir + File.separator + name
+            val file = File(fileName)
+            // String data = file.getPath();
+            try {
+                multipartFile.transferTo(file)
+            } catch (e: IllegalStateException) {
+                logger.error("error:", e)
+            } catch (e: IOException) {
+                logger.error("error:", e)
+            }
+            //savePicToDb(fileName, goodsidString);*/
+            //String filepath = logoRealPathDir + File.separator + multipartFile.getOriginalFilename();
+            val size = multipartFile.size
+            var maxSize = 200 * 1024.toLong()
+            val imageMaxConf = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_MAXSIZE)
+            if (imageMaxConf != null && !StringUtil.isEmpty(imageMaxConf)) {
+                try {
+                    maxSize = imageMaxConf.toLong()
+                } catch (e: Exception) {
+                }
+            }
+            var minwidth = 150
+            var minheight = 150
+            val imageMinConf = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_MINISIZE)
+            if (imageMinConf != null && !StringUtil.isEmpty(imageMinConf)) {
+                try {
+                    val temps = imageMinConf.split(",")
+                    if (temps.size == 2) {
+                        minwidth = temps[0].toInt()
+                        minheight = temps[1].toInt()
+                    }
+                } catch (e: Exception) {
+                    logger.error("error:", e)
+                }
+            }
+            logger.error("===put up pic 1")
+            var baseURL = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_URLASSIGN)
+            if (baseURL == null || StringUtil.isEmpty(baseURL)) {
+                map["retmsg"] = "系统未配置图片服务器地址，无法保存图片！"
+                map["retcode"] = "1"
+                return map
+            }
+            if (!baseURL.startsWith("http")) {
+                baseURL = "http://$baseURL"
+            }
+            if (baseURL.endsWith("/")) {
+                baseURL = baseURL.substring(0, baseURL.length - 1)
+            }
+            logger.error("===put up pic 2")
+            var minImageURL: String
+            val picid: String
+            val minpicid: String
+            var imageURL = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_URLPUSH)
+            if (imageURL == null || StringUtil.isEmpty(imageURL)) {
+                map["retmsg"] = "系统未配置图片服务器地址，无法保存图片！"
+                map["retcode"] = "1"
+                return map
+            }
+            logger.error("===put up pic 4")
+            if (!imageURL.startsWith("http")) {
+                imageURL = "http://$imageURL"
+            }
+            if (!imageURL.endsWith("/")) {
+                imageURL += "/"
+            }
+            minImageURL = imageURL
+            if (!minImageURL.startsWith("http")) {
+                minImageURL = "http://$minImageURL"
+            }
+            if (!minImageURL.endsWith("/")) {
+                minImageURL += "/"
+            }
+            val assign = "$baseURL/dir/assign?count=2"
+            val bean = PutImageToServer.postBefore(assign)
+            if (bean == null || StringUtil.isEmpty(bean.getFid())) {
+                map["retmsg"] = "图片上传失败，无法连接图片服务器！"
+                map["retcode"] = "1"
+                return map
+            }
+            imageURL += bean.fid
+            picid = bean.fid
+            val minImgBean = PutImageToServer.postBefore(assign)
+            if (minImgBean == null || StringUtil.isEmpty(minImgBean.getFid())) {
+                map["retmsg"] = "图片上传失败，无法连接图片服务器！"
+                map["retcode"] = "1"
+                return map
+            }
+            minpicid = minImgBean.fid
+            minImageURL += minImgBean.fid
+            //}
+            val processToFile = logoRealPathDir + File.separator + picid + ".jpg"
+            var scale = 1.0
+            if (size > 0 && size > maxSize) {
+                scale = maxSize * 1.0 / size
+            }
+            try {
+                if (scale < 0.7) {
+                    val s = sqrt(maxSize.toDouble()).toInt()
+                    Thumbnails.of(fileName).size(s, s).outputFormat("jpg").toFile(processToFile)
+                } else {
+                    Thumbnails.of(fileName).scale(1.0).outputQuality(scale).outputFormat("jpg").toFile(processToFile)
+                }
+                logger.error("===put up pic 5")
+            } catch (e: Exception) {
+                map["retmsg"] = "图片上传失败，压缩失败"
+                map["retcode"] = "1"
+                file.delete()
+                return map
+            }
+            val file1 = File(processToFile)
+            val processToMinFile = logoRealPathDir + File.separator + minpicid + ".jpg"
+            try {
+                Thumbnails.of(fileName).size(minwidth, minheight).outputFormat("jpg").toFile(processToMinFile)
+            } catch (e: Exception) {
+                map["retmsg"] = "图片上传失败，压缩失败"
+                map["retcode"] = "1"
+                file.delete()
+                file1.delete()
+                return map
+            }
+            val file2 = File(processToMinFile)
+            logger.error("==========imageurl=$imageURL")
+            if (!PutImageToServer.postImage(imageURL, FileInputStream(file1))) {
+                map["retmsg"] = "图片上传失败，请稍后再试"
+                map["retcode"] = "1"
+                file1.delete()
+                file2.delete()
+                file.delete()
+                logger.error("=step1 fail=")
+                return map
+            }
+            if (!PutImageToServer.postImage(minImageURL, FileInputStream(file2))) {
+                map["retmsg"] = "图片上传失败，请稍后再试"
+                map["retcode"] = "1"
+                file1.delete()
+                file2.delete()
+                file.delete()
+                logger.error("=step2 fail=")
+            } else {
+                map["retmsg"] = "上传成功"
+                map["retcode"] = "0"
+                file1.delete()
+                file2.delete()
+                file.delete()
+                map["picid"] = picid
+                map["minpicid"] = minpicid
+                logger.error("=step3 success=")
+            }
+        } catch (e: Exception) {
+            map["retmsg"] = "图片上传失败--" + e.message
+            map["retcode"] = "1"
+            // return map;
+            logger.error("=step fail=", e)
+        }
+        return map
+    }
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
index 45c0d3f..243364b 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
@@ -47,9 +47,9 @@
                 ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "用户<$userid>不存在")
     }
 
-    override fun findPersondtlByUserid(userid: String,pageno:Int): PageResult<TPersondtl> {
+    override fun findPersondtlByUserid(userid: String,pageno:Int,month:String): PageResult<TPersondtl> {
         var pageable = PageRequest.of(pageno - 1, 10, Sort.Direction.DESC, "transdate","transtime")
-        return PageResult<TPersondtl>(persondtlDao.findByUseridAndStatus(userid,TradeDict.DTL_STATUS_SUCCESS,pageable))
+        return PageResult<TPersondtl>(persondtlDao.findByUseridAndStatusAndTransdateBetween(userid,TradeDict.DTL_STATUS_SUCCESS,month+"00",month+"32",pageable))
     }
 
     override fun findPersondtlDetailByUserid(userid: String, billno: String): TPersondtl? {
@@ -63,4 +63,17 @@
             return null
         }
     }
+
+    override fun findDtlMonthCountByUserid(userid: String, month: String): Map<String, Any>? {
+        val total = persondtlDao.getMonthTotalDtlByUserid(userid, month)
+        val group = persondtlDao.getMonthDtlGroupByTransType(userid, month)
+        val result = HashMap<String,Any>()
+        if (total == null) {
+            result["total"] = 0
+        } else {
+            result["total"] = total
+            result["group"] = group
+        }
+        return result
+    }
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
index 302db65..810a2f7 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
@@ -19,9 +19,11 @@
     fun findOnePersonByUserid(userid: String): TPerson
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPersondtlByUserid(userid:String, pageno :Int) : PageResult<TPersondtl>
+    fun findPersondtlByUserid(userid:String, pageno :Int,month:String) : PageResult<TPersondtl>
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
     fun findPersondtlDetailByUserid(userid:String, billno :String) : TPersondtl?
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun findDtlMonthCountByUserid(userid:String, month :String) : Map<String,Any>?
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
index c795cbd..1aad98a 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
@@ -13,6 +13,7 @@
 import com.supwisdom.dlpay.mobile.domain.TBMobileUser
 import com.supwisdom.dlpay.mobile.exception.UserLoginFailException
 import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.portal.util.PortalConstant
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.HttpStatus
 import org.springframework.security.authentication.BadCredentialsException
@@ -90,6 +91,7 @@
                     signed = TradeDict.STATUS_YES
                 }
             }
+            val imageUrl = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_URLPUSH)
             response.status = HttpStatus.OK.value()
             response.contentType = "application/json;charset=UTF-8"
             response.writer.write(objectMapper.writeValueAsString(JsonResult.ok()
@@ -102,6 +104,7 @@
                     ?.put("phone", StringUtil.phoneReplace(user.phone))
                     ?.put("paypwdset",payseted)
                     ?.put("signed", signed)
+                    ?.put("imageurl",imageUrl)
                     ?.put("userid",if(user.userid.isNullOrEmpty()) "" else user.userid)))
         } else {
             throw UserLoginFailException("登录错误")
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index 2649949..b3149a1 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -4,6 +4,7 @@
 import com.supwisdom.dlpay.agent.service.CitizencardPayService
 import com.supwisdom.dlpay.api.bean.JsonResult
 import com.supwisdom.dlpay.api.service.QRCodeService
+import com.supwisdom.dlpay.api.service.UploadPicService
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.api.util.MobileNumberCheck
 import com.supwisdom.dlpay.framework.core.JwtConfig
@@ -13,8 +14,17 @@
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.framework.util.Dictionary
+import com.supwisdom.dlpay.mobile.bean.ActivitiesBean
+import com.supwisdom.dlpay.mobile.bean.FeedbackBean
 import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.mobile.exception.PortalBusinessException
 import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.portal.bean.FeedbackSearchBean
+import com.supwisdom.dlpay.portal.domain.TBFeedback
+import com.supwisdom.dlpay.portal.service.ArticleService
+import com.supwisdom.dlpay.portal.service.ColumnService
+import com.supwisdom.dlpay.portal.service.FeedbackService
+import com.supwisdom.dlpay.portal.util.PortalConstant
 import com.supwisdom.dlpay.system.service.DictionaryProxy
 import com.supwisdom.dlpay.util.ConstantUtil
 import com.supwisdom.dlpay.util.RSAKeysGenerate
@@ -29,13 +39,14 @@
 import org.springframework.security.core.authority.AuthorityUtils
 import org.springframework.security.core.context.SecurityContextHolder
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
-import org.springframework.web.bind.annotation.RequestHeader
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestParam
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
 import org.springframework.web.multipart.MultipartFile
+import org.springframework.web.multipart.MultipartHttpServletRequest
 import java.time.Duration
 import java.util.*
+import java.util.stream.Collectors
+import javax.servlet.http.HttpServletRequest
+import kotlin.collections.HashMap
 
 
 @RestController
@@ -51,6 +62,10 @@
     lateinit var apiJwtRepository: ApiJwtRepository
     @Autowired
     lateinit var systemUtilService: SystemUtilService
+    @Autowired
+    lateinit var columnService: ColumnService
+    @Autowired
+    lateinit var articleService: ArticleService
     val logger = KotlinLogging.logger { }
 
     @RequestMapping("/time")
@@ -140,7 +155,7 @@
             }
             user.status = TradeDict.STATUS_NORMAL
             user.registerplatform = platform
-            if(!user.registerplatform.isNullOrEmpty()){
+            if (!user.registerplatform.isNullOrEmpty()) {
                 user.lastloginplatform = user.registerplatform!!.split(",")[1]
             }
             user.devuid = uuid
@@ -238,12 +253,72 @@
     }
 
     /**
-     *
-     * 小程序认证接口
-     *
-     * */
+     * 获取多个栏目活动
+     */
+    @RequestMapping("/activity")
+    fun getActivity(@RequestHeader("Authorization") auth: String?,
+                    @RequestBody bean: List<ActivitiesBean>): JsonResult? {
+        val mode = judgeLoginMode(auth)
+        val codes = bean.stream().map(ActivitiesBean::code).collect(Collectors.toList())
+        val columnList = columnService.getColumnListByCode(codes)
+        if (columnList == null || columnList.isEmpty()) {
+            return JsonResult.error("未知的栏目code！")
+        }
+        if (mode == "tourist") {
+            columnList.forEach {
+                if (it.ispublic == PortalConstant.NO) {
+                    return JsonResult.error("游客模式不能浏览非公开栏目，请登录！")
+                }
+            }
+        }
+        val beanMap: HashMap<String, ActivitiesBean> = HashMap()
+        bean.forEach {
+            beanMap[it.code] = it
+        }
+        val data = articleService.getArticleByColumn(columnList, beanMap)
+        return JsonResult.ok().put("data", data)
+    }
 
+    /**
+     * 获取活动详情
+     */
+    @RequestMapping("/activity/{articleno}")
+    fun getActivity(@RequestHeader("Authorization") auth: String?,
+                    @PathVariable("articleno") articleno: String): JsonResult? {
+        try {
+            val mode = judgeLoginMode(auth)
+            var article = articleService.getMobileArticle(articleno)
+            val column = columnService.getColunmByid(article.columnid)
+                    ?: return JsonResult.error("文章所属栏目不存在")
+            if (mode == "tourist") {
+                if (column.ispublic == PortalConstant.NO) {
+                    return JsonResult.error("游客模式不能浏览非公开栏目，请登录！")
+                }
+            }
+            article = articleService.addArticleHits(article)
+            return JsonResult.ok().put("data", article)
+        } catch (e: Exception) {
+            logger.error { e.message }
+            if (e is PortalBusinessException) {
+                return JsonResult.error(e.message)
+            }
+            return JsonResult.error("服务器繁忙，请稍后重试")
+        }
+    }
 
+    fun judgeLoginMode(auth: String?): String {
+        var mode = "tourist"
+        if (auth != null) {
+            val p = SecurityContextHolder.getContext().authentication
+            if (p != null) {
+                val user = mobileApiService.findUserById(p.name)
+                if (user != null) {
+                    mode = "logged"
+                }
+            }
+        }
+        return mode
+    }
 }
 
 
@@ -265,7 +340,11 @@
     @Autowired
     lateinit var jwtConfig: JwtConfig
     @Autowired
-    lateinit var qrcodeService:QRCodeService
+    lateinit var qrcodeService: QRCodeService
+    @Autowired
+    lateinit var uploadPicService: UploadPicService
+    @Autowired
+    lateinit var feedbackService: FeedbackService
     val logger = KotlinLogging.logger { }
 
     @RequestMapping("/idtypes")
@@ -294,14 +373,14 @@
         val p = SecurityContextHolder.getContext().authentication
         var user = mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
-        var tk= ""
+        var tk = ""
         if (!user.jti.isNullOrEmpty()) {
             var opt = apiJwtRepository.findById(user.jti!!)
-            if(opt.isPresent){
-                var jwt =  opt.get()
+            if (opt.isPresent) {
+                var jwt = opt.get()
                 val cur = System.currentTimeMillis()
                 //token 小于12个小时，则更新它
-                if(jwt.expiration-cur<1000*60*60*12){
+                if (jwt.expiration - cur < 1000 * 60 * 60 * 12) {
                     val token = JwtTokenUtil(jwtConfig).generateToken(
                             mapOf("uid" to user.uid, "issuer" to "payapi",
                                     "audience" to user.loginid,
@@ -328,6 +407,7 @@
         return JsonResult.ok("OK").put("now", System.currentTimeMillis())
                 ?.put("token", tk)!!
     }
+
     /**
      * 验证码生成，内部校验
      * */
@@ -418,9 +498,9 @@
             return JsonResult.error(resp.message)
         }
         var needupdate = false
-        if (resp.sinstatus == YnrccUtil.TRANSTYPE_SIGNCARD ) {
+        if (resp.sinstatus == YnrccUtil.TRANSTYPE_SIGNCARD) {
             signed = TradeDict.STATUS_YES
-            if(!card.signed){
+            if (!card.signed) {
                 card.signed = true
                 mobileApiService.saveCard(card)
             }
@@ -429,12 +509,12 @@
             needupdate = true;
 
         }
-        if( user.userid.isNullOrEmpty()){
+        if (user.userid.isNullOrEmpty()) {
             user.userid = person.userid
             user.bindtime = DateUtil.getNow()
-            needupdate=true
+            needupdate = true
         }
-        if(needupdate){
+        if (needupdate) {
             mobileApiService.saveUser(user)
         }
         var payseted = false
@@ -449,6 +529,7 @@
 
 
     }
+
     /**
      * 绑卡
      * */
@@ -464,16 +545,16 @@
                 ?: return JsonResult.error("卡片不存在，请重新绑定")
         //call sign api
         val person = userService.findOnePersonByUserid(card.userid)
-        var signed=""
+        var signed = ""
         //call api
         var resp = citizencardPayService.bindCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!)
         if (resp.code != "0000") {
             return JsonResult.error(resp.message)
         }
 
-        if (resp.sinstatus == YnrccUtil.TRANSTYPE_SIGNCARD ) {
+        if (resp.sinstatus == YnrccUtil.TRANSTYPE_SIGNCARD) {
             signed = TradeDict.STATUS_YES
-            if(!card.signed){
+            if (!card.signed) {
                 card.signed = true
                 mobileApiService.saveCard(card)
             }
@@ -600,7 +681,7 @@
             //call sign api
             val person = userService.findOnePersonByUserid(card.userid)
             val captcha = agree//此处为验证码，暂由此参数代替
-            var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!, YnrccUtil.TRANSTYPE_SIGNCARD,captcha)
+            var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!, YnrccUtil.TRANSTYPE_SIGNCARD, captcha)
             if (resp.code != "0000") {
                 return JsonResult.error(resp.message)
             }
@@ -620,7 +701,7 @@
      * 查询账单
      * */
     @RequestMapping("/bills")
-    fun bills(pageno: Int,platform: String?,type:String?): JsonResult {
+    fun bills(pageno: Int, month: String, platform: String?, type: String?): JsonResult {
         val p = SecurityContextHolder.getContext().authentication
         val user = mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
@@ -665,58 +746,58 @@
                 signed = TradeDict.STATUS_YES
             }
         }
-        var version:String?=""
-        var minversion:String?=""
-        var versionmsg:String?=""
-        var versionurl:String?=""
-        if(!platform.isNullOrEmpty()){
-            var map= mutableMapOf<String,Any>()
-            var key=""
-            if(platform.toLowerCase().contains("android")){
-                key="androidapp"
-                if(!type.isNullOrEmpty()){
-                    key+= "_$type"
+        var version: String? = ""
+        var minversion: String? = ""
+        var versionmsg: String? = ""
+        var versionurl: String? = ""
+        if (!platform.isNullOrEmpty()) {
+            val map: MutableMap<String, Any>
+            var key: String
+            if (platform.toLowerCase().contains("android")) {
+                key = "androidapp"
+                if (!type.isNullOrEmpty()) {
+                    key += "_$type"
                 }
                 dictionaryProxy.refreshDictionary(key)
                 map = dictionaryProxy.getDictionaryAsMap(key)
-                if(map["androidversion"]!=null){
+                if (map["androidversion"] != null) {
                     version = map["androidversion"] as String
                 }
-                if(map["androidminversion"]!=null){
+                if (map["androidminversion"] != null) {
                     minversion = map["androidminversion"] as String
                 }
-                if(map["androidversionmsg"]!=null){
+                if (map["androidversionmsg"] != null) {
                     versionmsg = map["androidversionmsg"] as String
                 }
-                if(map["androidversionurl"]!=null){
+                if (map["androidversionurl"] != null) {
                     versionurl = map["androidversionurl"] as String
                 }
 
-            }else if(platform.toLowerCase().contains("iphone")){
-                key="iosapp"
-                if(!type.isNullOrEmpty()){
-                    key+= "_$type"
+            } else if (platform.toLowerCase().contains("iphone")) {
+                key = "iosapp"
+                if (!type.isNullOrEmpty()) {
+                    key += "_$type"
                 }
                 dictionaryProxy.refreshDictionary(key)
                 map = dictionaryProxy.getDictionaryAsMap(key)
-                if(map["iosversion"]!=null){
+                if (map["iosversion"] != null) {
                     version = map["iosversion"] as String
                 }
-                if(map["iosminversion"]!=null){
+                if (map["iosminversion"] != null) {
                     minversion = map["iosminversion"] as String
                 }
-                if(map["iosversionmsg"]!=null){
+                if (map["iosversionmsg"] != null) {
                     versionmsg = map["iosversionmsg"] as String
                 }
-                if(map["iosversionurl"]!=null){
+                if (map["iosversionurl"] != null) {
                     versionurl = map["iosversionurl"] as String
                 }
             }
 
         }
 
-        var name = person.name
-        val page = userService.findPersondtlByUserid(user.userid!!, no)
+        val name = person.name
+        val page = userService.findPersondtlByUserid(user.userid!!, no, month)
         return JsonResult.ok("OK").put("page", page)
                 ?.put("today", today)
                 ?.put("yesterday", yester)
@@ -726,14 +807,29 @@
                 ?.put("name", name)
                 ?.put("needrebind", needrebind)
                 ?.put("signed", signed)
-                ?.put("version",version)
-                ?.put("minversion",minversion)
-                ?.put("versionmsg",versionmsg)
-                ?.put("versionurl",versionurl)
+                ?.put("version", version)
+                ?.put("minversion", minversion)
+                ?.put("versionmsg", versionmsg)
+                ?.put("versionurl", versionurl)
                 ?.put("userid", if (user.userid.isNullOrEmpty()) "" else user.userid)!!.put("t", t)!!
     }
 
     /**
+     * 获取某月支出统计
+     */
+    @RequestMapping("/billcount")
+    fun billCount(month: String): JsonResult? {
+        val p = SecurityContextHolder.getContext().authentication
+        val user: TBMobileUser = mobileApiService.findUserById(p.name)
+                ?: return JsonResult.error("用户不存在，请注册")
+        if (user.userid.isNullOrEmpty()) {
+            return JsonResult.ok("OK")
+        }
+        val data = userService.findDtlMonthCountByUserid(user.userid!!, month)
+        return JsonResult.ok().put("data", data)
+    }
+
+    /**
      * 账单明细
      * */
     @RequestMapping("/billdetail")
@@ -862,9 +958,9 @@
         val user = mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
         val resp = qrcodeService.encodeCode(user.uid)
-        return if(resp.retcode==0){
+        return if (resp.retcode == 0) {
             JsonResult.ok("ok").put("qrcode", resp.retmsg)!!
-        }else{
+        } else {
             JsonResult.error(resp.retmsg)
         }
     }
@@ -885,7 +981,7 @@
             //call sign api
             val person = userService.findOnePersonByUserid(card.userid)
             val captcha = ""//此处为验证码，暂由此参数代替
-            var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!, YnrccUtil.TRANSTYPE_UNSIGNCARD,captcha)
+            var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!, YnrccUtil.TRANSTYPE_UNSIGNCARD, captcha)
             if (resp.code != "0000") {
                 return JsonResult.error(resp.message)
             }
@@ -907,7 +1003,7 @@
         val p = SecurityContextHolder.getContext().authentication
         val user = mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
-        if(user.paypwd.isNullOrEmpty()){
+        if (user.paypwd.isNullOrEmpty()) {
             return JsonResult.error("支付密码未设置，请先设置")
         }
         val paypwdtimes = user.checkPaypwdtime()
@@ -943,7 +1039,7 @@
     @RequestMapping("/uploadphoto")
     fun uploadPhoto(file: MultipartFile): JsonResult {
         val p = SecurityContextHolder.getContext().authentication
-        val user = mobileApiService.findUserById(p.name)
+        mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
         /**
          * TODO
@@ -951,7 +1047,71 @@
          * 2.没有头像上传
          * 3.返回图片ID
          *
-        */
+         */
         return JsonResult.ok("OK")
     }
+
+    /**
+     * 上传图片接口
+     */
+    @RequestMapping(value = ["/uploadpic"], method = [RequestMethod.POST])
+    fun uploadPic(request: MultipartHttpServletRequest): JsonResult? {
+        val map = uploadPicService.uploadPic(request)
+        return if (map["retcode"] == "0") {
+            JsonResult.ok().put("picid", map["picid"])
+                    ?.put("minpicid", map["minpicid"])
+        } else {
+            JsonResult.error(map["retmsg"])
+        }
+    }
+
+    /**
+     * 发布留言
+     */
+    @RequestMapping(value = ["/feedback/release"], method = [RequestMethod.POST])
+    fun releaseFeedback(@RequestBody bean: FeedbackBean,request:HttpServletRequest): JsonResult? {
+        val p = SecurityContextHolder.getContext().authentication
+        val user = (mobileApiService.findUserById(p.name)
+                ?: return JsonResult.error("用户不存在，请注册"))
+        val feedback = TBFeedback().apply {
+            this.title = bean.title
+            this.content = bean.content
+            this.fbip = request.remoteAddr
+            this.mobileid = user.uid
+        }
+        if (!user.userid.isNullOrEmpty()) {
+            feedback.userid = user.userid
+        }
+        feedbackService.saveFeedback(feedback,bean.pictures)
+        return JsonResult.ok()
+    }
+
+    /**
+     * 查询留言列表接口
+     */
+    @RequestMapping(value = ["/feedback/list"], method = [RequestMethod.GET])
+    fun getFeedbackList(pagesize:Int,pageno:Int): JsonResult? {
+        val p = SecurityContextHolder.getContext().authentication
+        val user = (mobileApiService.findUserById(p.name)
+                ?: return JsonResult.error("用户不存在，请注册"))
+        val data = feedbackService.getFeedbackList(FeedbackSearchBean().apply {
+            this.pageno = pageno
+            this.pagesize = pagesize
+            this.mobileid = user.uid
+        })
+        return JsonResult.ok().put("data",data)
+    }
+
+    /**
+     * 查询单条留言详情
+    */
+    @RequestMapping(value = ["/feedback/{fbid}"], method = [RequestMethod.GET])
+    fun getFeedbackDetail(@PathVariable fbid:String): JsonResult? {
+        val p = SecurityContextHolder.getContext().authentication
+        val user = (mobileApiService.findUserById(p.name)
+                ?: return JsonResult.error("用户不存在，请注册"))
+        val feedback = feedbackService.getFeedbackDetail(fbid, user.uid)
+                ?: return JsonResult.error("未找到该条留言")
+        return JsonResult.ok().put("data",feedback)
+    }
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/ActivitiesBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/ActivitiesBean.kt
new file mode 100644
index 0000000..5b772b9
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/ActivitiesBean.kt
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.mobile.bean
+
+class ActivitiesBean {
+    var code: String = ""
+    var pagesize: Int = 0
+    var pageno:Int = 0
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/FeedbackBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/FeedbackBean.kt
new file mode 100644
index 0000000..c2d8c05
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/FeedbackBean.kt
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.mobile.bean
+
+class FeedbackBean {
+    var title: String = ""
+    var content: String = ""
+    var pictures: List<PictureBean> = ArrayList()
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/PictureBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/PictureBean.kt
new file mode 100644
index 0000000..c760794
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/bean/PictureBean.kt
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.mobile.bean
+
+class PictureBean {
+    var picid: String = ""
+    var minpicid: String = ""
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/exception/PortalBusinessException.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/exception/PortalBusinessException.kt
new file mode 100644
index 0000000..a6dc025
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/exception/PortalBusinessException.kt
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.mobile.exception
+
+import java.lang.RuntimeException
+
+class PortalBusinessException(msg: String) : RuntimeException(msg) {
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
index 3971f40..8860dc1 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
@@ -1,12 +1,14 @@
 package com.supwisdom.dlpay.portal
 
 import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.service.UploadPicService
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
 import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
 import com.supwisdom.dlpay.framework.service.OperatorDetailService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.mobile.exception.PortalBusinessException
 import com.supwisdom.dlpay.portal.bean.*
 import com.supwisdom.dlpay.portal.domain.TBArticle
 import com.supwisdom.dlpay.portal.domain.TBColumn
@@ -46,6 +48,8 @@
     lateinit var articleService: ArticleService
     @Autowired
     lateinit var columnService: ColumnService
+    @Autowired
+    lateinit var uploadPicService: UploadPicService
     val logger = KotlinLogging.logger { }
 
     @RequestMapping("/test")
@@ -184,7 +188,7 @@
 
     @RequestMapping(value = ["/article/uploadpic"], method = [RequestMethod.POST])
     fun uploadPic(request: MultipartHttpServletRequest): JsonResult? {
-        val map = articleService.uploadPic(request)
+        val map = uploadPicService.uploadPic(request)
         return JsonResult.ok()
     }
 
@@ -251,15 +255,18 @@
 
     @RequestMapping(value = ["/article/release"], method = [RequestMethod.POST])
     fun releaseArticle(@RequestBody article: TBArticle): JsonResult? {
-        return try {
+         try {
             val p = SecurityContextHolder.getContext().authentication
             val oper = operatorDetailService.findByOperid(p.name)
             article.operid = oper.operid
             articleService.releaseArticle(article)
-            JsonResult.ok()
+             return JsonResult.ok()
         } catch (e: Exception) {
             logger.error { e.message }
-            JsonResult.error("发布文章异常")
+            if (e is PortalBusinessException) {
+                return JsonResult.error(e.message)
+            }
+             return JsonResult.error("发布文章异常")
         }
     }
 
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/DtlGroupResultBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/DtlGroupResultBean.kt
new file mode 100644
index 0000000..0833091
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/DtlGroupResultBean.kt
@@ -0,0 +1,8 @@
+package com.supwisdom.dlpay.portal.bean
+
+import java.math.BigDecimal
+
+class DtlGroupResultBean {
+    var transtype:String = ""
+    var amount:BigDecimal = BigDecimal(0)
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt
index 3b15a48..d15c56b 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt
@@ -2,10 +2,11 @@
 
 class FeedbackSearchBean {
     var username: String = ""
-    var content: String = ""
+    var title: String = ""
     var startdate: String = ""
     var enddate: String = ""
     var replystatus: String = ""
     var pageno: Int = 0
     var pagesize: Int = 10
+    var mobileid: String = ""
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleDao.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleDao.kt
index 3e4ca6b..0515fde 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleDao.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleDao.kt
@@ -6,5 +6,6 @@
 
 @Repository
 interface ArticleDao : JpaRepository<TBArticle, String>, ArticleRepository {
-    fun findByArticlenoAndIsdelete(articleno: String,isdelete:String): TBArticle?
+    fun findByArticlenoAndIsdelete(articleno: String, isdelete: String): TBArticle?
+    fun findByArticlenoAndStatusAndIsdisplay(articleno: String, status: String, isdisplay: String): TBArticle?
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleRepository.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleRepository.kt
index 9c27094..a1379da 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleRepository.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ArticleRepository.kt
@@ -2,9 +2,12 @@
 
 import com.supwisdom.dlpay.framework.jpa.page.Pagination
 import com.supwisdom.dlpay.portal.bean.ArticleSearchBean
+import com.supwisdom.dlpay.portal.domain.TBArticle
 import java.text.ParseException
 
 interface ArticleRepository {
     @Throws(ParseException::class)
-    fun getArticleList(bean:ArticleSearchBean): Pagination
+    fun getArticleList(bean: ArticleSearchBean): Pagination
+
+    fun getArticleListByColumnid(columnid: String, pageno: Int, pagesize: Int): List<TBArticle>
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ColumnDao.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ColumnDao.kt
index fa53b3c..1283cc1 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ColumnDao.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ColumnDao.kt
@@ -8,4 +8,5 @@
 interface ColumnDao: JpaRepository<TBColumn, String>,ColumnRepository {
     fun findByNameAndColumnidNot(name: String,columnid:String): TBColumn?
     fun findByCodeAndColumnidNot(code:String,columnid:String): TBColumn?
+    fun findByCodeIn(codes:List<String>):List<TBColumn>?
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/FeedbackDao.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/FeedbackDao.kt
index 9d55724..58d4d5f 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/FeedbackDao.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/FeedbackDao.kt
@@ -5,6 +5,6 @@
 import org.springframework.stereotype.Repository
 
 @Repository
-interface FeedbackDao :JpaRepository<TBFeedback,String>,FeedbackRepository{
-
+interface FeedbackDao : JpaRepository<TBFeedback, String>, FeedbackRepository {
+    fun getByFbidAndMobileid(fbid: String, mobileid: String):TBFeedback?
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ArticleService.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ArticleService.kt
index 7eaa432..89409d6 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ArticleService.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ArticleService.kt
@@ -1,15 +1,15 @@
 package com.supwisdom.dlpay.portal.service
 
 import com.supwisdom.dlpay.framework.jpa.page.Pagination
+import com.supwisdom.dlpay.mobile.bean.ActivitiesBean
 import com.supwisdom.dlpay.portal.bean.ArticleSearchBean
 import com.supwisdom.dlpay.portal.domain.TBArticle
+import com.supwisdom.dlpay.portal.domain.TBColumn
 import org.springframework.transaction.annotation.Transactional
 import org.springframework.web.multipart.MultipartHttpServletRequest
 
 interface ArticleService {
     @Transactional
-    fun uploadPic(request: MultipartHttpServletRequest): Map<String, String>
-    @Transactional
     fun saveArticle(article: TBArticle)
     @Transactional
     fun releaseArticle(article: TBArticle)
@@ -23,4 +23,10 @@
     fun switchDisplay(articleno:String,value:String):String
     @Transactional
     fun getArticle(articleno:String):TBArticle
+    @Transactional
+    fun getArticleByColumn(columnList:List<TBColumn>,map:Map<String, ActivitiesBean>):List<TBColumn>
+    @Transactional
+    fun getMobileArticle(articleno:String):TBArticle
+    @Transactional
+    fun addArticleHits(article:TBArticle):TBArticle
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ColumnService.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ColumnService.kt
index ea3db3e..563faf7 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ColumnService.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/ColumnService.kt
@@ -7,9 +7,17 @@
 
 interface ColumnService {
     @Transactional
-    fun saveColumn(column:TBColumn):String?
+    fun saveColumn(column: TBColumn): String?
+
     @Transactional
     fun getColumnList(bean: ColumnSearchBean): Pagination
+
     @Transactional
-    fun getAllColumnList():List<TBColumn>?
+    fun getAllColumnList(): List<TBColumn>?
+
+    @Transactional
+    fun getColumnListByCode(codes: List<String>): List<TBColumn>?
+
+    @Transactional
+    fun getColunmByid(columnid: String): TBColumn?
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/FeedbackService.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/FeedbackService.kt
index 2b8e221..5a22ae8 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/FeedbackService.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/FeedbackService.kt
@@ -1,15 +1,26 @@
 package com.supwisdom.dlpay.portal.service
 
 import com.supwisdom.dlpay.framework.jpa.page.Pagination
+import com.supwisdom.dlpay.mobile.bean.FeedbackBean
+import com.supwisdom.dlpay.mobile.bean.PictureBean
 import com.supwisdom.dlpay.portal.bean.FeedbackSearchBean
+import com.supwisdom.dlpay.portal.domain.TBFeedback
 import com.supwisdom.dlpay.portal.domain.TBReply
 import org.springframework.transaction.annotation.Transactional
 
 interface FeedbackService {
     @Transactional
     fun getFeedbackList(bean: FeedbackSearchBean): Pagination
+
     @Transactional
     fun getReplyListByFbId(fbId: String): List<TBReply>
+
     @Transactional
-    fun saveReplyListByFbId(reply: TBReply):String?
+    fun saveReplyListByFbId(reply: TBReply): String?
+
+    @Transactional
+    fun saveFeedback(feedback: TBFeedback, pictures: List<PictureBean>)
+
+    @Transactional
+    fun getFeedbackDetail(fbid: String, mobileid: String): TBFeedback?
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ArticleServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ArticleServiceImpl.kt
index 2d45cb6..f10cb67 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ArticleServiceImpl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ArticleServiceImpl.kt
@@ -2,29 +2,24 @@
 
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao
 import com.supwisdom.dlpay.framework.jpa.page.Pagination
+import com.supwisdom.dlpay.framework.service.OperatorDetailService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.mobile.bean.ActivitiesBean
+import com.supwisdom.dlpay.mobile.exception.PortalBusinessException
 import com.supwisdom.dlpay.portal.bean.ArticleSearchBean
 import com.supwisdom.dlpay.portal.dao.ArticleAuthDao
 import com.supwisdom.dlpay.portal.dao.ArticleDao
 import com.supwisdom.dlpay.portal.dao.ColumnDao
 import com.supwisdom.dlpay.portal.domain.TBArticle
 import com.supwisdom.dlpay.portal.domain.TBArticleAuth
+import com.supwisdom.dlpay.portal.domain.TBColumn
 import com.supwisdom.dlpay.portal.service.ArticleService
 import com.supwisdom.dlpay.portal.util.PortalConstant
-import com.supwisdom.dlpay.portal.util.PutImageToServer
 import mu.KotlinLogging
-import net.coobird.thumbnailator.Thumbnails
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
-import org.springframework.web.multipart.MultipartFile
-import org.springframework.web.multipart.MultipartHttpServletRequest
-import java.io.File
-import java.io.FileInputStream
-import java.io.IOException
 import java.sql.Timestamp
-import java.util.*
-import kotlin.math.sqrt
 
 @Service
 class ArticleServiceImpl : ArticleService {
@@ -38,6 +33,8 @@
     lateinit var articleAuthDao: ArticleAuthDao
     @Autowired
     lateinit var columnDao: ColumnDao
+    @Autowired
+    lateinit var operatorDetailService: OperatorDetailService
 
     val logger = KotlinLogging.logger { }
 
@@ -47,10 +44,10 @@
         }
         val timestamp = systemUtilService.sysdatetime.sysdate
         article.status = PortalConstant.ARTICLE_STATUS_SAVE
-        saveArticle(article,timestamp)
+        saveArticle(article, timestamp)
     }
 
-    fun saveArticle(article: TBArticle,timestamp:Timestamp): TBArticle {
+    fun saveArticle(article: TBArticle, timestamp: Timestamp): TBArticle {
         if (StringUtil.isEmpty(article.articleid)) {
             val currentNoBusiness = businessparaDao.findByParakey(PortalConstant.SYSPARA_ARTICLE_CURRENTNO)
                     ?: throw RuntimeException("文章编号参数未配置")
@@ -72,21 +69,24 @@
         if (article.status != null &&
                 article.status != PortalConstant.ARTICLE_STATUS_SAVE &&
                 article.status != PortalConstant.ARTICLE_STATUS_PASS) {
-            throw RuntimeException("文章状态异常")
+            throw PortalBusinessException("文章状态异常")
         }
         val timestamp = systemUtilService.sysdatetime.sysdate
         article.releasetime = timestamp
         article.status = PortalConstant.ARTICLE_STATUS_RELEASED
-        val savedArticle = saveArticle(article,timestamp)
+        val savedArticle = saveArticle(article, timestamp)
         val optional = columnDao.findById(savedArticle.columnid)
         if (!optional.isPresent) {
-            throw RuntimeException("文章栏目未找到")
+            throw PortalBusinessException("文章栏目未找到")
         }
         val column = optional.get()
+        if (column.publishable == PortalConstant.NO) {
+            throw PortalBusinessException("该栏目下不能发布文章")
+        }
         if (column.needreview == PortalConstant.YES) {
             articleAuthDao.findByArticlenoAndStatus(savedArticle.articleno,
                     PortalConstant.ARTICLE_STATUS_PASS)
-                    ?: throw RuntimeException("文章未通过审核，不能发布")
+                    ?: throw PortalBusinessException("文章未通过审核，不能发布")
         }
     }
 
@@ -97,7 +97,7 @@
         }
         val timestamp = systemUtilService.sysdatetime.sysdate
         article.status = PortalConstant.ARTICLE_STATUS_REVIEW
-        val savedArticle = saveArticle(article,timestamp)
+        val savedArticle = saveArticle(article, timestamp)
         val optional = columnDao.findById(savedArticle.columnid)
         if (!optional.isPresent) {
             throw RuntimeException("文章栏目未找到")
@@ -138,180 +138,35 @@
                 ?: throw RuntimeException("编号为：[${articleno}]的文章未找到")
     }
 
-    override fun uploadPic(request: MultipartHttpServletRequest): Map<String, String> {
-        val map: MutableMap<String, String> = HashMap()
-        try {
-            logger.error("===put up pic")
-            val pathDir = "/files/"
-            /** 得到图片保存目录的真实路径  */
-            val logoRealPathDir = request.session.servletContext
-                    .getRealPath(pathDir)
-            /** 根据真实路径创建目录  */
-            val logoSaveFile = File(logoRealPathDir)
-            if (!logoSaveFile.exists()) logoSaveFile.mkdirs()
-            /** 页面控件的文件流  */
-            val multipartFile: MultipartFile
-            multipartFile = request.getFile("file")
-            //System.out.println(multipartFile);
-            /* 获取文件的后缀 */
-            val suffix = multipartFile.originalFilename.substring(
-                    multipartFile.originalFilename.lastIndexOf("."))
-            //* 拼成完整的文件保存路径加文件 *//*
-            val name = System.currentTimeMillis().toString() + suffix
-            val fileName = logoRealPathDir + File.separator + name
-            val file = File(fileName)
-            // String data = file.getPath();
-            try {
-                multipartFile.transferTo(file)
-            } catch (e: IllegalStateException) {
-                logger.error("error:", e)
-            } catch (e: IOException) {
-                logger.error("error:", e)
-            }
-            //savePicToDb(fileName, goodsidString);*/
-            //String filepath = logoRealPathDir + File.separator + multipartFile.getOriginalFilename();
-            val size = multipartFile.size
-            var maxSize = 200 * 1024.toLong()
-            val imageMaxConf = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_MAXSIZE)
-            if (imageMaxConf != null && !StringUtil.isEmpty(imageMaxConf)) {
-                try {
-                    maxSize = imageMaxConf.toLong()
-                } catch (e: Exception) {
+    override fun getArticleByColumn(columnList: List<TBColumn>, map: Map<String, ActivitiesBean>): List<TBColumn> {
+        columnList.forEach {
+            val page = map.getOrElse(it.code) {
+                ActivitiesBean().apply {
+                    this.pageno = 1
+                    this.pagesize = 1
                 }
             }
-            var minwidth = 150
-            var minheight = 150
-            val imageMinConf = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_MINISIZE)
-            if (imageMinConf != null && !StringUtil.isEmpty(imageMinConf)) {
-                try {
-                    val temps = imageMinConf.split(",")
-                    if (temps.size == 2) {
-                        minwidth = temps[0].toInt()
-                        minheight = temps[1].toInt()
-                    }
-                } catch (e: Exception) {
-                    logger.error("error:", e)
-                }
-            }
-            logger.error("===put up pic 1")
-            var baseURL = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_URLASSIGN)
-            if (baseURL == null || StringUtil.isEmpty(baseURL)) {
-                map["retmsg"] = "系统未配置图片服务器地址，无法保存图片！"
-                map["retcode"] = "1"
-                return map
-            }
-            if (!baseURL.startsWith("http")) {
-                baseURL = "http://$baseURL"
-            }
-            if (baseURL.endsWith("/")) {
-                baseURL = baseURL.substring(0, baseURL.length - 1)
-            }
-            logger.error("===put up pic 2")
-            var minImageURL: String
-            val picid: String
-            val minpicid: String
-            var imageURL = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_URLPUSH)
-            if (imageURL == null || StringUtil.isEmpty(imageURL)) {
-                map["retmsg"] = "系统未配置图片服务器地址，无法保存图片！"
-                map["retcode"] = "1"
-                return map
-            }
-            logger.error("===put up pic 4")
-            if (!imageURL.startsWith("http")) {
-                imageURL = "http://$imageURL"
-            }
-            if (!imageURL.endsWith("/")) {
-                imageURL += "/"
-            }
-            minImageURL = imageURL
-            if (!minImageURL.startsWith("http")) {
-                minImageURL = "http://$minImageURL"
-            }
-            if (!minImageURL.endsWith("/")) {
-                minImageURL += "/"
-            }
-            val assign = "$baseURL/dir/assign?count=2"
-            val bean = PutImageToServer.postBefore(assign)
-            if (bean == null || StringUtil.isEmpty(bean.getFid())) {
-                map["retmsg"] = "图片上传失败，无法连接图片服务器！"
-                map["retcode"] = "1"
-                return map
-            }
-            imageURL += bean.fid
-            picid = bean.fid
-            val minImgBean = PutImageToServer.postBefore(assign)
-            if (minImgBean == null || StringUtil.isEmpty(minImgBean.getFid())) {
-                map["retmsg"] = "图片上传失败，无法连接图片服务器！"
-                map["retcode"] = "1"
-                return map
-            }
-            minpicid = minImgBean.fid
-            minImageURL += minImgBean.fid
-            //}
-            val processToFile = logoRealPathDir + File.separator + picid + ".jpg"
-            var scale = 1.0
-            if (size > 0 && size > maxSize) {
-                scale = maxSize * 1.0 / size
-            }
-            try {
-                if (scale < 0.7) {
-                    val s = sqrt(maxSize.toDouble()).toInt()
-                    Thumbnails.of(fileName).size(s, s).outputFormat("jpg").toFile(processToFile)
-                } else {
-                    Thumbnails.of(fileName).scale(1.0).outputQuality(scale).outputFormat("jpg").toFile(processToFile)
-                }
-                logger.error("===put up pic 5")
-            } catch (e: Exception) {
-                map["retmsg"] = "图片上传失败，压缩失败"
-                map["retcode"] = "1"
-                file.delete()
-                return map
-            }
-            val file1 = File(processToFile)
-            val processToMinFile = logoRealPathDir + File.separator + minpicid + ".jpg"
-            try {
-                Thumbnails.of(fileName).size(minwidth, minheight).outputFormat("jpg").toFile(processToMinFile)
-            } catch (e: Exception) {
-                map["retmsg"] = "图片上传失败，压缩失败"
-                map["retcode"] = "1"
-                file.delete()
-                file1.delete()
-                return map
-            }
-            val file2 = File(processToMinFile)
-            logger.error("==========imageurl=$imageURL")
-            if (!PutImageToServer.postImage(imageURL, FileInputStream(file1))) {
-                map["retmsg"] = "图片上传失败，请稍后再试"
-                map["retcode"] = "1"
-                file1.delete()
-                file2.delete()
-                file.delete()
-                logger.error("=step1 fail=")
-                return map
-            }
-            if (!PutImageToServer.postImage(minImageURL, FileInputStream(file2))) {
-                map["retmsg"] = "图片上传失败，请稍后再试"
-                map["retcode"] = "1"
-                file1.delete()
-                file2.delete()
-                file.delete()
-                logger.error("=step2 fail=")
-            } else {
-                map["retmsg"] = "上传成功"
-                map["retcode"] = "0"
-                file1.delete()
-                file2.delete()
-                file.delete()
-                map["picid"] = picid
-                map["minpicid"] = minpicid
-                logger.error("=step3 success=")
-            }
-        } catch (e: Exception) {
-            map["retmsg"] = "图片上传失败--" + e.message
-            map["retcode"] = "1"
-            // return map;
-            logger.error("=step fail=", e)
+            val articleList = articleDao.getArticleListByColumnid(it.columnid, page.pageno, page.pagesize)
+            it.articles = articleList
         }
-        return map
+        return columnList
+    }
+
+    override fun getMobileArticle(articleno: String): TBArticle {
+        val article = articleDao.findByArticlenoAndStatusAndIsdisplay(articleno, PortalConstant.ARTICLE_STATUS_RELEASED, PortalConstant.YES)
+                ?: throw PortalBusinessException("该文章不存在")
+        if (article.isdelete == PortalConstant.YES) {
+            throw PortalBusinessException("文章已删除")
+        }
+        val oper = operatorDetailService.findByOperid(article.operid)
+        if (oper != null) {
+            article.author = oper.opername
+        }
+        return article
+    }
+
+    override fun addArticleHits(article: TBArticle): TBArticle {
+        article.hits += 1
+        return articleDao.save(article)
     }
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ColumnServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ColumnServiceImpl.kt
index f83e441..59ae3bc 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ColumnServiceImpl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/ColumnServiceImpl.kt
@@ -23,6 +23,15 @@
         return columnDao.findAll()
     }
 
+    override fun getColumnListByCode(codes: List<String>): List<TBColumn>? {
+        return columnDao.findByCodeIn(codes)
+    }
+
+    override fun getColunmByid(columnid: String): TBColumn? {
+        val optional = columnDao.findById(columnid)
+        return optional.orElseGet(null)
+    }
+
     override fun saveColumn(column: TBColumn):String? {
         var columnid = "####"
         if (!StringUtil.isEmpty(column.columnid)) {
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt
index d690911..dfa359d 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt
@@ -3,10 +3,14 @@
 import com.supwisdom.dlpay.framework.jpa.page.Pagination
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.mobile.bean.FeedbackBean
+import com.supwisdom.dlpay.mobile.bean.PictureBean
+import com.supwisdom.dlpay.mobile.service.MobileUserService
 import com.supwisdom.dlpay.portal.bean.FeedbackSearchBean
 import com.supwisdom.dlpay.portal.dao.AnnexDao
 import com.supwisdom.dlpay.portal.dao.FeedbackDao
 import com.supwisdom.dlpay.portal.dao.ReplyDao
+import com.supwisdom.dlpay.portal.domain.TBAnnex
 import com.supwisdom.dlpay.portal.domain.TBFeedback
 import com.supwisdom.dlpay.portal.domain.TBReply
 import com.supwisdom.dlpay.portal.service.FeedbackService
@@ -23,16 +27,23 @@
     @Autowired
     lateinit var systemUtilService: SystemUtilService
     @Autowired
+    lateinit var mobileUserService: MobileUserService
+    @Autowired
     lateinit var annexDao: AnnexDao
 
+    @Suppress("UNCHECKED_CAST")
     override fun getFeedbackList(bean: FeedbackSearchBean): Pagination {
         val page = feedbackDao.getFeedbackList(bean)
         val list = page.list as List<TBFeedback>
-        list.forEach { feedback ->
-            run {
-                feedback.pictures = annexDao.getByFbid(feedback.fbid)
+        list.forEach {
+            it.pictures = annexDao.getByFbid(it.fbid)
+            if (it.userid.isNullOrEmpty()) {
+                val mobileUser = mobileUserService.getByUid(it.mobileid)
+                if (mobileUser != null) {
+                    it.username = "用户" + mobileUser.phone!!.substring(7)
+                }
             }
-         }
+        }
         return page
     }
 
@@ -53,4 +64,36 @@
             "回复的留言不存在"
         }
     }
+
+    override fun saveFeedback(feedback: TBFeedback, pictures: List<PictureBean>) {
+        feedback.apply {
+            this.fbtime = systemUtilService.sysdatetime.hostdatetime
+            this.replystatus = PortalConstant.NO
+        }
+        val saved = feedbackDao.save(feedback)
+        if (pictures.isNotEmpty()) {
+            val annexList = ArrayList<TBAnnex>()
+            pictures.forEach {
+                val annex = TBAnnex().apply {
+                    this.minpicid = it.minpicid
+                    this.picid = it.picid
+                    this.fbid = saved.fbid
+                }
+                annexList.add(annex)
+            }
+            annexDao.saveAll(annexList)
+        }
+    }
+
+    override fun getFeedbackDetail(fbid: String, mobileid: String): TBFeedback? {
+        val feedback = feedbackDao.getByFbidAndMobileid(fbid,mobileid)
+                ?:return null
+        if (feedback.replystatus == PortalConstant.YES) {
+            val replayList = replyDao.getAllByFbid(fbid)
+            if (replayList.isNotEmpty()) {
+                feedback.reply = replayList[0]
+            }
+        }
+        return feedback
+    }
 }
\ No newline at end of file
diff --git a/frontend/src/assets/icon/iconfont.css b/frontend/src/assets/icon/iconfont.css
new file mode 100644
index 0000000..63c387c
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.css
@@ -0,0 +1,21 @@
+@font-face {font-family: "iconfont";
+  src: url('iconfont.eot?t=1599460043694'); /* IE9 */
+  src: url('iconfont.eot?t=1599460043694#iefix') format('embedded-opentype'), /* IE6-IE8 */
+  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAALYAAsAAAAABngAAAKLAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAp8gRYBNgIkAwgLBgAEIAWEbQc4G8QFERWMR7KfB7bzlEZQCL2C9ItjsqG9Uhwb3Pfg+Xe/7L4kM00zBVbEtKyIUW33eEa3mhUAOpR/a7oO9xgTobokw7LVtJ35704vTRnncRqlEBIhaYAAgrFtRVV11SfuHf8F9EFaDyjHtTdN6gLq4kAKaG+MIivGhKVh7AKX8BgCOBLlk/bO/jFYDNYqAWT+nFlTsLkQBsOyFsFfc9Agh/Fh1R51H4tD4fflJ1EWFD6NVTdiZsd0mr8stvP0Zm+z8b6F3fM5AHYMNJAPDMiY2tQgGmGsxqUMqdhXtcCXxZ7nW5C9GhH201mVIQDEQ9E9iV3JrWYVwG2NJB00jPovQNLX7X10FKdCxT19vMePe/SoJ08cOXHsaOzj93/60pMPkpaVdG3LHj7UHRPXdXZe939V9s0c7P2VuS53zZ3Dm2W7ujecuXH8+lvPVtUXsq9cS7qa+TAu9Ebsdb7fVDQD4K3WTzQhgMCd6Vv+xeH1f+3MAPBy3e974RJvtUEvAuzu3QK/Sdyzy+hSy6yMKq7tV6SfvsHhAA/si/JmrC72nnKCJXaEJ4iE1KexMykMZPLhI0A5/Fi4TXDybI4HRGMuWTCQ6w0gInyghLkNLcKXMMwPPnH+8IvIhTOu6AsDMqtUG2MqWED2giqnXjtWUVH1Cc3UppyVhpwb8lhFIfSCYnaDPfIcW8a7iUQ0aKYO1uA5bFuCganGXLxSZJj7vq57k5dTZyltGEoJVACZF1DJkZ72BwtV+vwJMiatFLd01IRvEBtV44OQJ+hBbFR9r457eWV0Z0SE0IDGSAeswTzUahEw1M+roZzwlCMSgznf7qX7qrz1Nd3XHQIcS6+yJ2jCXmI5VbFbnGZpH1oWAAA=') format('woff2'),
+  url('iconfont.woff?t=1599460043694') format('woff'),
+  url('iconfont.ttf?t=1599460043694') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+  url('iconfont.svg?t=1599460043694#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.iconchehui_huaban1:before {
+  content: "\e670";
+}
+
diff --git a/frontend/src/assets/icon/iconfont.eot b/frontend/src/assets/icon/iconfont.eot
new file mode 100644
index 0000000..761f4e7
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.eot
Binary files differ
diff --git a/frontend/src/assets/icon/iconfont.js b/frontend/src/assets/icon/iconfont.js
new file mode 100644
index 0000000..b8807a3
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.js
@@ -0,0 +1 @@
+!function(e){var t,n,o,i,d,c,a,s='<svg><symbol id="iconchehui_huaban1" viewBox="0 0 1024 1024"><path d="M502.70473274 78.69756672a458.32815083 458.32815083 0 0 0-260.98248816 81.51233893v-143.00410282h-71.50205226v275.99791896h277.42796114v-71.50205223H277.47326987a393.26128489 393.26128489 0 1 1 225.23146287 715.02051752A394.69132538 394.69132538 0 0 1 126.60394192 655.00410283a36.46604637 36.46604637 0 0 0-43.61625211-22.16563492 35.75102528 35.75102528 0 0 0-23.59567704 44.33127151 464.76333549 464.76333549 0 1 0 444.74276211-598.4721727z"  ></path></symbol></svg>',l=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss");if(l&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(e){console&&console.log(e)}}function r(){c||(c=!0,i())}n=function(){var e,t,n,o,i,d=document.createElement("div");d.innerHTML=s,s=null,(e=d.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",t=e,(n=document.body).firstChild?(o=t,(i=n.firstChild).parentNode.insertBefore(o,i)):n.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(n,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),n()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=n,d=e.document,c=!1,(a=function(){try{d.documentElement.doScroll("left")}catch(e){return void setTimeout(a,50)}r()})(),d.onreadystatechange=function(){"complete"==d.readyState&&(d.onreadystatechange=null,r())})}(window);
\ No newline at end of file
diff --git a/frontend/src/assets/icon/iconfont.json b/frontend/src/assets/icon/iconfont.json
new file mode 100644
index 0000000..f41db51
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.json
@@ -0,0 +1,16 @@
+{
+  "id": "2050059",
+  "name": "dali-portal",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "14421605",
+      "name": "撤回操作",
+      "font_class": "chehui_huaban1",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    }
+  ]
+}
diff --git a/frontend/src/assets/icon/iconfont.svg b/frontend/src/assets/icon/iconfont.svg
new file mode 100644
index 0000000..dc74a2d
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.svg
@@ -0,0 +1,29 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2013-9-30: Created.
+-->
+<svg>
+<metadata>
+Created by iconfont
+</metadata>
+<defs>
+
+<font id="iconfont" horiz-adv-x="1024" >
+  <font-face
+    font-family="iconfont"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    ascent="896"
+    descent="-128"
+  />
+    <missing-glyph />
+    
+    <glyph glyph-name="chehui_huaban1" unicode="&#58992;" d="M502.70473274 817.3024332800001a458.32815083 458.32815083 0 0 1-260.98248816-81.51233893v143.00410282h-71.50205226v-275.99791896h277.42796114v71.50205223H277.47326987a393.26128489 393.26128489 0 1 0 225.23146287-715.02051752A394.69132538 394.69132538 0 0 0 126.60394192 240.99589717000003a36.46604637 36.46604637 0 0 1-43.61625211 22.16563492 35.75102528 35.75102528 0 0 1-23.59567704-44.33127151 464.76333549 464.76333549 0 1 1 444.74276211 598.4721727z"  horiz-adv-x="1024" />
+
+    
+
+
+  </font>
+</defs></svg>
diff --git a/frontend/src/assets/icon/iconfont.ttf b/frontend/src/assets/icon/iconfont.ttf
new file mode 100644
index 0000000..a2735b0
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.ttf
Binary files differ
diff --git a/frontend/src/assets/icon/iconfont.woff b/frontend/src/assets/icon/iconfont.woff
new file mode 100644
index 0000000..b9afbd5
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.woff
Binary files differ
diff --git a/frontend/src/assets/icon/iconfont.woff2 b/frontend/src/assets/icon/iconfont.woff2
new file mode 100644
index 0000000..5a34691
--- /dev/null
+++ b/frontend/src/assets/icon/iconfont.woff2
Binary files differ
diff --git a/frontend/src/components/Tinymce/index.vue b/frontend/src/components/Tinymce/index.vue
index 7a9877f..68ef381 100644
--- a/frontend/src/components/Tinymce/index.vue
+++ b/frontend/src/components/Tinymce/index.vue
@@ -1,5 +1,5 @@
 <template>
-  <div :class="{fullscreen:fullscreen}" class="tinymce-container" :style="{width:containerWidth}">
+  <div :class="{fullscreen:fullscreen}" class="tinymce-container" style="width:600px">
     <textarea :id="tinymceId" class="tinymce-textarea" />
     <div class="editor-custom-btn-container">
       <editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" />
diff --git a/frontend/src/main.js b/frontend/src/main.js
index e750af9..b9225cf 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -20,6 +20,8 @@
 
 import * as filters from './filters' // global filters
 
+import './assets/icon/iconfont.css' // iconfont
+
 /**
  * If you don't want to use mock-server
  * you want to use MockJs for mock api
diff --git a/frontend/src/views/article/components/ArticleDetail.vue b/frontend/src/views/article/components/ArticleDetail.vue
index ec84f4b..9496019 100644
--- a/frontend/src/views/article/components/ArticleDetail.vue
+++ b/frontend/src/views/article/components/ArticleDetail.vue
@@ -267,6 +267,8 @@
           showClose: true,
           duration: 1000
         })
+        this.$store.dispatch('tagsView/delView', this.$route)
+        this.$router.go(-1)
       }).catch(error => {
         this.$message({
           message: error.msg || '请求异常',
diff --git a/frontend/src/views/article/list.vue b/frontend/src/views/article/list.vue
index 5fb208d..084f69e 100644
--- a/frontend/src/views/article/list.vue
+++ b/frontend/src/views/article/list.vue
@@ -107,7 +107,7 @@
           />
         </template>
       </el-table-column>
-      <el-table-column width="120px" label="操作" align="center">
+      <el-table-column width="160px" label="操作" align="center">
         <template slot-scope="{row}">
           <el-tooltip v-if="row.status==='save'" class="item" effect="dark" content="编辑" placement="bottom">
             <router-link :to="'/article/edit/'+row.articleno">
@@ -123,6 +123,11 @@
           <el-tooltip class="item" effect="dark" content="删除" placement="bottom">
             <el-button type="primary" icon="el-icon-delete" circle size="mini" @click="deleteArticle(row)" />
           </el-tooltip>
+          <!-- <el-tooltip v-if="row.status!=='save' && row.status!=='released'" class="item" effect="dark" content="撤回" placement="bottom">
+            <el-button type="primary" size="mini" circle>
+              <i class="iconfont iconchehui_huaban1" style="font-size:12px" />
+            </el-button>
+          </el-tooltip> -->
         </template>
       </el-table-column>
     </el-table>
diff --git a/frontend/src/views/feedback/index.vue b/frontend/src/views/feedback/index.vue
index 125e87f..868b6dc 100644
--- a/frontend/src/views/feedback/index.vue
+++ b/frontend/src/views/feedback/index.vue
@@ -8,10 +8,10 @@
         style="width: 350px;margin-right:50px"
         class="filter-item"
       />
-      <div class="filter-item" style="margin-right:15px">留言内容</div>
+      <div class="filter-item" style="margin-right:15px">留言标题</div>
       <el-input
-        v-model="formData.content"
-        placeholder="留言关键字"
+        v-model="formData.title"
+        placeholder="留言标题"
         style="width: 300px;margin-right:50px"
         class="filter-item"
       />
@@ -68,9 +68,9 @@
           <span>{{ row.username }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="留言内容" align="center">
+      <el-table-column label="留言标题" align="center">
         <template slot-scope="{row}">
-          <span>{{ row.content }}</span>
+          <span>{{ row.title }}</span>
         </template>
       </el-table-column>
       <el-table-column label="状态" align="center" width="100">
@@ -249,7 +249,7 @@
       queryDate: null,
       formData: {
         username: '',
-        content: '',
+        title: '',
         replystatus: '',
         startdate: '',
         enddate: '',
@@ -336,7 +336,7 @@
     },
     clearFilter() {
       this.formData.username = ''
-      this.formData.content = ''
+      this.formData.title = ''
       this.formData.replystatus = ''
       this.queryDate = null
     },
