Ver Fonte

update:新增修改数据采用弹窗v1

tujidelv há 1 ano atrás
pai
commit
8571a0e849

+ 16 - 0
src/main/java/top/lvzhiqiang/controller/CoinController.java

@@ -281,4 +281,20 @@ public class CoinController {
 
         return coinService.login(username, password);
     }
+
+    /**
+     * 主查询
+     *
+     * @author lvzhiqiang
+     * 2024/12/6 9:57
+     */
+    @PostMapping("/insertOrUpdateCurrentHolding")
+    @ResponseBody
+    public R insertOrUpdateCurrentHolding(@RequestBody JSONObject params) throws Exception {
+        if (!params.containsKey("operationType") || StringUtils.isEmpty(params.getString("operationType"))) {
+            throw new ParameterException("operationType不能为空!");
+        }
+
+        return coinService.insertOrUpdateCurrentHolding(params);
+    }
 }

+ 6 - 0
src/main/java/top/lvzhiqiang/entity/CoinCurrencyHolding.java

@@ -65,6 +65,11 @@ public class CoinCurrencyHolding implements Serializable {
     private BigDecimal currentAmount;
 
     /**
+     * 卖出价格
+     */
+    private String sellPrice;
+
+    /**
      * 卖出总额
      */
     private BigDecimal sellAmount;
@@ -84,6 +89,7 @@ public class CoinCurrencyHolding implements Serializable {
      * 状态(1:正常,2:失效)
      */
     private Integer status;
+    private String statusStr;
 
     /**
      * 备注

+ 19 - 5
src/main/java/top/lvzhiqiang/mapper/CoinMapper.java

@@ -1,10 +1,7 @@
 package top.lvzhiqiang.mapper;
 
 import com.alibaba.fastjson.JSONObject;
-import org.apache.ibatis.annotations.Insert;
-import org.apache.ibatis.annotations.MapKey;
-import org.apache.ibatis.annotations.Select;
-import org.apache.ibatis.annotations.Update;
+import org.apache.ibatis.annotations.*;
 import top.lvzhiqiang.entity.*;
 
 import java.math.BigDecimal;
@@ -259,6 +256,9 @@ public interface CoinMapper {
             "</script>"})
     List<CoinCmcMap> findCmcMapList(Map<String, Object> params);
 
+    @Select("select 1 from coin_cmc_map where symbol = #{symbol} and status='active' limit 1")
+    Integer existCmcMapBySymbol(String symbol);
+
     @Select("SELECT * FROM coin_monitor_job WHERE delete_flag = 1")
     @MapKey("job_name")
     Map<String, JSONObject> findMonitorJobConfig();
@@ -345,7 +345,7 @@ public interface CoinMapper {
 
     @Update("update coin_currency_holding set symbol=#{symbol},buy_price=#{buyPrice},current_price=#{currentPrice},change_percentage=#{changePercentage},buy_quantity=#{buyQuantity}," +
             "current_quantity=#{currentQuantity},buy_amount=#{buyAmount},current_amount=#{currentAmount},exchange_category_id=#{exchangeCategoryId},coingecko_id=#{coingeckoId},status=#{status}," +
-            "remark=#{remark},buy_time=#{buyTime},modify_time=now() where id = #{id}")
+            "remark=#{remark},buy_time=#{buyTime},modify_time=now(),sell_time=#{sellTime},sell_price=#{sellPrice},sell_amount=#{sellAmount} where id = #{id}")
     int updateCurrentHolding(CoinCurrencyHolding coinCurrencyHolding);
 
     @Select({"<script>" +
@@ -397,4 +397,18 @@ public interface CoinMapper {
 
     @Select("select * from coin_users where username = #{userName} and delete_flag = 1")
     JSONObject findUserByUsername(String userName);
+
+    @Select("select coingecko_id from coin_watchlist where symbol = #{symbol} limit 1")
+    String findCoingeckoIdBySymbol(String symbol);
+
+    @Insert("INSERT INTO coin_currency_holding(symbol, buy_price, buy_quantity, current_quantity, exchange_category_id, coingecko_id, status, buy_time, remark, modify_time) " +
+            "VALUES (#{symbol}, #{buyPrice}, #{buyQuantity}, #{currentQuantity}, #{exchangeCategoryId}, #{coingeckoId}, #{status}, #{buyTime}, #{remark}, now())")
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+    int buyCurrentHolding(CoinCurrencyHolding currencyHolding);
+
+    @Select("select * from coin_currency_holding where id = #{id}")
+    CoinCurrencyHolding findCurrencyHoldingById(String id);
+
+    @Select("select * from coin_currency_holding where symbol = #{symbol} and exchange_category_id = #{exchangeCategoryId}")
+    CoinCurrencyHolding findCurrentHoldingBySymbolAndExchangeCategoryId(String symbol, Integer exchangeCategoryId);
 }

+ 3 - 0
src/main/java/top/lvzhiqiang/service/CoinService.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import me.chanjar.weixin.cp.api.WxCpService;
 import me.chanjar.weixin.cp.bean.article.NewArticle;
+import top.lvzhiqiang.dto.R;
 import top.lvzhiqiang.entity.CoinWatchlist;
 
 import java.util.Map;
@@ -63,4 +64,6 @@ public interface CoinService {
     Object getCurrentHoldingTotalAmout(JSONObject params);
 
     Object login(String username, String password);
+
+    R insertOrUpdateCurrentHolding(JSONObject params);
 }

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

@@ -26,6 +26,7 @@ import top.lvzhiqiang.config.InitRunner;
 import top.lvzhiqiang.config.WorkWeixinProperties;
 import top.lvzhiqiang.dto.R;
 import top.lvzhiqiang.entity.*;
+import top.lvzhiqiang.enumeration.ResultCodeEnum;
 import top.lvzhiqiang.exception.BusinessException;
 import top.lvzhiqiang.exception.ParameterException;
 import top.lvzhiqiang.mapper.CoinApiConfigMapper;
@@ -1042,6 +1043,143 @@ public class CoinServiceImpl implements CoinService {
         }
     }
 
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public R insertOrUpdateCurrentHolding(JSONObject params) {
+        String operationType = params.getString("operationType");
+        if ("buy".equals(operationType)) {
+            String symbol = params.getString("symbol");
+            String buyPrice = params.getString("buyPrice");
+            String buyQuantity = params.getString("buyQuantity");
+            String currentQuantity = params.getString("currentQuantity");
+            String exchangeCategoryId = params.getString("exchangeCategory");
+            String coingeckoId = params.getString("coingeckoId");
+            String buyTime = params.getString("buyTime");
+            String remark = params.getString("remark");
+            if (StringUtils.isEmpty(symbol) || StringUtils.isEmpty(buyPrice) || StringUtils.isEmpty(buyQuantity) || StringUtils.isEmpty(currentQuantity) || StringUtils.isEmpty(exchangeCategoryId)) {
+                throw new ParameterException("必填参数不能为空!");
+            }
+
+            symbol = symbol.trim();
+            Integer existCmcMapBySymbol = coinMapper.existCmcMapBySymbol(symbol);
+            if (existCmcMapBySymbol == null) {
+                throw new BusinessException(ResultCodeEnum.UNKNOWN_ERROR.getCode(), "symbol不存在!");
+            }
+
+            if (StringUtils.isEmpty(coingeckoId)) {
+                coingeckoId = coinMapper.findCoingeckoIdBySymbol(symbol);
+                if (StringUtils.isEmpty(coingeckoId)) {
+                    throw new BusinessException(ResultCodeEnum.UNKNOWN_ERROR.getCode(), "coingeckoId不存在!");
+                }
+            }
+
+            CoinCurrencyHolding coinCurrencyHolding = new CoinCurrencyHolding();
+            coinCurrencyHolding.setSymbol(symbol);
+            coinCurrencyHolding.setBuyPrice(buyPrice);
+            coinCurrencyHolding.setBuyQuantity(buyQuantity);
+            coinCurrencyHolding.setCurrentQuantity(currentQuantity);
+            coinCurrencyHolding.setExchangeCategoryId(Integer.valueOf(exchangeCategoryId));
+            coinCurrencyHolding.setCoingeckoId(coingeckoId);
+            coinCurrencyHolding.setBuyTime(StringUtils.isNotEmpty(buyTime) ? LocalDateTime.parse(buyTime, DateUtils.dateTimeFormatter) : LocalDateTime.now());
+            coinCurrencyHolding.setStatus(1);
+            coinCurrencyHolding.setRemark(remark);
+
+            coinMapper.buyCurrentHolding(coinCurrencyHolding);
+
+            List<CoinCurrencyHolding> currentHoldingList = new ArrayList<>();
+            currentHoldingList.add(coinCurrencyHolding);
+            parseCurrentHoldingMap4Coingecko(currentHoldingList);
+        } else if ("sell".equals(operationType)) {
+            String id = params.getString("id");
+            String sellPrice = params.getString("sellPrice");
+            String sellTime = params.getString("sellTime");
+            String sellAmount = params.getString("sellAmount");
+            String remark = params.getString("remark");
+            if (StringUtils.isEmpty(id) || StringUtils.isEmpty(sellPrice)) {
+                throw new ParameterException("必填参数不能为空!");
+            }
+
+            id = id.trim();
+            CoinCurrencyHolding coinCurrencyHolding = coinMapper.findCurrencyHoldingById(id);
+            if (coinCurrencyHolding == null) {
+                throw new BusinessException(ResultCodeEnum.UNKNOWN_ERROR.getCode(), "id不存在!");
+            }
+
+            coinCurrencyHolding.setSellTime(StringUtils.isNotEmpty(sellTime) ? LocalDateTime.parse(sellTime, DateUtils.dateTimeFormatter) : LocalDateTime.now());
+            coinCurrencyHolding.setSellPrice(sellPrice);
+            coinCurrencyHolding.setStatus(2);
+
+            if (StringUtils.isEmpty(sellAmount)) {
+                coinCurrencyHolding.setSellAmount(new BigDecimal(sellPrice).multiply(new BigDecimal(coinCurrencyHolding.getCurrentQuantity())).setScale(2,RoundingMode.HALF_UP));
+            }else{
+                coinCurrencyHolding.setSellAmount(new BigDecimal(sellAmount).setScale(2,RoundingMode.HALF_UP));
+            }
+
+            if (StringUtils.isNotEmpty(remark)) {
+                coinCurrencyHolding.setRemark(remark + (StringUtils.isNotEmpty(coinCurrencyHolding.getRemark()) ? System.lineSeparator() + coinCurrencyHolding.getRemark() : ""));
+            }
+
+            // 涨跌幅比例
+            if (StringUtils.isNotEmpty(coinCurrencyHolding.getBuyPrice()) && StringUtils.isNotEmpty(sellPrice)) {
+                BigDecimal changePercentage = new BigDecimal(sellPrice).divide(new BigDecimal(coinCurrencyHolding.getBuyPrice()), 2, RoundingMode.HALF_UP);
+                coinCurrencyHolding.setChangePercentage(changePercentage);
+            }
+
+            coinMapper.updateCurrentHolding(coinCurrencyHolding);
+
+            // 更新余额
+            CoinCurrencyHolding usdtCurrencyHolding = coinMapper.findCurrentHoldingBySymbolAndExchangeCategoryId("USDT", coinCurrencyHolding.getExchangeCategoryId());
+            if (usdtCurrencyHolding == null) {
+                throw new BusinessException(ResultCodeEnum.UNKNOWN_ERROR.getCode(), "USDT不存在!");
+            }
+            usdtCurrencyHolding.setCurrentAmount(usdtCurrencyHolding.getCurrentAmount().add(coinCurrencyHolding.getSellAmount()));
+            coinMapper.updateCurrentHolding(usdtCurrencyHolding);
+        } else if ("transfer".equals(operationType)) {
+            String remitter = params.getString("remitter");
+            String payee = params.getString("payee");
+            String amount = params.getString("amount");
+            if (StringUtils.isEmpty(remitter) || StringUtils.isEmpty(payee) || StringUtils.isEmpty(amount)) {
+                throw new ParameterException("必填参数不能为空!");
+            }
+
+            // 更新余额
+            CoinCurrencyHolding usdtCurrencyHolding4Remitter = coinMapper.findCurrentHoldingBySymbolAndExchangeCategoryId("USDT", Integer.valueOf(remitter));
+            if (usdtCurrencyHolding4Remitter == null) {
+                throw new BusinessException(ResultCodeEnum.UNKNOWN_ERROR.getCode(), "汇款人USDT不存在!");
+            }
+            CoinCurrencyHolding usdtCurrencyHolding4Payee = coinMapper.findCurrentHoldingBySymbolAndExchangeCategoryId("USDT", Integer.valueOf(payee));
+            if (usdtCurrencyHolding4Payee == null) {
+                throw new BusinessException(ResultCodeEnum.UNKNOWN_ERROR.getCode(), "收款人USDT不存在!");
+            }
+
+            usdtCurrencyHolding4Remitter.setCurrentAmount(usdtCurrencyHolding4Remitter.getCurrentAmount().subtract(new BigDecimal(amount)));
+            usdtCurrencyHolding4Payee.setCurrentAmount(usdtCurrencyHolding4Payee.getCurrentAmount().add(new BigDecimal(amount)));
+
+            coinMapper.updateCurrentHolding(usdtCurrencyHolding4Remitter);
+            coinMapper.updateCurrentHolding(usdtCurrencyHolding4Payee);
+        } else if ("modifyCurrentAmount".equals(operationType)) {
+            String id = params.getString("id");
+            String currentAmount = params.getString("currentAmount");
+            if (StringUtils.isEmpty(id) || StringUtils.isEmpty(currentAmount)) {
+                throw new ParameterException("必填参数不能为空!");
+            }
+
+            id = id.trim();
+            CoinCurrencyHolding coinCurrencyHolding = coinMapper.findCurrencyHoldingById(id);
+            if (coinCurrencyHolding == null) {
+                throw new BusinessException(ResultCodeEnum.UNKNOWN_ERROR.getCode(), "id不存在!");
+            }
+
+            coinCurrencyHolding.setCurrentAmount(new BigDecimal(currentAmount).setScale(2, RoundingMode.HALF_UP));
+
+            coinMapper.updateCurrentHolding(coinCurrencyHolding);
+        } else {
+            throw new ParameterException("暂不支持的操作!");
+        }
+
+        return R.ok().data("success");
+    }
+
     private void initCexSpotFlag(Map<String, CoinWatchlistOther> coinWatchlistOtherMap4Symbol) {
         // spot
         String coingeckoExchangeTickersUrl = InitRunner.dicCodeMap.get("coingecko_exchange_tickers_url").getCodeValue();
@@ -1773,6 +1911,8 @@ public class CoinServiceImpl implements CoinService {
                 coinCurrencyHolding.setBuyPrice(new BigDecimal(coinCurrencyHolding.getBuyPrice()).divide(BigDecimal.ONE, new MathContext(3)).toPlainString());
             }
 
+            coinCurrencyHolding.setStatusStr(coinCurrencyHolding.getStatus() == 1 ? "正常" : "失效");
+
             // 涨跌幅比例
             if (coinCurrencyHolding.getChangePercentage() == null) {
             } else if (coinCurrencyHolding.getChangePercentage().compareTo(BigDecimal.ONE) < 0) {

+ 14 - 99
src/main/resources/static/coin.html

@@ -11,12 +11,12 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
     <link rel="shortcut icon" href="cover/bitcoin.ico" type="image/x-icon">
     <link rel="stylesheet" href="css/my-av.css" type="text/css">
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet"/>
     <link rel="stylesheet" href="css/my-popup.css" type="text/css">
     <script src="js/jquery-3.6.0.min.js"></script>
     <script type="text/javascript" src="js/login.js"></script>
     <script type="text/javascript" src="js/my-coin.js"></script>
     <script type="text/javascript" src="js/my-av.js"></script>
-    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet"/>
     <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>
 </head>
 <style type="text/css">
@@ -294,7 +294,7 @@
         <div id="apis-quiet-div" style="height: 24px;margin-right: 10px;">
             <button class="apis-quiet-div-button1" slideDiv="apis-quiet-content">展开</button>
             <button class="apis-quiet-div-button2" slideDiv="apis-quiet-content">查询</button>
-            <button class="apis-quiet-div-button3" slideDiv="apis-quiet-pop">新增</button>
+            <button class="apis-quiet-div-button4" slideDiv="apis-quiet-pop">新增/修改</button>
         </div>
         <div id="apis-quiet-div-watchlist" style="display: none;">
             <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="prev">上一页</button>
@@ -411,6 +411,7 @@
             </select>
             <select id="apis-quiet-div-currentHolding-sortField" style="height: 24px;">
                 <option value="cch.buy_time">买入时间</option>
+                <option value="cch.sell_time">卖出时间</option>
                 <option value="cch.current_amount">当前金额</option>
                 <option value="cch.change_percentage">涨跌幅</option>
             </select>
@@ -544,101 +545,6 @@
         </table>
     </div>
     <hr/>
-    <div style="display: flex;">
-        <div style="margin-right:20px;">
-            <div class="uploadImgs-loading"><img src='cover/loading.gif'></div>
-            <span class="font">InsertOrUpdateImg</span>
-            <span id="uploadImgsAlert" style="margin-left: 10px;font-size: 13px;"></span>
-            <form method="post" action="pictureInfo/insertOrUpdateImg" enctype="multipart/form-data" onsubmit="return false;" id="uploadImgs">
-                <span>ID</span>
-                <input type="text" name="id" placeholder="可为空"/>
-                <span>分类</span>
-                <select id="apis-quiet-div-uploadImgs-categoryField" style="height: 24px;" name="categoryId">
-                    <option value="">--</option>
-                </select>
-                <span>创建日期</span>
-                <input type="text" name="createDate" placeholder="可为空" style="width: 200px;"/>
-                <span>备注</span>
-                <input type="text" name="remark" placeholder="可为空"/>
-                <span>file</span>
-                <input type="file" name="file" multiple/>
-                <input type="button" value="提交" onclick="uploadImgsSubmit()">
-                <input type="reset" value="重置">
-            </form>
-        </div>
-    </div>
-    <div style="display: flex;">
-        <div style="margin-right:20px;">
-            <div class="uploadMusics-loading"><img src='cover/loading.gif'></div>
-            <span class="font">InsertOrUpdateMusic</span>
-            <span id="uploadMusicsAlert" style="margin-left: 10px;font-size: 13px;"></span>
-            <form method="post" action="musicInfo/insertOrUpdateMusic" enctype="multipart/form-data" onsubmit="return false;" id="uploadMusics">
-                <span>Id</span>
-                <input type="text" name="id" placeholder="可为空" style="width: 50px;"/>
-                <span>标题</span>
-                <input type="text" name="title" placeholder="ID为空时不可为空"/>
-                <span>分类</span>
-                <select id="apis-quiet-div-uploadMusics-categoryField" style="height: 24px;" name="categoryId" multiple="multiple">
-                    <option value="">--</option>
-                </select>
-
-                <span>歌手</span>
-                <input type="text" name="singer" placeholder="可为空" style="width: 100px;"/>
-                <span>发行时间</span>
-                <input type="text" name="issuingDate" placeholder="可为空" style="width: 100px;"/>
-                <span>收藏日期</span>
-                <input type="text" name="collectionDate" placeholder="可为空" style="width: 100px;"/>
-                <span>备注</span>
-                <input type="text" name="remark" placeholder="可为空"/>
-                <select style="height: 24px;" name="qualityType">
-                    <option value="low">低品质</option>
-                    <option value="high">高品质</option>
-                    <option value="lyric">歌词</option>
-                </select>
-                <span>文件</span>
-                <input type="file" name="file" multiple/>
-                <input type="button" value="提交" onclick="uploadMusicsSubmit()">
-                <input type="reset" value="重置">
-            </form>
-        </div>
-    </div>
-    <div style="display: flex;">
-        <div style="margin-right:20px;">
-            <div class="watchlist-loading"><img src='cover/loading.gif'></div>
-            <span class="font">InsertOrUpdateWatchlist</span>
-            <span id="insertOrUpdateWatchlistAlert" style="margin-left: 10px;font-size: 13px;"></span>
-            <form method="post" action="coin/insertOrUpdateWatchlist" onsubmit="return false;" id="insertOrUpdateWatchlist">
-                <span>名称</span>
-                <input type="text" name="symbol" placeholder="不可为空" style="width: 100px;"/>
-                <span>赛道分类</span>
-                <input type="text" name="trackCategory" placeholder="可为空" style="width: 100px;"/>
-                <span>赛道分类2</span>
-                <input type="text" name="trackCategory2" placeholder="可为空" style="width: 100px;"/>
-                <span>发行日期</span>
-                <input type="text" name="issuingDate" placeholder="可为空" style="width: 100px;"/>
-                <span>cmcId</span>
-                <input type="text" name="cmcId" placeholder="可为空" style="width: 100px;"/>
-                <span>coingeckoId</span>
-                <input type="text" name="coingeckoId" placeholder="可为空" style="width: 100px;"/>
-                <span>coingeckoUrl</span>
-                <input type="text" name="coingeckoUrl" placeholder="可为空" style="width: 100px;"/>
-                <span>feixiaohaoUrl</span>
-                <input type="text" name="feixiaohaoUrl" placeholder="可为空" style="width: 100px;"/>
-                <span>filterFlag</span>
-                <select id="apis-quiet-div-watchlist-filterFlagField" style="height: 24px;" name="filterFlag">
-                    <option value="2">已过滤</option>
-                    <option value="1">未过滤</option>
-                    <option value="3">哈哈哈</option>
-                </select>
-                <select id="apis-quiet-div-watchlist-crudType" style="height: 24px;" name="crudType">
-                    <option value="1">insert</option>
-                    <option value="2">update</option>
-                </select>
-                <input type="button" value="提交" onclick="insertOrUpdateWatchlistSubmit()">
-                <input type="reset" value="重置">
-            </form>
-        </div>
-    </div>
 </div>
 
 <div id="watchlistpreview">
@@ -663,18 +569,27 @@
 
 <div class="popup" id="draggable-popup">
     <button class="close-btn">&times;</button>
-    <h2>表单弹窗</h2>
+    <h2></h2>
     <form id="popup-form">
         <!-- 表单内容容器 -->
         <div id="form-container">
-
+            <div id="form-container-1"></div>
+            <div id="form-container-2"></div>
         </div>
         <!-- 按钮容器 -->
         <div class="form-buttons">
+            <input type="hidden" value="" id="popup-form-hidden-nameEn"/>
             <button type="submit">提交</button>
             <button type="reset" id="reset-button">重置</button>
         </div>
     </form>
+    <!-- 请求结果展示区域 -->
+    <div class="result-container" id="result-container">
+        <h4>接口返回结果:</h4>
+        <pre id="result-content"></pre>
+    </div>
+    <!-- 加载图标 -->
+    <div class="loading-icon" id="loading-icon"></div>
 </div>
 
 </body>

+ 73 - 8
src/main/resources/static/css/my-popup.css

@@ -4,7 +4,7 @@
     position: fixed;
     top: 20%;
     left: 30%;
-    width: 400px; /* 设置宽度适当的弹窗 */
+    width: 500px; /* 设置宽度适当的弹窗 */
     background: #fff;
     border: 1px solid #ccc;
     box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
@@ -31,7 +31,7 @@
     align-items: center;
     gap: 10px;
     width: 100%;
-    margin-bottom: 10px; /* 调整每个表单项之间的垂直间距 */
+    margin-bottom: 5px; /* 调整每个表单项之间的垂直间距 */
 }
 
 .popup form label {
@@ -44,7 +44,7 @@
     text-overflow: ellipsis;  /* 标签文本过长时显示省略号 */
 }
 
-.popup form select {
+.popup form select, .popup form input[type="file"] {
     flex: 1; /* 下拉框占据剩余的空间 */
     padding: 8px;
     font-size: 14px;
@@ -54,7 +54,7 @@
 .popup form input {
     flex: 1; /* 让输入框自适应宽度 */
     padding: 8px;
-    font-size: 14px;
+    font-size: 13px;
     width: 100%;
 }
 
@@ -74,12 +74,30 @@
 .close-btn {
     background: none;
     border: none;
-    font-size: 16px;
+    font-size: 24px; /* 字体大小 */
     color: #555;
     cursor: pointer;
     position: absolute;
     top: 10px;
     right: 10px;
+    padding: 0; /* 不需要额外的内边距 */
+    border-radius: 50%; /* 圆形背景 */
+    width: 35px; /* 圆形的宽度 */
+    height: 35px; /* 圆形的高度 */
+    text-align: center; /* 水平居中 */
+    line-height: 35px; /* 垂直居中 */
+    background-color: #f0f0f0; /* 背景颜色 */
+    transition: background-color 0.3s ease; /* 背景色过渡效果 */
+}
+
+.close-btn:hover {
+    background-color: #ddd; /* 悬停时的背景色 */
+}
+
+/* 解决文本偏下的情况 */
+.close-btn span {
+    display: inline-block;
+    vertical-align: middle; /* 垂直居中 */
 }
 
 @keyframes spin {
@@ -91,7 +109,7 @@
 .form-buttons {
     display: flex;
     justify-content: space-between;
-    margin-top: 20px;
+    /*margin-top: 20px;*/
 }
 
 .form-buttons button {
@@ -100,7 +118,7 @@
 
 /* 动态内容容器样式 */
 #form-container {
-    margin-top: 10px;
+    /*margin-top: 10px;*/
 }
 
 .form-item.dynamic {
@@ -112,4 +130,51 @@
 
 .form-item.dynamic input {
     flex: 1;
-}
+}
+
+/* 请求结果展示区域 */
+.result-container {
+    margin-top: 20px;
+    padding: 10px;
+    border: 1px solid #ccc;
+    background-color: #f9f9f9;
+    font-size: 14px;
+    display: none; /* 初始隐藏 */
+    max-height: 200px; /* 限制最大高度 */
+    overflow-y: auto; /* 超出部分垂直滚动 */
+    overflow-x: auto; /*启用横向滚动条,当内容超出容器的宽度时,会出现水平滚动条 */
+}
+
+/* 加载动画样式 */
+.loading-icon {
+    display: none;
+    margin-top: 20px;
+    text-align: center;
+}
+
+.loading-icon::after {
+    content: "";
+    display: block;
+    width: 30px;
+    height: 30px;
+    margin: 0 auto;
+    border: 4px solid #f3f3f3;
+    border-top: 4px solid #007bff;
+    border-radius: 50%;
+    animation: spin 1s linear infinite;
+}
+
+.select2-container {
+    font-size: 14px;
+}
+.select2-container--default .select2-selection--multiple {
+    border: 1px solid #ccc;
+    border-radius: 4px;
+    padding: 5px;
+    overflow: auto;
+}
+.select2-container--default .select2-selection--multiple .select2-selection__rendered {
+    line-height: 20px;
+}
+
+

+ 252 - 47
src/main/resources/static/js/my-coin.js

@@ -5,6 +5,9 @@ window.actualFlag = false;
 
 window.stopFlag = false;
 
+window.uploadImgsCategoryField = [];
+window.uploadMusicsCategoryField = [];
+window.uploadExchangeCategoryField = [];
 $(function () {
     initOther();
 });
@@ -179,27 +182,24 @@ function initOther4Select() {
                         $.each(obj.otherAttrList, function (index2, obj2) {
                             uploadImageCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
                         });
-                        $("#apis-quiet-div-uploadImgs-categoryField").append(uploadImageCategoryStr);
+                        // $("#apis-quiet-div-uploadImgs-categoryField").append(uploadImageCategoryStr);
+                        uploadImgsCategoryField = obj.otherAttrList;
                         $("#apis-quiet-div-image-categoryField").append(uploadImageCategoryStr);
                     } else if (obj.nameEn === 'music') {
                         var uploadMusicCategoryStr = '';
                         $.each(obj.musicCategoryList, function (index2, obj2) {
                             uploadMusicCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
                         });
-                        $("#apis-quiet-div-uploadMusics-categoryField").append(uploadMusicCategoryStr);
+                        // $("#apis-quiet-div-uploadMusics-categoryField").append(uploadMusicCategoryStr);
+                        uploadMusicsCategoryField = obj.musicCategoryList;
                         $("#apis-quiet-div-music-categoryField").append(uploadMusicCategoryStr);
-
-                        // 初始化Select2并设置宽度
-                        $('#apis-quiet-div-uploadMusics-categoryField').select2({
-                            placeholder: '请选择分类', // 占位符
-                            allowClear: true, // 允许清除选择
-                            width: '160px'              // 在初始化时设置宽度
-                        });
                     } else if (obj.nameEn === 'currentHolding') {
                         var exchangeCategoryStr = '';
                         $.each(obj.exchangeCategoryList, function (index2, obj2) {
                             exchangeCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
                         });
+
+                        uploadExchangeCategoryField = obj.exchangeCategoryList;
                         $("#apis-quiet-div-currentHolding-categoryField").append(exchangeCategoryStr);
                     } else if (obj.nameEn === 'bookmark') {
                         var categoryStr = '';
@@ -990,31 +990,38 @@ function initContentEvent(nameEn) {
     }
 }
 
-function uploadImgsSubmit(){
-    var fromData = new FormData($("#uploadImgs")[0]);
+function insertOrUpdateImageSubmit(){
+    var formData = new FormData($("#popup-form")[0]);
+    formData.append("userName", getCookie('username'));
     $.ajax({
         url: "pictureInfo/insertOrUpdateImg", //请求的url地址
         dataType: "json", //返回格式为json
-        data: fromData, //参数值
+        data: formData, //参数值
         type: "post", //请求方式
         processData: false,// 告诉jQuery不要去处理发送的数据
         contentType: false,// 告诉jQuery不要去设置Content-Type请求头
         async: true, //请求是否异步,默认为异步,这也是ajax重要特性
         success: function (data) {
-            $(".uploadImgs-loading").css("display", "none");
+            //$(".uploadImgs-loading").css("display", "none");
             //请求成功时处理
             if (data != null && $.trim(data) != "" && data.success) {
-                $("#uploadImgsAlert").html(JSON.stringify(data.data));
+                //$("#uploadImgsAlert").html(JSON.stringify(data.data));
                 var quietSelectOption = $("#apis-quiet-select option:selected");
                 if ($(quietSelectOption).attr("nameen") === 'image') {
                     $(".apis-quiet-div-button2").click();
                 }
             } else {
-                $("#uploadImgsAlert").html(data.message);
+                //$("#uploadImgsAlert").html(data.message);
             }
+
+            // 在请求成功后填充数据到结果区域
+            $("#result-content").text(JSON.stringify(data, null, 2));
+            $("#loading-icon").fadeOut();
+            $("#result-container").fadeIn();  // 显示结果区域
         },
         beforeSend: function () {
-            $(".uploadImgs-loading").css("display", "block");
+            //$(".uploadImgs-loading").css("display", "block");
+            showLoading();  // 显示加载状态
         },
         complete: function () {
         },
@@ -1025,31 +1032,38 @@ function uploadImgsSubmit(){
     });
 }
 
-function uploadMusicsSubmit(){
-    var fromData = new FormData($("#uploadMusics")[0]);
+function insertOrUpdateMusicSubmit(){
+    var formData = new FormData($("#popup-form")[0]);
+    formData.append("userName", getCookie('username'));
     $.ajax({
         url: "musicInfo/insertOrUpdateMusic", //请求的url地址
         dataType: "json", //返回格式为json
-        data: fromData, //参数值
+        data: formData, //参数值
         type: "post", //请求方式
         processData: false,// 告诉jQuery不要去处理发送的数据
         contentType: false,// 告诉jQuery不要去设置Content-Type请求头
         async: true, //请求是否异步,默认为异步,这也是ajax重要特性
         success: function (data) {
-            $(".uploadMusics-loading").css("display", "none");
+            //$(".uploadMusics-loading").css("display", "none");
             //请求成功时处理
             if (data != null && $.trim(data) != "" && data.success) {
-                $("#uploadMusicsAlert").html(JSON.stringify(data.data));
+                //$("#uploadMusicsAlert").html(JSON.stringify(data.data));
                 var quietSelectOption = $("#apis-quiet-select option:selected");
                 if ($(quietSelectOption).attr("nameen") === 'music') {
                     $(".apis-quiet-div-button2").click();
                 }
             } else {
-                $("#uploadMusicsAlert").html(data.message);
+                //$("#uploadMusicsAlert").html(data.message);
             }
+
+            // 在请求成功后填充数据到结果区域
+            $("#result-content").text(JSON.stringify(data, null, 2));
+            $("#loading-icon").fadeOut();
+            $("#result-container").fadeIn();  // 显示结果区域
         },
         beforeSend: function () {
-            $(".uploadMusics-loading").css("display", "block");
+            //$(".uploadMusics-loading").css("display", "block");
+            showLoading();  // 显示加载状态
         },
         complete: function () {
         },
@@ -1061,31 +1075,37 @@ function uploadMusicsSubmit(){
 }
 
 function insertOrUpdateWatchlistSubmit(){
-    var fromData = new FormData($("#insertOrUpdateWatchlist")[0]);
+    var formData = new FormData($("#popup-form")[0]);
     formData.append("userName", getCookie('username'));
     $.ajax({
         url: "coin/insertOrUpdateWatchlist", //请求的url地址
         dataType: "json", //返回格式为json
-        data: fromData, //参数值
+        data: formData, //参数值
         type: "post", //请求方式
         processData: false,// 告诉jQuery不要去处理发送的数据
         contentType: false,// 告诉jQuery不要去设置Content-Type请求头
         async: true, //请求是否异步,默认为异步,这也是ajax重要特性
         success: function (data) {
-            $(".watchlist-loading").css("display", "none");
+            //$(".popup > .watchlist-loading").css("display", "none");
             //请求成功时处理
             if (data != null && $.trim(data) != "" && data.success) {
-                $("#insertOrUpdateWatchlistAlert").html(JSON.stringify(data.data));
+                //$("#insertOrUpdateAlert").html(JSON.stringify(data.data));
                 var quietSelectOption = $("#apis-quiet-select option:selected");
                 if ($(quietSelectOption).attr("nameen") === 'watchlist') {
                     $(".apis-quiet-div-button2").click();
                 }
             } else {
-                $("#insertOrUpdateWatchlistAlert").html(data.message);
+                //$("#insertOrUpdateAlert").html(data.message);
             }
+
+            // 在请求成功后填充数据到结果区域
+            $("#result-content").text(JSON.stringify(data, null, 2));
+            $("#loading-icon").fadeOut();
+            $("#result-container").fadeIn();  // 显示结果区域
         },
         beforeSend: function () {
-            $(".watchlist-loading").css("display", "block");
+            //$(".popup > .watchlist-loading").css("display", "block");
+            showLoading();  // 显示加载状态
         },
         complete: function () {
         },
@@ -1096,9 +1116,53 @@ function insertOrUpdateWatchlistSubmit(){
     });
 }
 
+function insertOrUpdateCurrentHoldingSubmit(){
+    var formData = new FormData($("#popup-form")[0]);
+    formData.append("userName", getCookie('username'));
+
+    const jsonData = {};
+    formData.forEach((value, key) => {
+        jsonData[key] = value;
+    });
+
+    $.ajax({
+        url: "coin/insertOrUpdateCurrentHolding", //请求的url地址
+        dataType: "json", //返回格式为json
+        data: JSON.stringify(jsonData), //参数值
+        type: "post", //请求方式
+        contentType: "application/json;charset=utf-8",
+        async: true, //请求是否异步,默认为异步,这也是ajax重要特性
+        success: function (data) {
+            //请求成功时处理
+            if (data != null && $.trim(data) != "" && data.success) {
+                var quietSelectOption = $("#apis-quiet-select option:selected");
+                if ($(quietSelectOption).attr("nameen") === 'currentHolding') {
+                    $(".apis-quiet-div-button2").click();
+                }
+            } else {
+                //$("#uploadMusicsAlert").html(data.message);
+            }
+
+            // 在请求成功后填充数据到结果区域
+            $("#result-content").text(JSON.stringify(data, null, 2));
+            $("#loading-icon").fadeOut();
+            $("#result-container").fadeIn();  // 显示结果区域
+        },
+        beforeSend: function () {
+            showLoading();  // 显示加载状态
+        },
+        complete: function () {
+        },
+        error: function (data) {
+            //请求出错处理
+            console.log("insertOrUpdateCurrentHolding error," + data);
+        }
+    });
+}
+
 function initOther4Popup(){
     // 打开弹窗
-    $(".apis-quiet-div-button3").on("click", function () {
+    $(".apis-quiet-div-button4").on("click", function () {
         var selectedOption = $("select#apis-quiet-select").find("option:selected");
         var url = selectedOption.attr("url");
         var typetype = selectedOption.attr("typetype");
@@ -1106,6 +1170,10 @@ function initOther4Popup(){
         var slideDiv = $(this).attr("slideDiv");
         quietPop(url, nameEn, slideDiv, typetype);
 
+        if (nameEn != 'watchlist' && nameEn != 'image' && nameEn != 'music' && nameEn != 'currentHolding') {
+            return;
+        }
+
         $(".popup").fadeIn();
         centerPopup();  // 调用居中函数
     });
@@ -1118,15 +1186,29 @@ function initOther4Popup(){
     // 阻止表单默认提交行为
     $(".popup form").on("submit", function (e) {
         e.preventDefault();
-        alert("表单已提交!");
-        $(".popup").fadeOut();
+
+        var nameEn = $("#popup-form-hidden-nameEn").val();
+        if (nameEn === 'watchlist') {
+            insertOrUpdateWatchlistSubmit();
+        } else if (nameEn === 'image') {
+            insertOrUpdateImageSubmit();
+        } else if (nameEn === 'music') {
+            insertOrUpdateMusicSubmit();
+        } else if (nameEn === 'currentHolding') {
+            insertOrUpdateCurrentHoldingSubmit();
+        }
     });
 
     // 实现拖动功能
     let isDragging = false;
     let offsetX, offsetY;
 
-    $("#draggable-popup").on("mousedown", function (e) {
+    $("#draggable-popup h2").on("mousedown", function (e) {
+        // 判断如果点击在 input 或 select 上,不触发拖动
+        if ($(e.target).closest("input, select, label").length) {
+            return;  // 如果按在 input 或 select 上,不启动拖动
+        }
+
         isDragging = true;
         offsetX = e.clientX - $(this).offset().left;
         offsetY = e.clientY - $(this).offset().top;
@@ -1151,11 +1233,23 @@ function initOther4Popup(){
 
     // 重置按钮的功能
     $("#reset-button").on("click", function () {
-        $(".progress-container").fadeOut();  // 重置时隐藏进度条
+        $("#result-container").fadeOut();  // 隐藏请求结果区域
         $(".loading-icon").fadeOut();  // 重置时隐藏加载图标
+
+        var nameEn = $("#popup-form-hidden-nameEn").val();
+        if (nameEn === 'currentHolding') {
+            $("#form-container-2").html("");
+        }
     });
 }
 
+// 显示加载图标
+function showLoading() {
+    $("#result-content").text(""); // 清空内容
+    $("#result-container").hide();  // 使用 hide() 快速隐藏
+    $("#loading-icon").fadeIn(); // 显示加载图标
+}
+
 // 计算并设置弹窗居中位置
 function centerPopup() {
     const popup = $("#draggable-popup");
@@ -1166,7 +1260,7 @@ function centerPopup() {
 
     // 计算弹窗的位置
     const left = (windowWidth - popupWidth) / 2;
-    const top = (windowHeight - popupHeight) / 2;
+    const top = (windowHeight - popupHeight) / 4;
 
     // 设置弹窗的位置
     popup.css({
@@ -1187,22 +1281,133 @@ function quietPop(url, nameEn, slideDiv, typetype) {
     } else if (nameEn === 'traderList') {
     } else if (nameEn === 'watchlist') {
         let formContent = "";
-        formContent += '<div class="form-item"><label for="symbol">名称:</label><input type="text" id="symbol" placeholder="不可为空"></div>';
-        formContent += '<div class="form-item"><label for="trackCategory">赛道分类:</label><input type="text" id="trackCategory" placeholder="可为空"></div>';
-        formContent += '<div class="form-item"><label for="trackCategory2">赛道分类2:</label><input type="text" id="trackCategory2" placeholder="可为空"></div>';
-        formContent += '<div class="form-item"><label for="issuingDate">发行日期:</label><input type="text" id="issuingDate" placeholder="可为空"></div>';
-        formContent += '<div class="form-item"><label for="cmcId">cmcId:</label><input type="text" id="cmcId" placeholder="可为空"></div>';
-        formContent += '<div class="form-item"><label for="coingeckoId">coingeckoId:</label><input type="text" id="coingeckoId" placeholder="可为空"></div>';
-        formContent += '<div class="form-item"><label for="coingeckoUrl">coingeckoUrl:</label><input type="text" id="coingeckoUrl" placeholder="可为空"></div>';
-        formContent += '<div class="form-item"><label for="feixiaohaoUrl">feixiaohaoUrl:</label><input type="text" id="feixiaohaoUrl" placeholder="可为空"></div>';
-        formContent += '<div class="form-item"><label for="filterFlag">filterFlag:</label><input type="text" id="filterFlag" placeholder="不可为空"></div>';
-        formContent += '<div class="form-item"><label for="crudType">crudType:</label><input type="text" id="crudType" placeholder="不可为空"></div>';
-        $("#form-container").html(formContent);
-    $(".quietpop-content").html("");
+        formContent += '<div class="form-item"><label for="symbol">名称:</label><input type="text" name="symbol" placeholder="不可为空"></div>';
+        formContent += '<div class="form-item"><label for="trackCategory">赛道分类:</label><input type="text" name="trackCategory" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="trackCategory2">赛道分类2:</label><input type="text" name="trackCategory2" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="issuingDate">发行日期:</label><input type="text" name="issuingDate" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="cmcId">cmcId:</label><input type="text" name="cmcId" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="coingeckoId">coingeckoId:</label><input type="text" name="coingeckoId" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="coingeckoUrl">coingeckoUrl:</label><input type="text" name="coingeckoUrl" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="feixiaohaoUrl">feixiaohaoUrl:</label><input type="text" name="feixiaohaoUrl" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="filterFlag">filterFlag:</label><select id="apis-quiet-div-watchlist-filterFlagField" name="filterFlag"><option value="2">已过滤</option><option value="1">未过滤</option><option value="3">哈哈哈</option></select></div>';
+        formContent += '<div class="form-item"><label for="crudType">crudType:</label><select id="apis-quiet-div-watchlist-crudType" name="crudType"><option value="1">insert</option><option value="2">update</option></select></div>';
+        $("#form-container-2").html(formContent);
+
+        $("#popup-form-hidden-nameEn").val(nameEn);
+
+        $("#draggable-popup > h2").text("InsertOrUpdateWatchlist");
     } else if (nameEn === 'image') {
+        let formContent = "";
+        formContent += '<div class="form-item"><label for="id">Id:</label><input type="text" name="id" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="categoryId">分类:</label><select id="apis-quiet-div-uploadImgs-categoryField" name="categoryId"><option value="">--</option></select></div>';
+        formContent += '<div class="form-item"><label for="createDate">创建日期:</label><input type="text" name="createDate" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="remark">备注:</label><input type="text" name="remark" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="file">文件:</label><input type="file" name="file" multiple/></div>';
+        $("#form-container-2").html(formContent);
+
+        var uploadImageCategoryStr = '';
+        $.each(uploadImgsCategoryField, function (index2, obj2) {
+            uploadImageCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
+        });
+        $("#apis-quiet-div-uploadImgs-categoryField").append(uploadImageCategoryStr);
+
+        $("#popup-form-hidden-nameEn").val(nameEn);
+
+        $("#draggable-popup > h2").text("InsertOrUpdateImage");
     } else if (nameEn === 'cmcmap') {
     } else if (nameEn === 'music') {
+        let formContent = "";
+        formContent += '<div class="form-item"><label for="id">Id:</label><input type="text" name="id" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="title">标题:</label><input type="text" name="title" placeholder="ID为空时不可为空"></div>';
+        formContent += '<div class="form-item"><label for="categoryId">分类:</label><select id="apis-quiet-div-uploadMusics-categoryField" name="categoryId" multiple><option value="">--</option></select></div>';
+        formContent += '<div class="form-item"><label for="singer">歌手:</label><input type="text" name="singer" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="issuingDate">发行时间:</label><input type="text" name="issuingDate" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="collectionDate">收藏日期:</label><input type="text" name="collectionDate" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="remark">备注:</label><input type="text" name="remark" placeholder="可为空"></div>';
+        formContent += '<div class="form-item"><label for="qualityType">qualityType:</label><select id="apis-quiet-div-uploadMusics-qualityType" name="qualityType"><option value="low">低品质</option><option value="high">高品质</option><option value="lyric">歌词</option></select></div>';
+        formContent += '<div class="form-item"><label for="file">文件:</label><input type="file" name="file" multiple/></div>';
+        $("#form-container-2").html(formContent);
+
+        var uploadMusicCategoryStr = '';
+        $.each(uploadMusicsCategoryField, function (index2, obj2) {
+            uploadMusicCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
+        });
+        $("#apis-quiet-div-uploadMusics-categoryField").append(uploadMusicCategoryStr);
+
+        // 初始化Select2并设置宽度
+        setTimeout(function () {
+            $('#apis-quiet-div-uploadMusics-categoryField').select2({
+                placeholder: "请选择分类", // 占位符
+                allowClear: false, // 添加清空选择的按钮
+                width: "100%"        // 下拉框宽度
+            });
+        }, 100);  // 延迟100毫秒初始化
+
+        $("#popup-form-hidden-nameEn").val(nameEn);
+
+        $("#draggable-popup > h2").text("InsertOrUpdateMusic");
     } else if (nameEn === 'currentHolding') {
+        let formContent = "";
+
+        formContent += '<div class="form-item"><label for="operationType">操作类型:</label><select name="operationType"><option value="">--</option><option value="buy">买入</option><option value="sell">卖出</option><option value="transfer">转账</option><option value="modifyCurrentAmount">调整当前总额</option></select></div>';
+        formContent += '<hr/>';
+        $("#form-container-1").html(formContent);
+        $("#form-container-2").html("");
+
+        // 操作类型添加事件
+        $("#popup-form").find("select[name='operationType']").change(function (e) {
+            let operationType = $(this).val();
+            let formContent2 = "";
+            if (operationType === 'buy') {
+                formContent2 += '<div class="form-item"><label for="symbol">名称:</label><input type="text" name="symbol" placeholder="不可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="buyPrice">入场价格:</label><input type="text" name="buyPrice" placeholder="不可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="buyQuantity">入场数量:</label><input type="text" name="buyQuantity" placeholder="不可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="currentQuantity">当前数量:</label><input type="text" name="currentQuantity" placeholder="不可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="exchangeCategory">交易平台:</label><select name="exchangeCategory" id="apis-quiet-div-CurrentHolding-exchangeCategoryField"><option value="">--</option></select></div>';
+                formContent2 += '<div class="form-item"><label for="coingeckoId">coingeckoId:</label><input type="text" name="coingeckoId" placeholder="可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="buyTime">买入时间:</label><input type="text" name="buyTime" placeholder="可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="remark">备注:</label><input type="text" name="remark" placeholder="可为空"></div>';
+
+                $("#form-container-2").html(formContent2);
+
+                var exchangeCategoryStr = '';
+                $.each(uploadExchangeCategoryField, function (index2, obj2) {
+                    exchangeCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
+                });
+                $("#apis-quiet-div-CurrentHolding-exchangeCategoryField").append(exchangeCategoryStr);
+            } else if (operationType === 'sell') {
+                formContent2 += '<div class="form-item"><label for="id">ID:</label><input type="text" name="id" placeholder="不可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="sellPrice">卖出价格:</label><input type="text" name="sellPrice" placeholder="不可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="sellTime">卖出时间:</label><input type="text" name="sellTime" placeholder="可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="sellAmount">卖出金额:</label><input type="text" name="sellAmount" placeholder="可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="remark">备注:</label><input type="text" name="remark" placeholder="可为空"></div>';
+
+                $("#form-container-2").html(formContent2);
+            } else if (operationType === 'transfer') {
+                formContent2 += '<div class="form-item"><label for="remitter">汇款人:</label><select name="remitter" id="apis-quiet-div-CurrentHolding-remitterField"><option value="">--</option></select></div>';
+                formContent2 += '<div class="form-item"><label for="payee">收款人:</label><select name="payee" id="apis-quiet-div-CurrentHolding-payeeField"><option value="">--</option></select></div>';
+                formContent2 += '<div class="form-item"><label for="amount">金额:</label><input type="text" name="amount" placeholder="不可为空"></div>';
+
+                $("#form-container-2").html(formContent2);
+
+                var exchangeCategoryStr = '';
+                $.each(uploadExchangeCategoryField, function (index2, obj2) {
+                    exchangeCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
+                });
+                $("#apis-quiet-div-CurrentHolding-remitterField,#apis-quiet-div-CurrentHolding-payeeField").append(exchangeCategoryStr);
+            } else if (operationType === 'modifyCurrentAmount') {
+                formContent2 += '<div class="form-item"><label for="id">ID:</label><input type="text" name="id" placeholder="不可为空"></div>';
+                formContent2 += '<div class="form-item"><label for="currentAmount">当前总额:</label><input type="text" name="currentAmount" placeholder="不可为空"></div>';
+
+                $("#form-container-2").html(formContent2);
+            } else {
+                $("#form-container-2").html("");
+            }
+        });
+
+        $("#popup-form-hidden-nameEn").val(nameEn);
+
+        $("#draggable-popup > h2").text("InsertOrUpdateCurrentHolding");
     } else if (nameEn === 'bookmark') {
     }
 }