Parcourir la source

add:书签列表v1

tujidelv il y a 1 an
Parent
commit
e882ceeccc

+ 83 - 0
src/main/java/top/lvzhiqiang/entity/BookmarkInfo.java

@@ -0,0 +1,83 @@
+package top.lvzhiqiang.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 书签信息表
+ *
+ * @author lvzhiqiang
+ * 2024/10/21 10:43
+ */
+@Data
+public class BookmarkInfo implements Serializable {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 书签的名称,不能为空
+     */
+    private String title;
+
+    /**
+     * 书签的链接,不能为空,最大长度为2048个字符(以适应大部分URL)
+     */
+    private String url;
+
+    /**
+     * 标签字段,用于标记书签,方便分类和检索(可选)
+     */
+    private String tags;
+
+    /**
+     * 书签分类表ID
+     */
+    private Integer categoryId;
+    private String categoryName;
+    private String subCategoryName;
+
+    /**
+     * 如果需要实现多用户管理,可以加入这个外键,指向用户表的id(可选)
+     */
+    private String accountId;
+
+    /**
+     * 书签的描述(可选)
+     */
+    private String remark;
+
+    /**
+     * 是否收藏,默认为false
+     */
+    private Boolean isFavorite;
+    private String isFavoriteStr;
+
+    /**
+     * 状态(1:正常,2:失效)
+     */
+    private Integer status;
+    private String statusStr;
+
+    /**
+     * 书签的创建时间,默认为当前时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createdAt;
+
+    /**
+     * 书签的最后更新时间,自动更新为当前时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updatedAt;
+
+    /**
+     * 删除标志(1:正常,2:已删除)
+     */
+    private Integer deleteFlag;
+}

+ 2 - 0
src/main/java/top/lvzhiqiang/entity/CoinApiConfig.java

@@ -85,4 +85,6 @@ public class CoinApiConfig implements Serializable {
     private List<JSONObject> musicCategoryList;
 
     private List<JSONObject> exchangeCategoryList;
+
+    private List<JSONObject> categoryList;
 }

+ 15 - 0
src/main/java/top/lvzhiqiang/mapper/CoinApiConfigMapper.java

@@ -86,4 +86,19 @@ public interface CoinApiConfigMapper {
 
     @Select("select id,category_name categoryName from coin_exchange_category where delete_flag = 1")
     List<JSONObject> findFileCurrentHoldingCategoryList();
+
+    @Select({"<script>" +
+            "select id,name categoryName from bookmark_category where delete_flag = 1" +
+            "<choose>" +
+            "                <when test=\"parentId != null and parentId != ''\"> " +
+            "                    and parent_id = #{parentId}" +
+            "                </when>" +
+            "                <when test=\"parentId == null\">" +
+            "                    and parent_id is null" +
+            "                </when>" +
+            "                <otherwise></otherwise>" +
+            "</choose>" +
+            " order by sort desc" +
+            "</script>"})
+    List<JSONObject> findBookmarkCategoryList(String parentId);
 }

+ 24 - 0
src/main/java/top/lvzhiqiang/mapper/CoinMapper.java

@@ -304,4 +304,28 @@ public interface CoinMapper {
             "</if>" +
             "</script>"})
     BigDecimal getCurrentHoldingTotalAmout(Map<String, Object> params);
+
+    @Select({"<script>" +
+            "select bi.*,bc.name categoryName from bookmark_info bi left join bookmark_category bc on bi.category_id=bc.id WHERE bi.delete_flag = 1 and bc.delete_flag = 1" +
+            "<if test=\"keyword != null and keyword != ''\">" +
+            "   and (bi.title like concat('%',#{keyword},'%') or bi.remark like concat('%',#{keyword},'%') or bi.tags like concat('%',#{keyword},'%'))" +
+            "</if>" +
+            "<if test=\"categoryField != null and categoryField != ''\">" +
+            "   and bi.category_id = #{categoryField}" +
+            "</if>" +
+            "<if test=\"accountId != null and accountId != ''\">" +
+            "   and bi.account_id = #{accountId}" +
+            "</if>" +
+            "<if test=\"isFavorite != null and isFavorite != ''\">" +
+            "   and bi.is_favorite = #{isFavorite}" +
+            "</if>" +
+            "<if test=\"status != null and status != ''\">" +
+            "   and bi.status = #{status}" +
+            "</if>" +
+            " order by " +
+            "<foreach collection='sortField' item='sf' index=\"index\" separator=\",\">" +
+            "   ${sf} ${sort}" +
+            " </foreach>" +
+            "</script>"})
+    List<BookmarkInfo> findBookmarkList(Map<String, Object> params);
 }

+ 2 - 0
src/main/java/top/lvzhiqiang/service/impl/CoinApiConfigServiceImpl.java

@@ -65,6 +65,8 @@ public class CoinApiConfigServiceImpl implements CoinApiConfigService {
                 coinApiConfig.setMusicCategoryList(coinApiConfigMapper.findFileMusicCategoryList());
             } else if (coinApiConfig.getNameEn().equals("currentHolding")) {
                 coinApiConfig.setExchangeCategoryList(coinApiConfigMapper.findFileCurrentHoldingCategoryList());
+            } else if (coinApiConfig.getNameEn().equals("bookmark")) {
+                coinApiConfig.setCategoryList(coinApiConfigMapper.findBookmarkCategoryList(null));
             }
         }
 

+ 28 - 0
src/main/java/top/lvzhiqiang/service/impl/CoinServiceImpl.java

@@ -1714,11 +1714,39 @@ public class CoinServiceImpl implements CoinService {
 
             renderMainSearch4CurrencyHolding(currentHoldingList);
             return currentHoldingPageInfo;
+        } else if (params.getString("nameEn").equals("bookmark")) {
+            PageHelper.startPage(params.getInteger("pageNo"), params.getInteger("pageSize"), true);
+
+            if (params.containsKey("sortField")) {
+                params.put("sortField", Arrays.asList(params.getString("sortField").split(",")));
+            }
+
+            List<BookmarkInfo> bookmarkInfoList = coinMapper.findBookmarkList(params.toJavaObject(Map.class));
+
+            PageInfo<BookmarkInfo> bookmarkInfoPageInfo = new PageInfo<>(bookmarkInfoList);
+
+            renderMainSearch4Bookmark(bookmarkInfoList);
+            return bookmarkInfoPageInfo;
         }
 
         return result;
     }
 
+
+    private void renderMainSearch4Bookmark(List<BookmarkInfo> bookmarkInfoList) {
+        for (BookmarkInfo bookmarkInfo : bookmarkInfoList) {
+            // 名称
+            bookmarkInfo.setTitle("<a target=\"_blank\" href=\" " + bookmarkInfo.getUrl() + "\">" + bookmarkInfo.getTitle() + "</a>");
+            // 是否收藏
+            bookmarkInfo.setIsFavoriteStr(bookmarkInfo.getIsFavorite() ? "是" : "否");
+            // 状态
+            bookmarkInfo.setStatusStr(bookmarkInfo.getStatus() == 1 ? "正常" : "失效");
+            // 备注
+            String remark = StringUtils.isNotEmpty(bookmarkInfo.getRemark()) ? (bookmarkInfo.getRemark().length() > 20 ? (bookmarkInfo.getRemark().substring(0, 20) + "...") : bookmarkInfo.getRemark()) : "--";
+            bookmarkInfo.setRemark("<span class=\"primary\" avid=\"" + bookmarkInfo.getId() + " \" >" + remark + " </span>");
+        }
+    }
+
     private void renderMainSearch4CurrencyHolding(List<CoinCurrencyHolding> currentHoldingList) {
         for (CoinCurrencyHolding coinCurrencyHolding : currentHoldingList) {
             // 名称

+ 23 - 0
src/main/resources/static/coin.html

@@ -399,6 +399,29 @@
             </select>
         </div>
 
+        <div id="apis-quiet-div-bookmark" style="display: none;">
+            <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="prev">上一页</button>
+            <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="next">下一页</button>
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-bookmark-pageNo" value="1">
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-bookmark-pageSize" disabled="disabled" value="20">
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-bookmark-pages" disabled="disabled" value="999999">
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-bookmark-keyword" placeholder="关键词">
+            <select id="apis-quiet-div-bookmark-categoryField" style="height: 24px;">
+                <!--<option value="">全部</option>-->
+            </select>
+            <select id="apis-quiet-div-bookmark-subCategoryField" style="height: 24px;">
+                <option value="">--</option>
+            </select>
+            <select id="apis-quiet-div-bookmark-sortField" style="height: 24px;">
+                <option value="bi.created_at">创建时间</option>
+                <option value="bi.updated_at">更新时间</option>
+            </select>
+            <select id="apis-quiet-div-bookmark-sort" style="height: 24px;">
+                <option value="desc">desc</option>
+                <option value="asc">asc</option>
+            </select>
+        </div>
+
         <div id="apis-quiet-div-cmcmap" style="display: none;">
             <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="prev">上一页</button>
             <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="next">下一页</button>

+ 17 - 1
src/main/resources/static/js/my-coin.js

@@ -190,6 +190,12 @@ function initOther4Select() {
                             exchangeCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
                         });
                         $("#apis-quiet-div-currentHolding-categoryField").append(exchangeCategoryStr);
+                    } else if (obj.nameEn === 'bookmark') {
+                        var categoryStr = '';
+                        $.each(obj.categoryList, function (index2, obj2) {
+                            categoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
+                        });
+                        $("#apis-quiet-div-bookmark-categoryField").append(categoryStr);
                     }
                 });
 
@@ -394,6 +400,14 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
         jsonData.sortField = $("#apis-quiet-div-currentHolding-sortField").val();
         jsonData.sort = $("#apis-quiet-div-currentHolding-sort").val();
         jsonData.categoryField = $("#apis-quiet-div-currentHolding-categoryField").val();
+    } else if (nameEn === 'bookmark') {
+        jsonData.pageNo = $("#apis-quiet-div-bookmark-pageNo").val();
+        jsonData.pageSize = $("#apis-quiet-div-bookmark-pageSize").val();
+        jsonData.keyword = $("#apis-quiet-div-bookmark-keyword").val();
+        jsonData.sortField = $("#apis-quiet-div-bookmark-sortField").val();
+        jsonData.sort = $("#apis-quiet-div-bookmark-sort").val();
+        jsonData.categoryField = $("#apis-quiet-div-bookmark-categoryField").val();
+        jsonData.subCategoryField = $("#apis-quiet-div-bookmark-subCategoryField").val();
     }
 
     $.ajax({
@@ -410,7 +424,7 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
                     return;
                 }
 
-                if (nameEn === 'orderHistoryProductType' || nameEn === 'traderList' || nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'cmcmap' || nameEn === 'music'  || nameEn === 'currentHolding') {
+                if (nameEn === 'orderHistoryProductType' || nameEn === 'traderList' || nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'cmcmap' || nameEn === 'music' || nameEn === 'currentHolding' || nameEn === 'bookmark') {
                     $("#apis-quiet-div-" + nameEn).find("input[id$=pages]").val(data.data.pages);
                     $('#' + slideDiv).find("span.contentSPAN").html(data.data.total);
                     data = data.data.list;
@@ -448,6 +462,8 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
 
                         if (nameEn === 'currentHolding') {
                             objContent = objContent != null ? objContent : '--';
+                        }else if (nameEn === 'bookmark') {
+                            objContent = objContent != null ? objContent : '--';
                         }
 
                         str += '<td' + objStyle + '>' + objContent + '</td>';