lxf 21 시간 전
부모
커밋
fd4cb026f0
57개의 변경된 파일1544개의 추가작업 그리고 812개의 파일을 삭제
  1. 36 0
      src/api/copy.js
  2. 1 1
      src/components/backBar1/index.vue
  3. 6 2
      src/components/charts/line.vue
  4. 1 1
      src/components/language/index.vue
  5. 3 1
      src/lang/en.js
  6. 173 0
      src/lang/follow/en.js
  7. 173 0
      src/lang/follow/ru.js
  8. 173 0
      src/lang/follow/th.js
  9. 173 0
      src/lang/follow/vi.js
  10. 173 0
      src/lang/follow/zh-TW.js
  11. 11 9
      src/lang/ru.js
  12. 10 8
      src/lang/th.js
  13. 8 6
      src/lang/vi.js
  14. 2 0
      src/lang/zh-TW.js
  15. 5 2
      src/layout/index.vue
  16. 1 1
      src/router/copyTrade.js
  17. 29 29
      src/router/index.js
  18. 1 1
      src/store/getter.js
  19. 23 0
      src/store/modules/app.js
  20. 5 1
      src/store/modules/assets.js
  21. 0 15
      src/store/modules/copy.js
  22. 1 3
      src/utils/request.js
  23. 1 0
      src/view/abnormal/prove.vue
  24. 2 2
      src/view/convert/index.vue
  25. 1 0
      src/view/copyTrade/applyCopy/index.vue
  26. 3 3
      src/view/copyTrade/copyDetail/index.vue
  27. 4 1
      src/view/copyTrade/following/index.vue
  28. 1 1
      src/view/copyTrade/marketview/find/components/applyBox.vue
  29. 2 2
      src/view/copyTrade/marketview/find/components/userList.vue
  30. 5 2
      src/view/copyTrade/marketview/index.vue
  31. 9 4
      src/view/copyTrade/marketview/tradingExperts/index.vue
  32. 0 105
      src/view/copyTrade/myCopy/components/chartView.vue
  33. 23 9
      src/view/copyTrade/myCopy/components/dataView.vue
  34. 9 1
      src/view/copyTrade/myCopy/components/profit.vue
  35. 54 5
      src/view/copyTrade/myCopy/components/setting.vue
  36. 22 2
      src/view/copyTrade/myCopy/components/settlement.vue
  37. 47 14
      src/view/copyTrade/myCopy/index.vue
  38. 0 203
      src/view/copyTrade/myCopy/orderView/components/historyList.vue
  39. 0 186
      src/view/copyTrade/myCopy/orderView/components/openList.vue
  40. 0 56
      src/view/copyTrade/myCopy/orderView/index.vue
  41. 5 2
      src/view/copyTrade/myTrade/components/incomeDetails.vue
  42. 4 1
      src/view/copyTrade/myTrade/index.vue
  43. 158 80
      src/view/copyTrade/profitDetails/components/list.vue
  44. 35 12
      src/view/copyTrade/profitDetails/index.vue
  45. 1 0
      src/view/copyTrade/register/index.vue
  46. 68 13
      src/view/copyTrade/tradeDetail/components/chartView.vue
  47. 10 9
      src/view/copyTrade/tradeDetail/components/dataView.vue
  48. 45 11
      src/view/copyTrade/tradeDetail/index.vue
  49. 8 0
      src/view/copyTrade/tradeDetail/orderView/components/historyList.vue
  50. 7 0
      src/view/copyTrade/tradeDetail/orderView/components/openList.vue
  51. 3 2
      src/view/copyTrade/tradeDetail/orderView/index.vue
  52. 1 0
      src/view/joinApply/index.vue
  53. 2 2
      src/view/landing/index.vue
  54. 1 1
      src/view/market/index.vue
  55. 1 1
      src/view/market/stock/index.vue
  56. 2 1
      src/view/productDetail/option/components/inquiry.vue
  57. 2 1
      src/view/workOrderAdd/index.vue

+ 36 - 0
src/api/copy.js

@@ -127,4 +127,40 @@ export function getExpertTradeListByDayGroup(data) {
     method: 'post',
     data
   })
+}
+
+// 
+export function getExpertAccountList(data) {
+  return request({
+    url: '/Public/getExpertAccountList',
+    method: 'post',
+    data
+  })
+}
+
+// 
+export function getFollowBonusList(data) {
+  return request({
+    url: '/getFollowBonusList',
+    method: 'post',
+    data
+  })
+}
+
+// 
+export function exchangeFollowBonus(data) {
+  return request({
+    url: '/exchangeFollowBonus',
+    method: 'post',
+    data
+  })
+}
+
+// 
+export function updateExpert(data) {
+  return request({
+    url: '/updateExpert',
+    method: 'post',
+    data
+  })
 }

+ 1 - 1
src/components/backBar1/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <van-sticky class="sticky">
+  <van-sticky class="sticky" v-if="!appFlag">
     <div class="header flex">
       <div class="left flex">
         <backIcon1/>

+ 6 - 2
src/components/charts/line.vue

@@ -9,6 +9,10 @@ export default {
       type: String,
       default: 'chart'
     },
+    percentage: {
+      type: Boolean,
+      default: false,
+    },
     width: {
       type: String,
       default: '100%'
@@ -80,7 +84,7 @@ export default {
           },
           axisLabel: {
             align: 'right',
-            formatter: '{value}%',
+            formatter: `{value}${this.percentage ? '%' : ''}`,
             textStyle: {
               fontSize: 10,
               color: '#B6B6B6'
@@ -99,7 +103,7 @@ export default {
         color: ['#0F8DDF', '#5b8ff9', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],
         tooltip: {
           trigger: 'axis',
-          formatter: '{b}<br />{a}: {c}%',
+          formatter: `{b}<br />{a}: {c}${this.percentage ? '%' : ''}`,
           backgroundColor: 'rgba(0, 0, 0, 0.7)',
           borderWidth: 0,
           padding: [8, 6],

+ 1 - 1
src/components/language/index.vue

@@ -56,9 +56,9 @@ export default {
       if (this.language == lan) {
         return
       }
+      this.$i18n.locale = lan
       this.$store.commit('setLang', lan)
       bus.$emit('selectLang')
-      this.$i18n.locale = lan
       setVantLang(lan)
       this.$store.commit('CHANGE_META_INFO', {
         title: this.$t('html.title'),

+ 3 - 1
src/lang/en.js

@@ -1,4 +1,5 @@
-import landingLang from "./landing/en";
+import followLang from "./follow/en";
+import landingLang from "./landing/en";
 export default {
   "html": {
     "title": 'JD Trader JDNX | global licensed compliance stock contract difference trading platform  otc options offer  international gold currency contract | JD Nova trading platform.',
@@ -1626,5 +1627,6 @@ export default {
     "l18": "Please enter a name that is consistent with your identity authentication",
     "l19": "The name entered is inconsistent",
   },
+  ...followLang,
   ...landingLang,
 }

+ 173 - 0
src/lang/follow/en.js

@@ -0,0 +1,173 @@
+export default {
+  "follow": {
+    "l": "Copy Trading",
+    "l1": "Total Copy Trading Profit",
+    "l2": "Today",
+    "l3": "My Copy Trades",
+    "l4": "Become a Trading Expert",
+    "l5": "Earn 10% Profit Sharing",
+    "l6": "Copying",
+    "l7": "Return on Investment (ROI)",
+    "l8": "Total Profit",
+    "l9": "Trading Expert",
+    "l10": "30-Day ROI",
+    "l11": "Expertise",
+    "l12": "My Copy Trades",
+    "l13": "Today's Profit",
+    "l14": "Details",
+    "l15": "Current Copy Trades",
+    "l16": "Historical Copy Trades",
+    "l17": "Copy Trading Time",
+    "l18": "Profit Details",
+    "l19": "Realized Profit",
+    "l20": "Unrealized Profit",
+    "l21": "Profit Sharing Paid",
+    "l22": "Settled Profit Sharing",
+    "l23": "Withheld Profit Sharing",
+    "l24": "Net Copy Trading Profit",
+    "l25": "Copy Trade Details",
+    "l26": "Profit Sharing Ratio",
+    "l27": "Realized P&L",
+    "l28": "Profit Sharing Amount",
+    "l29": "Modify Settings",
+    "l30": "Cancel Copy Trading",
+    "l31": "Current Positions",
+    "l32": "Buy",
+    "l33": "Sell",
+    "l34": "Position Size",
+    "l35": "Purchase Quantity",
+    "l36": "End Copy Trading",
+    "l37": "Total P&L",
+    "l38": "Estimated Profit Sharing Amount",
+    "l39": "Estimated Receivable Amount",
+    "l40": "Ending copy trading will immediately close the position at market price. If the market is closed, the position will be closed when the market opens, and profits will be settled after deducting the profit sharing amount.",
+    "l41": "Due to potential price fluctuations during the closing of positions, the trading P&L, profit sharing amount, and settlement amount may vary from what is displayed.",
+    "l42": "Copy Trading Funds Settings",
+    "l43": "Please enter the maximum amount to follow this Trading Expert.",
+    "l44": "Funds will be frozen from the copy trading account. Current copy trading account balance:",
+    "l45": "Copy Trading Ratio Settings",
+    "l46": "Please enter the copy trading multiplier {p}-{p1}",
+    "l47": "Each order will be {p} times the Trading Expert's order size.",
+    "l48": "Copy trading will directly use funds from the corresponding account, and if the account has insufficient funds, the trade cannot proceed.",
+    "l49": "Risk Control",
+    "l50": "Stop Loss Ratio",
+    "l51": "Take Profit Ratio",
+    "l52": "I agree to automatically follow the Trading Expert's trades.",
+    "l53": "I have read and agree to",
+    "l54": "the JD Trader Copy Trading Agreement.",
+    "l55": "Please enter the copy trading funds.",
+    "l56": "Please enter the copy trading ratio.",
+    "l57": "Please enter the stop loss ratio.",
+    "l58": "Please enter the take profit ratio.",
+    "l59": "JD Trader Verification",
+    "l60": "{p} Expert",
+    "l61": "Total Number of Trades",
+    "l62": "Join Date",
+    "l63": "Trading Frequency",
+    "l64": "Trades",
+    "l65": "Data",
+    "l66": "Orders",
+    "l67": "Followers",
+    "l68": "Executed",
+    "l69": "Maximum Drawdown",
+    "l70": "Total Number of Followers",
+    "l71": "Win Rate",
+    "l72": "Number of Trades",
+    "l73": "Last 7 Days",
+    "l74": "Last Month",
+    "l75": "Last 3 Months",
+    "l76": "Last 6 Months",
+    "l77": "Total Copy Trading Amount",
+    "l78": "Total Copy Trading Profit",
+    "l79": "Only showing top 30 users.",
+    "l80": "Current Orders",
+    "l81": "Confirm Copy Trading Information",
+    "l82": "Copy Trading Ratio per Order",
+    "l83": "Copy Trade Successfully Executed",
+    "l84": "View Details",
+    "l85": "Return to Copy Trading",
+    "l86": "You have successfully copied {p}. You can go to the copy trading details page to view more information, or return to the homepage to browse other projects.",
+    "l87": "Apply to Become a Trading Expert",
+    "l88": "Trading Expert Agreement",
+    "l89": "Level Details",
+    "l90": "Please read and agree to the Trading Expert Agreement.",
+    "l91": "Earn up to 20% Profit Sharing",
+    "l92": "Enable Lead Trading Mode",
+    "l93": "Advantages",
+    "l94": "Over USD 6 Million in Trading Expert Profit Sharing",
+    "l95": "Supporting Trading Elites",
+    "l96": "Comprehensive Range of Trading Instruments",
+    "l97": "Diverse Lead Trading Options",
+    "l98": "Ample Exposure Opportunities",
+    "l99": "Multiple Referral Channels",
+    "l100": "The higher the Trading Expert's level, the higher the profit-sharing ratio.",
+    "l101": "Maximum Number of Copy Trading Users",
+    "l102": "Trading Expert Level",
+    "l103": "When the Trading Expert's profit-sharing ratio is adjusted, the 'Estimated Pending Profit Sharing' shown on the copy trading page will also be adjusted accordingly.",
+    "l104": "Supreme",
+    "l105": "Legend",
+    "l106": "Master",
+    "l107": "Intermediate",
+    "l108": "Beginner",
+    "l109": "Apply to Become a Trading Expert",
+    "l110": "Country/Region of Residence",
+    "l111": "Areas of Expertise",
+    "l112": "Self-Introduction",
+    "l113": "Upload Trading Profit Screenshots",
+    "l114": "The review result will be notified through system messages within 3 business days.",
+    "l115": "Profit Sharing Account Management",
+    "l116": "Account Balance",
+    "l117": "Request Settlement",
+    "l118": "Profit Sharing Details",
+    "l119": "After applying for settlement, the account balance will be temporarily frozen. Upon approval, the funds in the profit-sharing account will be transferred to your USD wallet.",
+    "l120": "Transfer {p} USD from the profit-sharing account to the USD wallet?",
+    "l121": "Copy Trading Settings",
+    "l122": "Copy Trading Ratio Range",
+    "l123": "The multiplier of the trading volume followers can copy for each trade.",
+    "l124": "Automatic Order Placement",
+    "l125": "Automatically place orders for each trade.",
+    "l126": "When this option is enabled, every trade you make will be automatically synced to copy trading.",
+    "l127": "Data Overview",
+    "l128": "Total Profit from Profit Sharing",
+    "l129": "Settled Profit Sharing",
+    "l130": "Unsettled Profit Sharing",
+    "l131": "Application Date",
+    "l132": "Copy Trading Instrument",
+    "l133": "Copy Trading Volume",
+    "l134": "Copy Trading Profit",
+    "l135": "Current Status",
+    "l136": "Current Follow",
+    "l137": "Historical Follow",
+    "l138": "Profit",
+    "l139": "Profit Sharing",
+    "l140": "Active in the past {p} days",
+    "l141": "Copy Again",
+    "l142": "JD Trader Copy Trading Agreement",
+    "l143": "Please enter the copy trading multiplier.",
+    "l144": "Trading Expert Agreement",
+    "l145": "Upload Screenshot",
+    "l146": "Copy Trading Account",
+    "l147": "Do you confirm the application?",
+    "l148": "Please enter a self-introduction.",
+    "l149": "Please select an area of expertise.",
+    "l150": "Please upload a screenshot of trading profits.",
+    "l151": "Over 60,000 Copy Trading Users",
+    "l152": "Global Active Users",
+    "l153": "Stock Trading Expert",
+    "l154": "CFD Trading Expert",
+    "l155": "Follow Trading Expert",
+    "l156": "A-Share Expert",
+    "l157": "Hong Kong Stock Expert",
+    "l158": "U.S. Stock Expert",
+    "l159": "Cryptocurrency Expert",
+    "l160": "Precious Metals Expert",
+    "l161": "Forex Expert",
+    "l162": "Energy Expert",
+    "l163": "Index Expert",
+    "l164": "Followed",
+    "l165": "Days Ago",
+    "l166": "Expert Homepage",
+    "l167": "Trading Expert Homepage",
+    "l168": "Enter Management",
+  }
+}

+ 173 - 0
src/lang/follow/ru.js

@@ -0,0 +1,173 @@
+export default {
+  "follow": {
+    "l": "Подписаться на сделку",
+    "l1": "Общая прибыль подписки",
+    "l2": "Сегодня",
+    "l3": "Мои подписки",
+    "l4": "Стать торговым экспертом",
+    "l5": "Получить 10% прибыли",
+    "l6": "Подписан на сделку",
+    "l7": "Доходность",
+    "l8": "Общая прибыль",
+    "l9": "Торговый эксперт",
+    "l10": "Доходность за последние 30 дней",
+    "l11": "Специализация",
+    "l12": "Мои подписки",
+    "l13": "Сегодняшняя прибыль",
+    "l14": "Детали",
+    "l15": "Текущие подписки",
+    "l16": "История подписок",
+    "l17": "Время подписки",
+    "l18": "Детали прибыли",
+    "l19": "Реализованная прибыль",
+    "l20": "Плавающая прибыль",
+    "l21": "Выплаченная комиссия",
+    "l22": "Завершенная комиссия",
+    "l23": "Удержанная комиссия",
+    "l24": "Чистая прибыль от подписки",
+    "l25": "Детали подписки",
+    "l26": "Процент комиссии",
+    "l27": "Завершенные доходы и убытки",
+    "l28": "Сумма комиссии",
+    "l29": "Изменить настройки",
+    "l30": "Отменить подписку",
+    "l31": "Текущие позиции",
+    "l32": "Купить",
+    "l33": "Продать",
+    "l34": "Количество позиций",
+    "l35": "Количество покупок",
+    "l36": "Завершить подписку",
+    "l37": "Общие доходы и убытки",
+    "l38": "Ожидаемая сумма комиссии",
+    "l39": "Ожидаемая сумма к получению",
+    "l40": "Завершение подписки немедленно приведет к закрытию позиции по рыночной цене. Если рынок закрыт, закрытие произойдет при его открытии, а после удержания комиссии будет выполнен автоматический расчет.",
+    "l41": "Из-за возможных колебаний цен при закрытии, торговая прибыль, сумма комиссии и расчетная сумма могут отличаться от отображаемых.",
+    "l42": "Настройки капитала для подписки",
+    "l43": "Пожалуйста, введите максимальную сумму капитала для подписки на этого эксперта",
+    "l44": "Средства будут заморожены на счете подписки. Текущий баланс счета подписки:",
+    "l45": "Настройки коэффициента подписки",
+    "l46": "Пожалуйста, введите коэффициент подписки {p}-{p1}",
+    "l47": "Количество на каждой сделке будет в {p} раз больше, чем у торгового эксперта",
+    "l48": "Подписка будет использовать средства соответствующего счета. Если на счете недостаточно средств, подписка будет невозможна.",
+    "l49": "Контроль рисков",
+    "l50": "Процент убытка",
+    "l51": "Процент прибыли",
+    "l52": "Я согласен следовать за торговым экспертом в автоматическом режиме",
+    "l53": "Я прочитал и согласен с",
+    "l54": "«Соглашением о подписке»",
+    "l55": "Пожалуйста, введите сумму подписки",
+    "l56": "Пожалуйста, введите коэффициент подписки",
+    "l57": "Пожалуйста, введите процент убытка",
+    "l58": "Пожалуйста, введите процент прибыли",
+    "l59": "Подтверждение",
+    "l60": "{p} эксперт",
+    "l61": "Общее количество сделок",
+    "l62": "Время присоединения",
+    "l63": "Частота торгов",
+    "l64": "Сделки",
+    "l65": "Данные",
+    "l66": "Заказы",
+    "l67": "Подписчики",
+    "l68": "Сделки завершены",
+    "l69": "Максимальная просадка",
+    "l70": "Общее количество подписчиков",
+    "l71": "Процент побед",
+    "l72": "Количество сделок",
+    "l73": "Последние 7 дней",
+    "l74": "Последний месяц",
+    "l75": "Последние 3 месяца",
+    "l76": "Последние 6 месяцев",
+    "l77": "Общая сумма подписки",
+    "l78": "Общая прибыль подписки",
+    "l79": "Отображаются только 30 лучших пользователей",
+    "l80": "Текущие заказы",
+    "l81": "Подтвердить информацию о подписке",
+    "l82": "Коэффициент подписки на сделку",
+    "l83": "Успешная подписка на сделку",
+    "l84": "Посмотреть детали",
+    "l85": "Вернуться к подписке",
+    "l86": "Вы успешно подписались на {p}. Вы можете перейти на страницу деталей подписки для получения дополнительной информации или вернуться на главную страницу для просмотра других проектов.",
+    "l87": "Подать заявку на торгового эксперта",
+    "l88": "Соглашение торгового эксперта",
+    "l89": "Детали уровня",
+    "l90": "Пожалуйста, прочитайте и согласитесь с соглашением торгового эксперта",
+    "l91": "Получите до 20% прибыли",
+    "l92": "Включить режим ведения сделок",
+    "l93": "Преимущества",
+    "l94": "Более 6 миллионов USD прибыли для торговых экспертов",
+    "l95": "Поддержка торговых элит",
+    "l96": "Широкий выбор торговых инструментов",
+    "l97": "Разнообразие сделок",
+    "l98": "Большие возможности для рекламы",
+    "l99": "Множество каналов для рекомендаций",
+    "l100": "Чем выше уровень торгового эксперта, тем выше процент прибыли",
+    "l101": "Лимит подписчиков",
+    "l102": "Уровень торгового эксперта",
+    "l103": "После изменения процента прибыли торгового эксперта, ожидаемая комиссия также будет изменена.",
+    "l104": "Превосходный",
+    "l105": "Легендарный",
+    "l106": "Мастер",
+    "l107": "Средний",
+    "l108": "Начальный",
+    "l109": "Подать заявку на торгового эксперта",
+    "l110": "Страна/регион проживания",
+    "l111": "Область специализации",
+    "l112": "Самопрезентация",
+    "l113": "Загрузить скриншот прибыли",
+    "l114": "Результаты рассмотрения будут сообщены в течение 3 рабочих дней через системное сообщение",
+    "l115": "Управление счетом прибыли",
+    "l116": "Баланс счета",
+    "l117": "Подать заявку на расчет",
+    "l118": "Детали прибыли",
+    "l119": "После подачи заявки на расчет баланс счета будет временно заморожен. После утверждения средства будут переведены на ваш долларовый кошелек.",
+    "l120": "Перевести {p} USD с счета прибыли на долларовый кошелек?",
+    "l121": "Настройки подписки",
+    "l122": "Диапазон коэффициента подписки",
+    "l123": "Множитель объема сделки для подписчиков на каждое открытие позиции",
+    "l124": "Автоматическая отправка заказа",
+    "l125": "Автоматическая отправка заказа при каждой сделке",
+    "l126": "При включении этого параметра каждая ваша сделка будет автоматически синхронизироваться с подпиской",
+    "l127": "Общий обзор данных",
+    "l128": "Общая прибыль от комиссии",
+    "l129": "Завершенная комиссия",
+    "l130": "Незавершенная комиссия",
+    "l131": "Время подачи заявки",
+    "l132": "Объект подписки",
+    "l133": "Количество подписок",
+    "l134": "Прибыль от подписки",
+    "l135": "Текущий статус",
+    "l136": "Текущие подписки",
+    "l137": "История подписок",
+    "l138": "Прибыль",
+    "l139": "Комиссия",
+    "l140": "Активен последние {p} дней",
+    "l141": "Подписаться снова",
+    "l142": "Соглашение о подписке",
+    "l143": "Пожалуйста, введите коэффициент подписки",
+    "l144": "«Соглашение торгового эксперта»",
+    "l145": "Загрузить скриншот",
+    "l146": "Счет подписки",
+    "l147": "Вы подтверждаете заявку?",
+    "l148": "Пожалуйста, введите самопрезентацию",
+    "l149": "Пожалуйста, выберите область специализации",
+    "l150": "Пожалуйста, загрузите скриншот прибыли",
+    "l151": "Более 60 000 подписчиков",
+    "l152": "Активные пользователи по всему миру",
+    "l153": "Эксперт по акциям",
+    "l154": "Эксперт по CFD",
+    "l155": "Следовать за торговым экспертом",
+    "l156": "Эксперт по A-акциям",
+    "l157": "Эксперт по акциям Гонконга",
+    "l158": "Эксперт по акциям США",
+    "l159": "Эксперт по криптовалютам",
+    "l160": "Эксперт по драгоценным металлам",
+    "l161": "Эксперт по валютам",
+    "l162": "Эксперт по энергетике",
+    "l163": "Эксперт по индексам",
+    "l164": "Подписан",
+    "l165": "Несколько дней назад",
+    "l166": "Страница эксперта",
+    "l167": "Главная страница торгового эксперта",
+    "l168": "Перейти в управление",
+  }
+}

+ 173 - 0
src/lang/follow/th.js

@@ -0,0 +1,173 @@
+export default {
+  "follow": {
+    "l": "ติดตาม",
+    "l1": "กำไรจากการติดตามทั้งหมด",
+    "l2": "วันนี้",
+    "l3": "การติดตามของฉัน",
+    "l4": "กลายเป็นผู้เชี่ยวชาญการซื้อขาย",
+    "l5": "รับส่วนแบ่งกำไร 10%",
+    "l6": "กำลังติดตาม",
+    "l7": "อัตราผลตอบแทน",
+    "l8": "กำไรรวม",
+    "l9": "ผู้เชี่ยวชาญการซื้อขาย",
+    "l10": "อัตราผลตอบแทนใน 30 วัน",
+    "l11": "ความเชี่ยวชาญ",
+    "l12": "การติดตามของฉัน",
+    "l13": "กำไรวันนี้",
+    "l14": "รายละเอียด",
+    "l15": "การติดตามปัจจุบัน",
+    "l16": "ประวัติการติดตาม",
+    "l17": "เวลาการติดตาม",
+    "l18": "รายละเอียดกำไร",
+    "l19": "กำไรที่ได้รับจริง",
+    "l20": "กำไรลอยตัว",
+    "l21": "การจ่ายส่วนแบ่งกำไร",
+    "l22": "ส่วนแบ่งกำไรที่สรุปแล้ว",
+    "l23": "ส่วนแบ่งกำไรที่หักไว้",
+    "l24": "กำไรสุทธิจากการติดตาม",
+    "l25": "รายละเอียดการติดตาม",
+    "l26": "สัดส่วนการแบ่งกำไร",
+    "l27": "ผลกำไรและขาดทุนที่สรุปแล้ว",
+    "l28": "จำนวนเงินส่วนแบ่งกำไร",
+    "l29": "แก้ไขการตั้งค่า",
+    "l30": "ยกเลิกการติดตาม",
+    "l31": "ตำแหน่งปัจจุบัน",
+    "l32": "ซื้อ",
+    "l33": "ขาย",
+    "l34": "จำนวนตำแหน่ง",
+    "l35": "จำนวนการซื้อ",
+    "l36": "สิ้นสุดการติดตาม",
+    "l37": "กำไรและขาดทุนรวม",
+    "l38": "จำนวนเงินส่วนแบ่งกำไรที่คาดการณ์",
+    "l39": "จำนวนเงินที่คาดว่าจะได้รับ",
+    "l40": "สิ้นสุดการติดตามจะปิดตำแหน่งโดยใช้ราคาตลาดทันที หากตลาดยังไม่เปิด การปิดตำแหน่งจะดำเนินการเมื่อเปิดตลาดและจะคำนวณอัตโนมัติหลังหักส่วนแบ่งกำไร",
+    "l41": "อาจมีความผันผวนของราคาเมื่อปิดตำแหน่ง กำไรและขาดทุนจากการซื้อขาย ส่วนแบ่งกำไรและจำนวนเงินที่สรุปแล้วอาจไม่สอดคล้องกับการแสดงผล",
+    "l42": "การตั้งค่าทุนสำหรับการติดตาม",
+    "l43": "กรุณาใส่จำนวนเงินทุนสูงสุดที่จะติดตามผู้เชี่ยวชาญการซื้อขายนี้",
+    "l44": "ทุนจะถูกแช่แข็งในบัญชีติดตาม ยอดเงินคงเหลือในบัญชีติดตามปัจจุบัน:",
+    "l45": "การตั้งค่าสัดส่วนการติดตาม",
+    "l46": "กรุณาใส่ตัวคูณการติดตาม {p}-{p1}",
+    "l47": "จำนวนคำสั่งซื้อแต่ละครั้งจะเป็น {p} เท่าของผู้เชี่ยวชาญการซื้อขาย",
+    "l48": "การติดตามจะใช้เงินในบัญชีที่เกี่ยวข้อง หากยอดเงินในบัญชีไม่เพียงพอ การติดตามจะไม่สามารถดำเนินการได้",
+    "l49": "การควบคุมความเสี่ยง",
+    "l50": "สัดส่วนการหยุดขาดทุน",
+    "l51": "สัดส่วนการหยุดกำไร",
+    "l52": "ฉันยอมรับที่จะติดตามการซื้อขายของผู้เชี่ยวชาญโดยอัตโนมัติ",
+    "l53": "ฉันได้อ่านและยอมรับ",
+    "l54": "《ข้อตกลงการติดตามขั้นสูง》",
+    "l55": "กรุณาใส่จำนวนเงินติดตาม",
+    "l56": "กรุณาใส่สัดส่วนการติดตาม",
+    "l57": "กรุณาใส่สัดส่วนการหยุดขาดทุน",
+    "l58": "กรุณาใส่สัดส่วนการหยุดกำไร",
+    "l59": "การตรวจสอบขั้นสูง",
+    "l60": "{p} ผู้เชี่ยวชาญ",
+    "l61": "จำนวนคำสั่งทั้งหมด",
+    "l62": "เวลาเข้าร่วม",
+    "l63": "ความถี่การซื้อขาย",
+    "l64": "คำสั่ง",
+    "l65": "ข้อมูล",
+    "l66": "คำสั่งซื้อ",
+    "l67": "ผู้ติดตาม",
+    "l68": "คำสั่งเสร็จสิ้น",
+    "l69": "การดึงลงสูงสุด",
+    "l70": "จำนวนผู้ติดตามทั้งหมด",
+    "l71": "อัตราความสำเร็จ",
+    "l72": "จำนวนการซื้อขาย",
+    "l73": "7 วันที่ผ่านมา",
+    "l74": "เดือนที่ผ่านมา",
+    "l75": "3 เดือนที่ผ่านมา",
+    "l76": "6 เดือนที่ผ่านมา",
+    "l77": "ยอดเงินติดตามทั้งหมด",
+    "l78": "กำไรจากการติดตามทั้งหมด",
+    "l79": "แสดงเฉพาะผู้ใช้อันดับ 30 แรกเท่านั้น",
+    "l80": "คำสั่งปัจจุบัน",
+    "l81": "ยืนยันข้อมูลการติดตาม",
+    "l82": "สัดส่วนการติดตามต่อคำสั่ง",
+    "l83": "ติดตามการซื้อขายสำเร็จ",
+    "l84": "ดูรายละเอียด",
+    "l85": "กลับไปยังการติดตาม",
+    "l86": "คุณได้ติดตาม {p} สำเร็จแล้ว คุณสามารถไปที่หน้ารายละเอียดการติดตามเพื่อดูข้อมูลเพิ่มเติม หรือกลับไปยังหน้าแรกเพื่อเรียกดูโครงการอื่น ๆ ต่อ",
+    "l87": "สมัครเป็นผู้เชี่ยวชาญการซื้อขาย",
+    "l88": "ข้อตกลงผู้เชี่ยวชาญการซื้อขาย",
+    "l89": "รายละเอียดระดับ",
+    "l90": "กรุณาอ่านและยอมรับข้อตกลงผู้เชี่ยวชาญการซื้อขาย",
+    "l91": "รับส่วนแบ่งกำไรสูงสุด 20%",
+    "l92": "เปิดโหมดผู้นำการซื้อขาย",
+    "l93": "ข้อดี",
+    "l94": "มากกว่า 6 ล้าน USD จากส่วนแบ่งกำไรของผู้เชี่ยวชาญการซื้อขาย",
+    "l95": "สนับสนุนผู้เชี่ยวชาญการซื้อขายยอดเยี่ยม",
+    "l96": "ครอบคลุมสินค้าการซื้อขายที่หลากหลาย",
+    "l97": "ตัวเลือกการซื้อขายที่หลากหลาย",
+    "l98": "โอกาสในการแสดงผลจำนวนมาก",
+    "l99": "ช่องทางการแนะนำที่หลากหลาย",
+    "l100": "ระดับผู้เชี่ยวชาญการซื้อขายที่สูงขึ้น สัดส่วนการแบ่งกำไรที่สูงขึ้น",
+    "l101": "จำกัดจำนวนผู้ติดตาม",
+    "l102": "ระดับผู้เชี่ยวชาญการซื้อขาย",
+    "l103": "เมื่อมีการปรับสัดส่วนการแบ่งกำไรของผู้เชี่ยวชาญการซื้อขาย การแสดงผล \"ส่วนแบ่งกำไรที่รอดำเนินการ\" จะถูกปรับตามนั้น",
+    "l104": "สุดยอด",
+    "l105": "ตำนาน",
+    "l106": "ปรมาจารย์",
+    "l107": "ระดับกลาง",
+    "l108": "ระดับเริ่มต้น",
+    "l109": "สมัครเป็นผู้เชี่ยวชาญการซื้อขาย",
+    "l110": "ประเทศ/ภูมิภาคที่พำนัก",
+    "l111": "ความเชี่ยวชาญ",
+    "l112": "แนะนำตัวเอง",
+    "l113": "อัปโหลดภาพหน้าจอกำไรจากการซื้อขาย",
+    "l114": "ผลการตรวจสอบจะได้รับแจ้งผ่านข้อความในระบบภายใน 3 วันทำการ",
+    "l115": "การจัดการบัญชีส่วนแบ่งกำไร",
+    "l116": "ยอดเงินคงเหลือในบัญชี",
+    "l117": "ขอการสรุปบัญชี",
+    "l118": "รายละเอียดส่วนแบ่งกำไร",
+    "l119": "เมื่อขอการสรุปบัญชี ยอดเงินในบัญชีจะถูกแช่แข็งชั่วคราว และหลังจากได้รับการอนุมัติ เงินในบัญชีส่วนแบ่งกำไรจะถูกโอนไปยังกระเป๋าสตางค์ดอลลาร์สหรัฐของคุณ",
+    "l120": "โอน {p} USD จากบัญชีส่วนแบ่งกำไรของคุณไปยังกระเป๋าสตางค์ดอลลาร์สหรัฐ?",
+    "l121": "การตั้งค่าการติดตาม",
+    "l122": "ช่วงสัดส่วนการติดตาม",
+    "l123": "จำนวนคำสั่งที่ผู้ติดตามสามารถติดตามได้ในแต่ละครั้ง",
+    "l124": "การส่งคำสั่งอัตโนมัติ",
+    "l125": "คำสั่งซื้อแต่ละครั้งจะถูกส่งโดยอัตโนมัติ",
+    "l126": "เมื่อเปิดใช้งานตัวเลือกนี้ คำสั่งซื้อแต่ละครั้งของคุณจะถูกซิงค์กับการติดตามโดยอัตโนมัติ",
+    "l127": "ภาพรวมข้อมูล",
+    "l128": "กำไรจากส่วนแบ่งทั้งหมด",
+    "l129": "ส่วนแบ่งที่สรุปแล้ว",
+    "l130": "ส่วนแบ่งที่ยังไม่สรุป",
+    "l131": "เวลาการสมัคร",
+    "l132": "สินค้าที่ติดตาม",
+    "l133": "จำนวนการติดตาม",
+    "l134": "กำไรจากการติดตาม",
+    "l135": "สถานะปัจจุบัน",
+    "l136": "การติดตามปัจจุบัน",
+    "l137": "การติดตามที่ผ่านมา",
+    "l138": "กำไร",
+    "l139": "ส่วนแบ่ง",
+    "l140": "กิจกรรมใน {p} วันที่ผ่านมา",
+    "l141": "ติดตามอีกครั้ง",
+    "l142": "ข้อตกลงการติดตามขั้นสูง",
+    "l143": "กรุณาใส่ตัวคูณการติดตาม",
+    "l144": "《ข้อตกลงผู้เชี่ยวชาญการซื้อขาย》",
+    "l145": "อัปโหลดภาพหน้าจอ",
+    "l146": "บัญชีติดตาม",
+    "l147": "คุณยืนยันการสมัครหรือไม่",
+    "l148": "กรุณาแนะนำตัวเอง",
+    "l149": "กรุณาเลือกความเชี่ยวชาญ",
+    "l150": "กรุณาอัปโหลดภาพหน้าจอกำไรจากการซื้อขาย",
+    "l151": "มากกว่า 60,000 ผู้ติดตาม",
+    "l152": "ผู้ใช้งานที่มีความเคลื่อนไหวทั่วโลก",
+    "l153": "ผู้เชี่ยวชาญการซื้อขายหุ้น",
+    "l154": "ผู้เชี่ยวชาญการซื้อขาย CFD",
+    "l155": "ติดตามผู้เชี่ยวชาญการซื้อขาย",
+    "l156": "ผู้เชี่ยวชาญการซื้อขาย A-หุ้น",
+    "l157": "ผู้เชี่ยวชาญการซื้อขายหุ้นฮ่องกง",
+    "l158": "ผู้เชี่ยวชาญการซื้อขายหุ้นสหรัฐ",
+    "l159": "ผู้เชี่ยวชาญการซื้อขายคริปโตเคอเรนซี",
+    "l160": "ผู้เชี่ยวชาญการซื้อขายโลหะมีค่า",
+    "l161": "ผู้เชี่ยวชาญการซื้อขายฟอเร็กซ์",
+    "l162": "ผู้เชี่ยวชาญการซื้อขายพลังงาน",
+    "l163": "ผู้เชี่ยวชาญการซื้อขายดัชนี",
+    "l164": "ติดตามแล้ว",
+    "l165": "ไม่กี่วันที่ผ่านมา",
+    "l166": "หน้าโปรไฟล์ผู้เชี่ยวชาญ",
+    "l167": "หน้าโปรไฟล์ผู้เชี่ยวชาญการซื้อขาย",
+    "l168": "ไปที่การจัดการ",
+  }
+}

+ 173 - 0
src/lang/follow/vi.js

@@ -0,0 +1,173 @@
+export default {
+  "follow": {
+    "l": "Theo dõi",
+    "l1": "Lợi nhuận từ tất cả các hoạt động theo dõi",
+    "l2": "Hôm nay",
+    "l3": "Hoạt động theo dõi của tôi",
+    "l4": "Trở thành chuyên gia giao dịch",
+    "l5": "Nhận 10% chia sẻ lợi nhuận",
+    "l6": "Đang theo dõi",
+    "l7": "Tỷ lệ hoàn vốn",
+    "l8": "Tổng lợi nhuận",
+    "l9": "Chuyên gia giao dịch",
+    "l10": "Tỷ lệ hoàn vốn trong 30 ngày",
+    "l11": "Chuyên môn",
+    "l12": "Hoạt động theo dõi của tôi",
+    "l13": "Lợi nhuận hôm nay",
+    "l14": "Chi tiết",
+    "l15": "Theo dõi hiện tại",
+    "l16": "Lịch sử theo dõi",
+    "l17": "Thời gian theo dõi",
+    "l18": "Chi tiết lợi nhuận",
+    "l19": "Lợi nhuận thực nhận",
+    "l20": "Lợi nhuận nổi",
+    "l21": "Chia sẻ lợi nhuận",
+    "l22": "Chia sẻ lợi nhuận đã xác nhận",
+    "l23": "Chia sẻ lợi nhuận bị giữ lại",
+    "l24": "Lợi nhuận ròng từ theo dõi",
+    "l25": "Chi tiết hoạt động theo dõi",
+    "l26": "Tỷ lệ chia sẻ lợi nhuận",
+    "l27": "Lợi nhuận và lỗ đã xác nhận",
+    "l28": "Số tiền chia sẻ lợi nhuận",
+    "l29": "Chỉnh sửa cài đặt",
+    "l30": "Hủy theo dõi",
+    "l31": "Vị thế hiện tại",
+    "l32": "Mua",
+    "l33": "Bán",
+    "l34": "Số lượng vị thế",
+    "l35": "Số lượng mua",
+    "l36": "Kết thúc theo dõi",
+    "l37": "Tổng lợi nhuận và lỗ",
+    "l38": "Số tiền chia sẻ lợi nhuận dự đoán",
+    "l39": "Số tiền dự kiến sẽ nhận",
+    "l40": "Kết thúc theo dõi sẽ đóng vị thế với giá thị trường ngay lập tức. Nếu thị trường chưa mở, vị thế sẽ được đóng khi thị trường mở và sẽ tự động tính toán sau khi trừ chia sẻ lợi nhuận.",
+    "l41": "Có thể có biến động giá khi đóng vị thế. Lợi nhuận và lỗ giao dịch, chia sẻ lợi nhuận và số tiền đã xác nhận có thể không khớp với hiển thị.",
+    "l42": "Cài đặt vốn cho theo dõi",
+    "l43": "Vui lòng nhập số vốn tối đa để theo dõi chuyên gia giao dịch này",
+    "l44": "Vốn sẽ bị đóng băng trong tài khoản theo dõi. Số dư tài khoản theo dõi hiện tại:",
+    "l45": "Cài đặt tỷ lệ theo dõi",
+    "l46": "Vui lòng nhập hệ số theo dõi {p}-{p1}",
+    "l47": "Mỗi đơn hàng sẽ là {p} lần giao dịch của chuyên gia.",
+    "l48": "Theo dõi sẽ sử dụng tiền trong tài khoản liên kết. Nếu số dư tài khoản không đủ, theo dõi sẽ không thể thực hiện.",
+    "l49": "Kiểm soát rủi ro",
+    "l50": "Tỷ lệ cắt lỗ",
+    "l51": "Tỷ lệ chốt lời",
+    "l52": "Tôi đồng ý theo dõi giao dịch của chuyên gia tự động",
+    "l53": "Tôi đã đọc và chấp nhận",
+    "l54": "《Thỏa thuận theo dõi nâng cao》",
+    "l55": "Vui lòng nhập số tiền theo dõi",
+    "l56": "Vui lòng nhập tỷ lệ theo dõi",
+    "l57": "Vui lòng nhập tỷ lệ cắt lỗ",
+    "l58": "Vui lòng nhập tỷ lệ chốt lời",
+    "l59": "Xác minh nâng cao",
+    "l60": "{p} chuyên gia",
+    "l61": "Tổng số đơn hàng",
+    "l62": "Thời gian tham gia",
+    "l63": "Tần suất giao dịch",
+    "l64": "Đơn hàng",
+    "l65": "Thông tin",
+    "l66": "Đơn hàng mua",
+    "l67": "Người theo dõi",
+    "l68": "Đơn hàng đã hoàn thành",
+    "l69": "Giảm mạnh nhất",
+    "l70": "Tổng số người theo dõi",
+    "l71": "Tỷ lệ thành công",
+    "l72": "Tổng giao dịch",
+    "l73": "7 ngày trước",
+    "l74": "Tháng trước",
+    "l75": "3 tháng trước",
+    "l76": "6 tháng trước",
+    "l77": "Tổng vốn theo dõi",
+    "l78": "Lợi nhuận từ tất cả các hoạt động theo dõi",
+    "l79": "Chỉ hiển thị top 30 người dùng",
+    "l80": "Đơn hàng hiện tại",
+    "l81": "Xác nhận thông tin theo dõi",
+    "l82": "Tỷ lệ theo dõi cho mỗi đơn hàng",
+    "l83": "Theo dõi giao dịch thành công",
+    "l84": "Xem chi tiết",
+    "l85": "Quay lại trang theo dõi",
+    "l86": "Bạn đã theo dõi thành công {p}. Bạn có thể vào trang chi tiết theo dõi để biết thêm thông tin hoặc quay lại trang chủ để xem các dự án khác.",
+    "l87": "Đăng ký trở thành chuyên gia giao dịch",
+    "l88": "Thỏa thuận chuyên gia giao dịch",
+    "l89": "Chi tiết cấp bậc",
+    "l90": "Vui lòng đọc và chấp nhận thỏa thuận chuyên gia giao dịch",
+    "l91": "Nhận chia sẻ lợi nhuận tối đa 20%",
+    "l92": "Bật chế độ dẫn dắt giao dịch",
+    "l93": "Ưu điểm",
+    "l94": "Hơn 6 triệu USD từ chia sẻ lợi nhuận của các chuyên gia giao dịch",
+    "l95": "Hỗ trợ chuyên gia giao dịch xuất sắc",
+    "l96": "Đa dạng sản phẩm giao dịch",
+    "l97": "Lựa chọn giao dịch đa dạng",
+    "l98": "Nhiều cơ hội hiển thị",
+    "l99": "Nhiều kênh giới thiệu",
+    "l100": "Cấp bậc chuyên gia cao hơn, tỷ lệ chia sẻ lợi nhuận cao hơn",
+    "l101": "Giới hạn số lượng người theo dõi",
+    "l102": "Cấp bậc chuyên gia giao dịch",
+    "l103": "Khi điều chỉnh tỷ lệ chia sẻ lợi nhuận của chuyên gia giao dịch, phần hiển thị \"chia sẻ lợi nhuận chờ xử lý\" sẽ được điều chỉnh tương ứng.",
+    "l104": "Siêu sao",
+    "l105": "Huyền thoại",
+    "l106": "Bậc thầy",
+    "l107": "Trung cấp",
+    "l108": "Sơ cấp",
+    "l109": "Đăng ký làm chuyên gia giao dịch",
+    "l110": "Quốc gia/khu vực cư trú",
+    "l111": "Chuyên môn",
+    "l112": "Giới thiệu bản thân",
+    "l113": "Tải lên ảnh chụp màn hình lợi nhuận giao dịch",
+    "l114": "Kết quả kiểm tra sẽ được thông báo qua tin nhắn hệ thống trong vòng 3 ngày làm việc",
+    "l115": "Quản lý tài khoản chia sẻ lợi nhuận",
+    "l116": "Số dư tài khoản",
+    "l117": "Yêu cầu thanh toán",
+    "l118": "Chi tiết chia sẻ lợi nhuận",
+    "l119": "Khi yêu cầu thanh toán, số dư tài khoản sẽ tạm thời bị đóng băng, và sau khi được phê duyệt, tiền từ tài khoản chia sẻ lợi nhuận sẽ được chuyển vào ví USD của bạn.",
+    "l120": "Chuyển {p} USD từ tài khoản chia sẻ lợi nhuận của bạn vào ví USD?",
+    "l121": "Cài đặt theo dõi",
+    "l122": "Phạm vi tỷ lệ theo dõi",
+    "l123": "Số lượng đơn hàng người theo dõi có thể thực hiện trong mỗi giao dịch",
+    "l124": "Tự động gửi đơn hàng",
+    "l125": "Mỗi đơn hàng sẽ được gửi tự động",
+    "l126": "Khi bật tùy chọn này, mỗi đơn hàng của bạn sẽ được đồng bộ với người theo dõi tự động",
+    "l127": "Tổng quan dữ liệu",
+    "l128": "Lợi nhuận từ chia sẻ lợi nhuận",
+    "l129": "Chia sẻ lợi nhuận đã xác nhận",
+    "l130": "Chia sẻ lợi nhuận chưa xác nhận",
+    "l131": "Thời gian đăng ký",
+    "l132": "Sản phẩm theo dõi",
+    "l133": "Số lượng theo dõi",
+    "l134": "Lợi nhuận từ theo dõi",
+    "l135": "Trạng thái hiện tại",
+    "l136": "Theo dõi hiện tại",
+    "l137": "Theo dõi lịch sử",
+    "l138": "Lợi nhuận",
+    "l139": "Chia sẻ",
+    "l140": "Hoạt động trong {p} ngày qua",
+    "l141": "Theo dõi lại",
+    "l142": "Thỏa thuận theo dõi nâng cao",
+    "l143": "Vui lòng nhập hệ số theo dõi",
+    "l144": "《Thỏa thuận chuyên gia giao dịch》",
+    "l145": "Tải lên ảnh chụp màn hình",
+    "l146": "Tài khoản theo dõi",
+    "l147": "Bạn có xác nhận đăng ký không?",
+    "l148": "Vui lòng giới thiệu bản thân",
+    "l149": "Vui lòng chọn chuyên môn",
+    "l150": "Vui lòng tải lên ảnh chụp màn hình lợi nhuận giao dịch",
+    "l151": "Hơn 60.000 người theo dõi",
+    "l152": "Người dùng hoạt động toàn cầu",
+    "l153": "Chuyên gia giao dịch cổ phiếu",
+    "l154": "Chuyên gia giao dịch CFD",
+    "l155": "Theo dõi chuyên gia giao dịch",
+    "l156": "Chuyên gia giao dịch cổ phiếu A",
+    "l157": "Chuyên gia giao dịch cổ phiếu Hồng Kông",
+    "l158": "Chuyên gia giao dịch cổ phiếu Mỹ",
+    "l159": "Chuyên gia giao dịch tiền điện tử",
+    "l160": "Chuyên gia giao dịch kim loại quý",
+    "l161": "Chuyên gia giao dịch ngoại hối",
+    "l162": "Chuyên gia giao dịch năng lượng",
+    "l163": "Chuyên gia giao dịch chỉ số",
+    "l164": "Đã theo dõi",
+    "l165": "Vài ngày trước",
+    "l166": "Trang hồ sơ chuyên gia",
+    "l167": "Trang hồ sơ chuyên gia giao dịch",
+    "l168": "Đến trang quản lý",
+  }
+}

+ 173 - 0
src/lang/follow/zh-TW.js

@@ -0,0 +1,173 @@
+export default {
+  "follow": {
+    "l": "跟單",
+    "l1": "跟單總收益",
+    "l2": "今日",
+    "l3": "我的跟單",
+    "l4": "成為交易專家",
+    "l5": "賺取 10% 分潤",
+    "l6": "跟單中",
+    "l7": "收益率",
+    "l8": "總收益",
+    "l9": "交易專家",
+    "l10": "近30日收益率",
+    "l11": "擅長",
+    "l12": "我的跟單",
+    "l13": "今日收益",
+    "l14": "明細",
+    "l15": "當前跟單",
+    "l16": "歷史跟單",
+    "l17": "跟單時間",
+    "l18": "收益明細",
+    "l19": "已實現收益",
+    "l20": "浮動收益",
+    "l21": "分潤支出",
+    "l22": "已結分潤",
+    "l23": "預扣分潤",
+    "l24": "跟單淨收益",
+    "l25": "跟單詳情",
+    "l26": "分潤比例",
+    "l27": "已結算盈虧",
+    "l28": "分潤金額",
+    "l29": "修改設置",
+    "l30": "取消跟單",
+    "l31": "當前持倉",
+    "l32": "買",
+    "l33": "賣",
+    "l34": "持倉數量",
+    "l35": "購買數量",
+    "l36": "結束跟單",
+    "l37": "總盈虧",
+    "l38": "預計分潤金額",
+    "l39": "預計收款金額",
+    "l40": "結束跟單會立刻使用市價平倉,若當前尚未開市,則將在開市時使用市價平倉,並在扣除分潤金額後自動結算。",
+    "l41": "由於平倉時可能產生價格波動,交易盈虧、分潤金額以及結算金額可能與展示不一致。",
+    "l42": "跟單資金設置",
+    "l43": "請輸入跟隨該交易專家的最大資金數量",
+    "l44": "資金將從跟單賬戶中凍結,當前跟單賬戶餘額:",
+    "l45": "跟單比例設置",
+    "l46": "請輸入跟單倍率{p}-{p1}",
+    "l47": "每次下單數量事交易專家下單數量的 {p} 倍",
+    "l48": "跟單將直接使用跟單標的對應的賬戶資金,若賬戶資金不足則無法進行跟單",
+    "l49": "風險控制",
+    "l50": "止損比例",
+    "l51": "止盈比例",
+    "l52": "我同意跟隨交易專家操作自動跟單",
+    "l53": "我已閱讀並同意",
+    "l54": "《極度跟單協議》",
+    "l55": "請輸入跟單資金",
+    "l56": "請輸入跟單比例",
+    "l57": "請輸入止損比例",
+    "l58": "請輸入止盈比例",
+    "l59": "極度認證",
+    "l60": "{p}專家",
+    "l61": "總筆數",
+    "l62": "加入時間",
+    "l63": "交易頻率",
+    "l64": "筆",
+    "l65": "數據",
+    "l66": "訂單",
+    "l67": "跟單者",
+    "l68": "成交",
+    "l69": "最大回撤",
+    "l70": "累計跟單人數",
+    "l71": "勝率",
+    "l72": "交易次數",
+    "l73": "近7天",
+    "l74": "近一月",
+    "l75": "近三月",
+    "l76": "近半年",
+    "l77": "跟單總金額",
+    "l78": "跟單總收益",
+    "l79": "僅顯示排名前30的用戶",
+    "l80": "當前訂單",
+    "l81": "確認跟單信息",
+    "l82": "每單跟單比例",
+    "l83": "跟單交易成功",
+    "l84": "查看詳情",
+    "l85": "返回跟單",
+    "l86": "您已成功跟單{p}。您可以前往跟單詳情頁面查看明細,也可以返回首頁繼續瀏覽其他項目。",
+    "l87": "申請交易專家",
+    "l88": "交易專家協議",
+    "l89": "等級細則",
+    "l90": "請閱讀並同意交易專家協議",
+    "l91": "賺取最高20%分潤",
+    "l92": "開啟帶單模式",
+    "l93": "優勢",
+    "l94": "超過 600萬 USD 的交易專家分潤",
+    "l95": "扶持交易精英",
+    "l96": "覆蓋全面的交易品種",
+    "l97": "帶單選擇豐富",
+    "l98": "海量曝光機會",
+    "l99": "多種推薦渠道",
+    "l100": "交易專家等級越高,分潤比例越高",
+    "l101": "跟單用戶上限",
+    "l102": "交易專家等級",
+    "l103": "當交易專家分潤比例調整後,跟單頁面顯示的“預計待分潤”也會隨之調整",
+    "l104": "至尊",
+    "l105": "傳奇",
+    "l106": "大師",
+    "l107": "中級",
+    "l108": "初級",
+    "l109": "申請成為交易專家",
+    "l110": "居住國家/地區",
+    "l111": "擅長領域",
+    "l112": "自我介紹",
+    "l113": "上傳交易盈利截圖",
+    "l114": "審核結果將在3個工作日內通過系統消息告知",
+    "l115": "分潤賬戶管理",
+    "l116": "賬戶餘額",
+    "l117": "申請結算",
+    "l118": "分潤明細",
+    "l119": "申請結算後,賬戶餘額將暫時被凍結,通過審核後,分潤賬戶資金將轉入您的美元錢包。",
+    "l120": "將分潤賬戶內的 {p} USD轉入美元錢包?",
+    "l121": "跟單設置",
+    "l122": "跟單比例範圍",
+    "l123": "每次開倉,跟單用戶可以跟隨的下單量倍數",
+    "l124": "自動發單",
+    "l125": "每次交易下單自動發單",
+    "l126": "開啟該選項後,您每次交易操作都將自動同步到跟單",
+    "l127": "數據總覽",
+    "l128": "分潤總收益",
+    "l129": "已結算分潤",
+    "l130": "未結算分潤",
+    "l131": "申請時間",
+    "l132": "跟單標的",
+    "l133": "跟單數量",
+    "l134": "跟單收益",
+    "l135": "當前狀態",
+    "l136": "當前跟隨",
+    "l137": "歷史跟隨",
+    "l138": "收益",
+    "l139": "分潤",
+    "l140": "在過去{p}天活躍",
+    "l141": "再次跟單",
+    "l142": "極度跟單協議",
+    "l143": "請輸入跟單倍率",
+    "l144": "《交易專家協議》",
+    "l145": "上傳截圖",
+    "l146": "跟單賬戶",
+    "l147": "您是否確認申請",
+    "l148": "請輸入自我介紹",
+    "l149": "請選擇擅長領域",
+    "l150": "請上傳交易盈利截圖",
+    "l151": "超過 6 萬跟單用戶",
+    "l152": "全球活躍用戶",
+    "l153": "股票交易專家",
+    "l154": "CFD交易專家",
+    "l155": "跟隨交易專家",
+    "l156": "A股專家",
+    "l157": "港股專家",
+    "l158": "美股專家",
+    "l159": "加密貨幣專家",
+    "l160": "貴金屬專家",
+    "l161": "外匯專家",
+    "l162": "能源專家",
+    "l163": "指數專家",
+    "l164": "跟隨了",
+    "l165": "幾天前",
+    "l166": "專家主頁",
+    "l167": "交易專家主頁",
+    "l168": "進入管理",
+  }
+}

+ 11 - 9
src/lang/ru.js

@@ -1,8 +1,9 @@
-import landingLang from "./landing/ru";
+import followLang from "./follow/ru";
+import landingLang from "./landing/en";
 export default {
   "html": {
-    "title": 'JDNX Securities JDNX | Глобальная лицензированная и соответствующая требованиям торговая платформа CFD на акции_Поставщик котировок внебиржевых опционов_Международный контракт на золото_Биткойн',
-    "description": 'Extreme Securities — это официальная платформа для торговли деривативами, находящаяся под совместным контролем FSP, SEC, FINRA и FINTRAC и имеющая лицензию RIA. Будучи инновационным интернет-трейдером, обладающим передовыми технологиями и сервисной поддержкой, он предоставляет клиентам финансовые продукты и услуги, такие как CFD на акции, внебиржевые опционы, опционы на акции, маржинальную торговлю, золото, биткойны, валютные пары и т. д. ',
+    "title": 'JD Trader JDNX | Глобальная лицензированная и соответствующая требованиям торговая платформа CFD на акции_Поставщик котировок внебиржевых опционов_Международный контракт на золото_Биткойн',
+    "description": 'JD Trader — это официальная платформа для торговли деривативами, находящаяся под совместным контролем FSP, SEC, FINRA и FINTRAC и имеющая лицензию RIA. Будучи инновационным интернет-трейдером, обладающим передовыми технологиями и сервисной поддержкой, он предоставляет клиентам финансовые продукты и услуги, такие как CFD на акции, внебиржевые опционы, опционы на акции, маржинальную торговлю, золото, биткойны, валютные пары и т. д. ',
     "keywords": "Гонконгский фондовый контракт, фондовый контракт США, контракт на акции А, внебиржевые опционы, опционы на акции, маржинальная торговля, распределение акций, торговля золотом, торговля биткойнами",
   },
   "ajax": {
@@ -376,7 +377,7 @@ export default {
     "l3": "Пожалуйста, введите код приглашения (необязательно)",
     "l4": "Зарегистрируйтесь по электронной почте",
     "l5": "Зарегистрируйтесь с помощью мобильного телефона",
-    "l6": "Я прочитал и согласен с Extreme Securities",
+    "l6": "Я прочитал и согласен с JD Trader",
     "l7": "Пользовательское соглашение",
     "l8": "и",
     "l9": "Условия конфиденциальности",
@@ -1081,7 +1082,7 @@ export default {
     "l": "VIP-детали",
     "l1": "Сосредоточьтесь на технических аспектах и ​​научитесь легко зарабатывать большие деньги!",
     "l2": "Наслаждайтесь пятью основными привилегиями",
-    "l3": "Членская карта Extreme VIP",
+    "l3": "Членская карта JD Trader VIP",
     "l4": "Если выполнено одно из следующих условий, вы можете напрямую стать экстремалом",
     "l5": "Член",
     "l6": "Депозит достигает 10 000 долларов США или эквивалентной валюты;",
@@ -1527,7 +1528,7 @@ export default {
     "l19": "Депозит не требуется",
     "l20": "Низкопороговая партнерская система, ежедневный расчет комиссий, независимый агентский бэкэнд, каждый доход понятен и прозрачен",
     "l21": "Богатая офлайн-активность",
-    "l22": "Встреча высшего руководства Extreme Securities, билеты на ведущие саммиты отрасли, различные дискуссии и лекции финансовых знаменитостей",
+    "l22": "Встреча высшего руководства JD Trader, билеты на ведущие саммиты отрасли, различные дискуссии и лекции финансовых знаменитостей",
     "l23": "Расширенная поддержка контента",
     "l24": "Чрезвычайно предоставляет вам богатые шаблоны рекламных акций",
     "l25": "Сделайте свой обмен уникальным",
@@ -1542,7 +1543,7 @@ export default {
     "l34": "Поздравляем! Вы стали экстремальным партнером",
     "l35": "Вы можете войти в партнерский сервер двумя способами",
     "l36": "1. Откройте серверную часть JD Partners по следующему адресу на ПК и используйте учетную запись и пароль JD Trader для входа в систему непосредственно для управления",
-    "l37": "2. Нажмите кнопку ниже, чтобы напрямую получить доступ к серверной части Extreme Partner с помощью мобильного телефона;",
+    "l37": "2. Нажмите кнопку ниже, чтобы напрямую получить доступ к серверной части JD Trader Partner с помощью мобильного телефона;",
     "l38": "Нажмите, чтобы посетить серверную часть партнера",
     "l39": "Аккаунт не существует",
     "l40": "Заполните информацию о приложении",
@@ -1556,7 +1557,7 @@ export default {
     "l48": "Пожалуйста, укажите количество фанатов",
     "l49": "Пожалуйста, загрузите скриншот доказательства",
     "l50": "Подать заявку",
-    "l51": "Подача заявки на получение статуса Extreme Partner означает, что вы соглашаетесь и соблюдаете все условия Extreme Partner",
+    "l51": "Подача заявки на получение статуса JD Trader Partner означает, что вы соглашаетесь и соблюдаете все условия JD Trader Partner",
     "l52": "Вы подали заявку. О результате заявки вы будете уведомлены через системное сообщение в течение 3 рабочих дней. Пожалуйста, подождите терпеливо.",
     "l53": "Результат подачи заявки будет сообщен вам через системное сообщение в течение 3 рабочих дней",
     "l54": "Укажите преимущества акции",
@@ -1590,7 +1591,7 @@ export default {
     "l20": "2. Содержание фотографии правдиво и действительно, никакие изменения не допускаются",
     "l21": "3, поддержка jpg/jpeg/png",
     "l22": "Перед отправкой на сертификацию внимательно прочтите следующие документы соглашения",
-    "l23": "Пользовательское соглашение Extreme Securities",
+    "l23": "Пользовательское соглашение JD Trader",
     "l24": "Заявка подана",
     "l25": "Юридическое заявление",
     "l26": "Раскрытие информации о рисках",
@@ -1626,5 +1627,6 @@ export default {
   "l18": "Пожалуйста, введите имя, соответствующее вашей аутентификации личности",
   "l19": "Ввод имени неверен",
   },
+  ...followLang,
   ...landingLang,
 }

+ 10 - 8
src/lang/th.js

@@ -1,8 +1,9 @@
-import landingLang from "./landing/th";
+import followLang from "./follow/th";
+import landingLang from "./landing/en";
 export default {
   "html": {
-    "title": 'JDNX Securities JDNX |. แพลตฟอร์มการซื้อขาย CFD ที่ได้รับใบอนุญาตระดับโลก_ผู้ให้บริการเสนอราคาออปชัน OTC_สัญญาทองคำระหว่างประเทศ_แพลตฟอร์มการซื้อขาย JDNX',
-    "description": 'Extreme Securities เป็นแพลตฟอร์มการซื้อขายอนุพันธ์อย่างเป็นทางการที่ร่วมกันดูแลโดย FSP, SEC, FINRA และ FINTRAC และมีใบอนุญาต RIA ในฐานะเทรดเดอร์ทางอินเทอร์เน็ตที่มีนวัตกรรม พร้อมด้วยเทคโนโลยีและการสนับสนุนบริการชั้นนำของอุตสาหกรรม บริษัทให้บริการลูกค้าด้วยผลิตภัณฑ์และบริการทางการเงิน เช่น CFD หุ้น, ออปชั่น OTC, ออปชั่นหุ้น, การซื้อขายมาร์จิ้น, ทองคำ, Bitcoin, คู่สกุลเงิน ฯลฯ ',
+    "title": 'JD Trader JDNX |. แพลตฟอร์มการซื้อขาย CFD ที่ได้รับใบอนุญาตระดับโลก_ผู้ให้บริการเสนอราคาออปชัน OTC_สัญญาทองคำระหว่างประเทศ_แพลตฟอร์มการซื้อขาย JDNX',
+    "description": 'JD Trader เป็นแพลตฟอร์มการซื้อขายอนุพันธ์อย่างเป็นทางการที่ร่วมกันดูแลโดย FSP, SEC, FINRA และ FINTRAC และมีใบอนุญาต RIA ในฐานะเทรดเดอร์ทางอินเทอร์เน็ตที่มีนวัตกรรม พร้อมด้วยเทคโนโลยีและการสนับสนุนบริการชั้นนำของอุตสาหกรรม บริษัทให้บริการลูกค้าด้วยผลิตภัณฑ์และบริการทางการเงิน เช่น CFD หุ้น, ออปชั่น OTC, ออปชั่นหุ้น, การซื้อขายมาร์จิ้น, ทองคำ, Bitcoin, คู่สกุลเงิน ฯลฯ ',
     "keywords": 'สัญญาหุ้นฮ่องกง, สัญญาหุ้นสหรัฐฯ, สัญญา A-share, ตัวเลือก OTC, ตัวเลือกหุ้น, การซื้อขายมาร์จิ้น, การจัดสรรหุ้น, การซื้อขายทองคำ, การซื้อขาย Bitcoin'
   },
   "ajax": {
@@ -376,7 +377,7 @@ export default {
     "l3": "กรุณากรอกรหัสเชิญ (ไม่บังคับ)",
     "l4": "ลงทะเบียนโดยใช้อีเมล",
     "l5": "ลงทะเบียนโดยใช้โทรศัพท์มือถือ",
-    "l6": "ฉันได้อ่านและยอมรับกับ Extreme Securities",
+    "l6": "ฉันได้อ่านและยอมรับกับ JD Trader",
     "l7": "ข้อตกลงผู้ใช้",
     "l8": "และ",
     "l9": "ข้อกำหนดความเป็นส่วนตัว",
@@ -1527,7 +1528,7 @@ export default {
     "l19": "ไม่ต้องฝากเงิน",
     "l20": "ระบบพันธมิตรที่มีเกณฑ์ต่ำ การชำระค่าคอมมิชชั่นรายวัน แบ็กเอนด์เอเจนซี่อิสระ รายได้แต่ละรายการมีความชัดเจนและโปร่งใส",
     "l21": "กิจกรรมออฟไลน์ที่หลากหลาย",
-    "l22": "การประชุมผู้บริหารระดับสูงของ Extreme Securities ตั๋วเข้าชมการประชุมสุดยอดชั้นนำของอุตสาหกรรม การอภิปรายและการบรรยายที่มีชื่อเสียงทางการเงินต่างๆ",
+    "l22": "การประชุมผู้บริหารระดับสูงของ JD Trader ตั๋วเข้าชมการประชุมสุดยอดชั้นนำของอุตสาหกรรม การอภิปรายและการบรรยายที่มีชื่อเสียงทางการเงินต่างๆ",
     "l23": "รองรับเนื้อหาเพิ่มเติม",
     "l24": "มีเทมเพลตการโปรโมตที่หลากหลายให้คุณอย่างมาก",
     "l25": "ทำให้การแบ่งปันของคุณไม่เหมือนใคร",
@@ -1542,7 +1543,7 @@ export default {
     "l34": "ขอแสดงความยินดีด้วย! คุณกลายเป็นคู่หูสุดขั้วแล้ว",
     "l35": "คุณสามารถเข้าสู่ระบบแบ็กเอนด์ของพันธมิตรได้สองวิธีต่อไปนี้",
     "l36": "1. เปิดแบ็กเอนด์ JD Partners ผ่านที่อยู่ต่อไปนี้บนพีซี และใช้บัญชีและรหัสผ่าน JD Trader เพื่อเข้าสู่ระบบโดยตรงสำหรับการจัดการ",
-    "l37": "2. คลิกปุ่มด้านล่างเพื่อเข้าถึงแบ็คเอนด์ Extreme Partner โดยตรงโดยใช้โทรศัพท์มือถือของคุณ",
+    "l37": "2. คลิกปุ่มด้านล่างเพื่อเข้าถึงแบ็คเอนด์ JD Trader Partner โดยตรงโดยใช้โทรศัพท์มือถือของคุณ",
     "l38": "คลิกเพื่อเยี่ยมชมแบ็กเอนด์ของพันธมิตร",
     "l39": "ไม่มีบัญชี",
     "l40": "กรอกข้อมูลการสมัคร",
@@ -1556,7 +1557,7 @@ export default {
     "l48": "กรุณากรอกจำนวนแฟนๆ",
     "l49": "โปรดอัปโหลดภาพหน้าจอของหลักฐาน",
     "l50": "ส่งใบสมัคร",
-    "l51": "การสมัครเป็น Extreme Partner หมายความว่าคุณจะยอมรับและปฏิบัติตามข้อกำหนดทั้งหมดของ Extreme Partner",
+    "l51": "การสมัครเป็น JD Trader Partner หมายความว่าคุณจะยอมรับและปฏิบัติตามข้อกำหนดทั้งหมดของ JD Trader Partner",
     "l52": "คุณได้ส่งใบสมัครแล้ว ผลการสมัครจะแจ้งให้คุณทราบผ่านข้อความระบบภายใน 3 วันทำการ โปรดอดทนรอ",
     "l53": "จะแจ้งผลการสมัครให้คุณทราบทางข้อความระบบภายใน 3 วันทำการ",
     "l54": "โปรดระบุข้อดีของโปรโมชัน",
@@ -1626,5 +1627,6 @@ export default {
   "l18": "โปรดป้อนชื่อที่สอดคล้องกับการตรวจสอบตัวตนของคุณ",
   "l19": "การป้อนชื่อไม่สอดคล้องกัน",
  },
- ...landingLang,
+  ...followLang,
+  ...landingLang,
 }

+ 8 - 6
src/lang/vi.js

@@ -1,8 +1,9 @@
+import followLang from "./follow/vi";
 import landingLang from "./landing/vi";
 export default {
   "html": {
-    "title": 'JDNX Securities JDNX | Nền tảng giao dịch CFD chứng khoán được cấp phép và tuân thủ toàn cầu_Nhà cung cấp báo giá tùy chọn OTC_Hợp đồng vàng quốc tế_Bitcoin',
-    "description": 'Extreme Securities là một nền tảng giao dịch phái sinh chính thức được giám sát bởi FSP, SEC, FINRA và FINTRAC và có giấy phép RIA. Là một nhà giao dịch Internet sáng tạo, với sự hỗ trợ về công nghệ và dịch vụ hàng đầu trong ngành, nó cung cấp cho khách hàng các sản phẩm và dịch vụ tài chính như CFD cổ phiếu, quyền chọn OTC, quyền chọn cổ phiếu, giao dịch ký quỹ, vàng, Bitcoin, các cặp tiền tệ, v.v. ',
+    "title": 'JD Trader JDNX | Nền tảng giao dịch CFD chứng khoán được cấp phép và tuân thủ toàn cầu_Nhà cung cấp báo giá tùy chọn OTC_Hợp đồng vàng quốc tế_Bitcoin',
+    "description": 'JD Trader là một nền tảng giao dịch phái sinh chính thức được giám sát bởi FSP, SEC, FINRA và FINTRAC và có giấy phép RIA. Là một nhà giao dịch Internet sáng tạo, với sự hỗ trợ về công nghệ và dịch vụ hàng đầu trong ngành, nó cung cấp cho khách hàng các sản phẩm và dịch vụ tài chính như CFD cổ phiếu, quyền chọn OTC, quyền chọn cổ phiếu, giao dịch ký quỹ, vàng, Bitcoin, các cặp tiền tệ, v.v. ',
     "từ khóa": 'Hợp đồng chứng khoán Hồng Kông, hợp đồng chứng khoán Mỹ, hợp đồng cổ phiếu A, quyền chọn OTC, quyền chọn cổ phiếu, giao dịch ký quỹ, phân bổ cổ phiếu, giao dịch vàng, giao dịch Bitcoin'
   },
   "ajax": {
@@ -376,7 +377,7 @@ export default {
     "l3": "Vui lòng nhập mã mời (tùy chọn)",
     "l4": "Đăng ký bằng email",
     "l5": "Đăng ký bằng điện thoại di động",
-    "l6": "Tôi đã đọc và đồng ý với Extreme Securities",
+    "l6": "Tôi đã đọc và đồng ý với JD Trader",
     "l7": "Thỏa thuận người dùng",
     "l8": "Và",
     "l9": "Điều khoản về quyền riêng tư",
@@ -1527,7 +1528,7 @@ export default {
     "l19": "Không cần đặt cọc",
     "l20": "Hệ thống đối tác ngưỡng thấp, thanh toán hoa hồng hàng ngày, phụ trợ đại lý độc lập, mọi thu nhập đều rõ ràng và minh bạch",
     "l21": "Hoạt động ngoại tuyến phong phú",
-    "l22": "Cuộc họp quản lý cấp cao của Extreme Securities, vé tham dự các hội nghị thượng đỉnh hàng đầu trong ngành, nhiều cuộc thảo luận và bài giảng của người nổi tiếng về tài chính",
+    "l22": "Cuộc họp quản lý cấp cao của JD Trader, vé tham dự các hội nghị thượng đỉnh hàng đầu trong ngành, nhiều cuộc thảo luận và bài giảng của người nổi tiếng về tài chính",
     "l23": "Hỗ trợ nội dung mở rộng",
     "l24": "Cực kỳ cung cấp cho bạn các mẫu khuyến mãi phong phú",
     "l25": "Làm cho việc chia sẻ của bạn trở nên độc đáo",
@@ -1542,7 +1543,7 @@ export default {
     "l34": "Xin chúc mừng! Bạn đã trở thành một đối tác cực đoan",
     "l35": "Bạn có thể đăng nhập vào chương trình phụ trợ của đối tác theo hai cách sau",
     "l36": "1. Mở phần phụ trợ JD Partners thông qua địa chỉ sau trên PC và sử dụng tài khoản và mật khẩu JD Trader để đăng nhập trực tiếp để quản lý",
-    "l37": "2. Nhấp vào nút bên dưới để truy cập trực tiếp vào chương trình phụ trợ Extreme Partner bằng điện thoại di động của bạn;",
+    "l37": "2. Nhấp vào nút bên dưới để truy cập trực tiếp vào chương trình phụ trợ JD Trader Partner bằng điện thoại di động của bạn;",
     "l38": "Nhấp để truy cập phần phụ trợ của đối tác",
     "l39": "Tài khoản không tồn tại",
     "l40": "Điền thông tin ứng tuyển",
@@ -1556,7 +1557,7 @@ export default {
     "l48": "Hãy điền số lượng người hâm mộ",
     "l49": "Vui lòng tải lên ảnh chụp màn hình bằng chứng",
     "l50": "Gửi đơn đăng ký",
-    "l51": "Đăng ký trở thành Extreme Partner có nghĩa là bạn sẽ đồng ý và tuân thủ tất cả các điều khoản của Extreme Partner",
+    "l51": "Đăng ký trở thành JD Trader Partner có nghĩa là bạn sẽ đồng ý và tuân thủ tất cả các điều khoản của JD Trader Partner",
     "l52": "Bạn đã gửi đơn đăng ký. Kết quả đăng ký sẽ được thông báo cho bạn qua tin nhắn hệ thống trong vòng 3 ngày làm việc. Hãy kiên nhẫn chờ đợi.",
     "l53": "Kết quả đăng ký sẽ được thông báo cho bạn qua tin nhắn hệ thống trong vòng 3 ngày làm việc",
     "l54": "Vui lòng nhập ưu đãi khuyến mãi",
@@ -1626,5 +1627,6 @@ export default {
   "l18": "Vui lòng nhập tên phù hợp với xác thực danh tính của bạn",
   "l19": "Tên được nhập không nhất quán",
   },
+  ...followLang,
   ...landingLang,
 }

+ 2 - 0
src/lang/zh-TW.js

@@ -1,3 +1,4 @@
+import followLang from "./follow/zh-TW";
 import landingLang from "./landing/zh-TW";
 export default {
   "html": {
@@ -1626,5 +1627,6 @@ export default {
     "l18": "請輸入與您身分認證一致的姓名",
     "l19": "姓名輸入不一致",
   },
+  ...followLang,
   ...landingLang,
 }

+ 5 - 2
src/layout/index.vue

@@ -1,9 +1,9 @@
 <template>
-  <div class="layout">
+  <div class="layout" :class="{app: appFlag}">
     <keep-alive>
       <router-view></router-view> 
     </keep-alive>
-    <tabbar></tabbar>
+    <tabbar v-if="!appFlag"></tabbar>
   </div>
 </template>
 <script>
@@ -28,5 +28,8 @@ export default {
   min-height: 100vh;
   position: relative;
   padding-bottom: 60px;
+  &.app {
+    padding-bottom: 0px;
+  }
 }
 </style>

+ 1 - 1
src/router/copyTrade.js

@@ -8,7 +8,7 @@ export default [
     meta: { mustLogin: true, socket: true }
   },
   {
-    path: '/:locale' + lan + '?/my-copy',
+    path: '/:locale' + lan + '?/my-copy/:id',
     component: () => import(/* webpackChunkName: "follow" */ '@/view/copyTrade/myCopy'),
     name: 'myCopy',
     meta: { mustLogin: true, socket: true }

+ 29 - 29
src/router/index.js

@@ -48,10 +48,10 @@ import navView from '@/view/home/router/nav'
 import inform from '@/view/inform'
 import accountRecords from '@/view/accountRecords'
 import accountRecordsDetail from '@/view/accountRecords/detail'
-import support from '@/view/support'
-import workOrder from '@/view/workOrder'
-import workOrderAdd from '@/view/workOrderAdd'
-import workOrderDetail from '@/view/workOrderDetail'
+// import support from '@/view/support'
+// import workOrder from '@/view/workOrder'
+// import workOrderAdd from '@/view/workOrderAdd'
+// import workOrderDetail from '@/view/workOrderDetail'
 import transferAccounts from '@/view/transferAccounts'
 import thaw from '@/view/thaw'
 import feedback from '@/view/feedback'
@@ -144,7 +144,7 @@ export const constantRoutes = [
             path: 'follow/:market?',
             component: () => import(/* webpackChunkName: "follow" */ '@/view/copyTrade/marketview'),
             name: 'follow',
-            meta: { keepAlive: false, socket: true },
+            meta: { keepAlive: false },
           }
         ]
       },
@@ -330,12 +330,12 @@ export const constantRoutes = [
     name: 'noticeDetail',
     meta: { }
   },
-  {
-    path: '/:locale' + lan + '?/support',
-    component: support,
-    name: 'support',
-    meta: { mustLogin: true }
-  },
+  // {
+  //   path: '/:locale' + lan + '?/support',
+  //   component: support,
+  //   name: 'support',
+  //   meta: { mustLogin: true }
+  // },
   {
     path: '/:locale' + lan + '?/notices',
     component: notices,
@@ -348,24 +348,24 @@ export const constantRoutes = [
     name: 'noticesList',
     meta: { mustLogin: false, socket: true }
   },
-  {
-    path: '/:locale' + lan + '?/work-order/:type?',
-    component: workOrder,
-    name: 'workOrder',
-    meta: { mustLogin: true }
-  },
-  {
-    path: '/:locale' + lan + '?/work-order-detail/:id',
-    component: workOrderDetail,
-    name: 'workOrderDetail',
-    meta: { mustLogin: true }
-  },
-  {
-    path: '/:locale' + lan + '?/add-work-order',
-    component: workOrderAdd,
-    name: 'workOrderAdd',
-    meta: { mustLogin: true }
-  },
+  // {
+  //   path: '/:locale' + lan + '?/work-order/:type?',
+  //   component: workOrder,
+  //   name: 'workOrder',
+  //   meta: { mustLogin: true }
+  // },
+  // {
+  //   path: '/:locale' + lan + '?/work-order-detail/:id',
+  //   component: workOrderDetail,
+  //   name: 'workOrderDetail',
+  //   meta: { mustLogin: true }
+  // },
+  // {
+  //   path: '/:locale' + lan + '?/add-work-order',
+  //   component: workOrderAdd,
+  //   name: 'workOrderAdd',
+  //   meta: { mustLogin: true }
+  // },
   {
     path: '/:locale' + lan + '?/transfer-account',
     component: transferAccounts,

+ 1 - 1
src/store/getter.js

@@ -36,5 +36,5 @@ export default {
   expertInfo: state => state.copy.expertInfo,
   followLevelNumber: state => state.copy.followLevelNumber,
   followLevelRate: state => state.copy.followLevelRate,
-  followLevelName: state => state.copy.followLevelName,
+  followLevelName: state => state.app.followLevelName,
 }

+ 23 - 0
src/store/modules/app.js

@@ -1,6 +1,7 @@
 import { isPc } from '@/utils/index'
 import { getStorage, setStorage } from '@/utils/localStorage'
 import { getIframeUrl } from '@/api/app'
+import i18n from '@/lang'
 const app = {
   state: {
     appFlag: false,
@@ -18,6 +19,20 @@ const app = {
       description: '极度证券是由FSP、SEC、FINRA和FINTRAC联合监管,拥有RIA牌照的正规衍生品交易平台。作为创新的互联网交易商,极度以行业领先技术与服务支持,为客户提供股票差价合约、场外期权、股票期权、融资融券、黄金、比特币、货币对等金融产品和服务。',
       keywords: '港股合约, 美股合约, A股合约,场外期权,股票期权,融资融券, 股票配资, 黄金交易,比特币交易'
     },
+    followLevelName: {
+      // '6': '至尊',
+      // '5': '传奇',
+      // '4': '大师',
+      // '3': '高级',
+      // '2': '中级',
+      // '1': '初级',
+      '6': i18n.t('follow.l104'),
+      '5': i18n.t('follow.l105'),
+      '4': i18n.t('follow.l106'),
+      '3': i18n.t('setting.l14'),
+      '2': i18n.t('follow.l107'),
+      '1': i18n.t('follow.l108'),
+    },
   },
   mutations: {
     setShowAssets: (state, sign) => {
@@ -26,6 +41,14 @@ const app = {
     },
     setLang: (state, language) => {
       state.language = language
+      state.followLevelName = {
+        '6': i18n.t('follow.l104'),
+        '5': i18n.t('follow.l105'),
+        '4': i18n.t('follow.l106'),
+        '3': i18n.t('setting.l14'),
+        '2': i18n.t('follow.l107'),
+        '1': i18n.t('follow.l108'),
+      }
       setStorage('language', language)
     },
     setCurrencyList: (state, list) => {

+ 5 - 1
src/store/modules/assets.js

@@ -17,7 +17,11 @@ const assets = {
       state.accountList = list
     },
     setCashInfo: (state, info) => {
-      state.cashInfo = info
+      state.cashInfo = {
+        ...info,
+        server: 'usd',
+        market: 'usd',
+      }
     },
   },
   actions: {

+ 0 - 15
src/store/modules/copy.js

@@ -1,5 +1,4 @@
 import { getFollowList, getFollowAccount, getExpertInfo } from "@/api/copy";
-import i18n from '@/lang'
 const copy = {
   state: {
     followList: [],
@@ -14,20 +13,6 @@ const copy = {
       '5': '18%',
       '6': '20%',
     },
-    followLevelName: {
-      // '6': '至尊',
-      // '5': '传奇',
-      // '4': '大师',
-      // '3': '高级',
-      // '2': '中级',
-      // '1': '初级',
-      '6': i18n.t('follow.l104'),
-      '5': i18n.t('follow.l105'),
-      '4': i18n.t('follow.l106'),
-      '3': i18n.t('setting.l14'),
-      '2': i18n.t('follow.l107'),
-      '1': i18n.t('follow.l108'),
-    },
   },
   mutations: {
     setFollowList: (state, list) => {

+ 1 - 3
src/utils/request.js

@@ -77,9 +77,7 @@ service.interceptors.response.use(
             return Promise.reject(response.data)
           }
           if (store.getters.token) {
-            store.commit('SET_LOGIN', false)
-            store.commit('setAccountList', [])
-            store.commit('setCashInfo', {})
+            store.dispatch('logout')
             bus.$emit('init')
             if (router.currentRoute.meta.mustLogin) {
               Notify({

+ 1 - 0
src/view/abnormal/prove.vue

@@ -403,6 +403,7 @@ export default {
         timestamp: ''
       },
       list: [],
+      fullscreenLoading: false,
       filmloading: false,
       inputShow: false,
       selectPhoneType: 1,

+ 2 - 2
src/view/convert/index.vue

@@ -472,10 +472,10 @@ export default {
     },
     selectBack(item) {
       this.show = false
-      if ((!item.server && !this[this.sign].server) || (this[this.sign].server == item.server && this[this.sign].server)) {
+      if (this[this.sign].server == item.server) {
         return
       }
-      if (!item.server && this[this.sign].server) {
+      if (item.server == 'usd' && this[this.sign].server) {
         if (this.sign == 'formInfo') {
           this.toInfo = this.formInfo
         }

+ 1 - 0
src/view/copyTrade/applyCopy/index.vue

@@ -167,6 +167,7 @@ export default {
       checked: true,
       checked1: true,
       confirmPop: false,
+      fullscreenLoading: false,
       id: '',
     }
   },

+ 3 - 3
src/view/copyTrade/copyDetail/index.vue

@@ -38,7 +38,7 @@
                 {{ $t('account.l20') }}(USD)
               </div>
               <div>
-                2,000.36
+                {{ $numToThousand(followAccount.balance) }}
               </div>
             </van-col>
             <van-col span="12">
@@ -47,7 +47,7 @@
                 {{ $t('follow.l26') }}
               </div>
               <div>
-                {{expertInfo.ratio || '--'}}%
+                {{expertInfo.bonus_ratio ? $bigDecimal.multiply(expertInfo.bonus_ratio, 100) : '--'}}%
               </div>
             </van-col>
           </van-row>
@@ -67,7 +67,7 @@
                 {{ $t('follow.l28') }}(USD)
               </div>
               <div>
-                {{ $numToThousand(expertInfo.expert_profit) }}
+                {{ $numToThousand(expertInfo.bonus) }}
               </div>
             </van-col>
           </van-row>

+ 4 - 1
src/view/copyTrade/following/index.vue

@@ -2,7 +2,7 @@
   <div>
     <!-- 跟单中 -->
     <BackBar1 :title="$t('follow.l6')" />
-    <div class="tabbar flex">
+    <div class="tabbar flex" :class="{app: appFlag}">
       <div class="bar" :class="{active: type == '1'}" @click="changeType('1')">
         <!-- 当前跟随 -->
         {{ $t('follow.l136') }}
@@ -61,6 +61,9 @@ export default {
   position: sticky;
   top: 50px;
   z-index: 3;
+  &.app {
+    top: 0;
+  }
   .bar {
     cursor: pointer;
     font-size: 14px;

+ 1 - 1
src/view/copyTrade/marketview/find/components/applyBox.vue

@@ -6,7 +6,7 @@
         {{ $t('follow.l167') }}
       </div>
       <div class="flex">
-        <div class="btn" @click="$router.push('/my-copy')">
+        <div class="btn" @click="$router.push('/my-copy/' + expertInfo.eid)">
           <!-- 进入管理 -->
           {{ $t('follow.l168') }}
         </div>

+ 2 - 2
src/view/copyTrade/marketview/find/components/userList.vue

@@ -109,9 +109,9 @@ export default {
         var list = (res.list || []).sort((a, b) => new Date(a.date.replace(/-/g, '/')).getTime() - new Date(b.date.replace(/-/g, '/')).getTime())
         list.forEach(item => {
           if (this.chartListAll[item.eid]) {
-            this.chartListAll[item.eid].push(item.profit)
+            this.chartListAll[item.eid].push(item.balance ? (item.profit*100/item.balance).toFixed(2) : item.profit ? 100.00 : 0.00)
           } else {
-            this.chartListAll[item.eid] = [item.profit]
+            this.chartListAll[item.eid] = [item.balance ? (item.profit*100/item.balance).toFixed(2) : item.profit ? 100.00 : 0.00]
           }
         })
         this.chartLoaded = true

+ 5 - 2
src/view/copyTrade/marketview/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div class="btns flex">
+    <div class="btns flex" :class="{app: appFlag}">
       <div class="btn" :class="{active: market === '1'}" @click="tabChange('1')">
         <!-- 发现 -->
         {{ $t('tab.tab4') }}
@@ -16,7 +16,7 @@
         {{ $t('market.l10') }}
         <div class="line"></div>
       </div>
-      <div class="href flex" v-if="expertInfo.status == 1" @click="$router.push('/my-copy')">
+      <div class="href flex" v-if="expertInfo.status == 1" @click="$router.push('/my-copy/' + expertInfo.eid)">
         <div>
           <!-- 专家主页 -->
           {{ $t('follow.l166') }}
@@ -88,6 +88,9 @@ export default {
   flex-wrap: nowrap;
   overflow-x: auto;
   background-color: #fff;
+  &.app {
+    top: 0;
+  }
   &::-webkit-scrollbar {
     display: none;
   }

+ 9 - 4
src/view/copyTrade/marketview/tradingExperts/index.vue

@@ -3,7 +3,7 @@
     <div class="section">
       <van-row gutter="7" type="flex">
         <van-col span="12">
-          <div class="col1">
+          <div class="col1" @click="toMyCopy">
             <div>
               <!-- 我的跟单 -->
               {{ $t('follow.l3') }}
@@ -18,7 +18,7 @@
                 {{ $t('follow.l167') }}
               </div>
               <div class="flex">
-                <div class="btn" @click="$router.push('/my-copy')">
+                <div class="btn" @click="$router.push('/my-copy/' + expertInfo.eid)">
                   <!-- 进入管理 -->
                   {{ $t('follow.l168') }}
                 </div>
@@ -240,13 +240,18 @@ export default {
         var list = (res.list || []).sort((a, b) => new Date(a.date.replace(/-/g, '/')).getTime() - new Date(b.date.replace(/-/g, '/')).getTime())
         list.forEach(item => {
           if (this.chartListAll[item.eid]) {
-            this.chartListAll[item.eid].push(item.profit)
+            this.chartListAll[item.eid].push(item.balance ? (item.profit*100/item.balance).toFixed(2) : item.profit ? 100.00 : 0.00)
           } else {
-            this.chartListAll[item.eid] = [item.profit]
+            this.chartListAll[item.eid] = [item.balance ? (item.profit*100/item.balance).toFixed(2) : item.profit ? 100.00 : 0.00]
           }
         })
         this.chartLoaded = this.pageNum
       }).catch(() => {})
+    },
+    toMyCopy() {
+      if (this.isLogin) {
+        this.$router.push('/my-trade')
+      }
     }
   }
 }

+ 0 - 105
src/view/copyTrade/myCopy/components/chartView.vue

@@ -1,105 +0,0 @@
-<template>
-  <div>
-    <div class="section">
-      <div class="box flex">
-        <div class="title">
-          <!-- 收益率 -->
-          {{ $t('follow.l7') }}
-        </div>
-        <div class="filter" @click="dateShowClick(1)">
-          {{ cycleText[cycle] }}<i class="el-icon-caret-bottom"></i>
-        </div>
-      </div>
-      <lineView height="168px" :legendShow="false" :lineTitle="lineTitle" id="line1" ref="line1" />
-    </div>
-    <div class="section">
-      <div class="box flex">
-        <div class="title">
-          <!-- 总收益 -->
-          {{ $t('follow.l8') }}
-        </div>
-        <div class="filter" @click="dateShowClick(2)">
-          {{ cycleText[cycle1] }}<i class="el-icon-caret-bottom"></i>
-        </div>
-      </div>
-      <lineView height="168px" :legendShow="false" :lineTitle="lineTitle1" id="line2" ref="line2" />
-    </div>
-    <van-popup v-model="dateShow" round position="bottom">
-      <dateList @cancel="dateShow = false" :cycle="targetCycle" @success="selectBack"/>
-    </van-popup>
-  </div>
-</template>
-<script>
-import lineView from "@/components/charts/line.vue";
-import dateList from "./dateList.vue";
-export default {
-  components: {
-    lineView,
-    dateList
-  },
-  data () {
-    return {
-      lineTitle: [this.$t('follow.l7')],
-      lineTitle1: [this.$t('follow.l8')],
-      cycle: 7,
-      cycle1: 7,
-      targetCycle: 7,
-      targetIndex: 1,
-      dateShow: false,
-    }
-  },
-  computed: {
-    cycleText() {
-      return {
-        '7': "近7天",
-        '30': "近一月",
-        '90': "近三月",
-        '180': "近半年",
-      }
-    }
-  },
-  mounted () {
-    this.setLine1Data()
-  },
-  methods: {
-    selectBack(item) {
-      this.dateShow = false
-      if (this.targetIndex == 1) {
-        if (this.cycle == item) {
-          return
-        }
-        this.cycle = item
-      }
-      if (this.targetIndex == 2) {
-        if (this.cycle1 == item) {
-          return
-        }
-        this.cycle1 = item
-      }
-    },
-    dateShowClick(index) {
-      this.targetIndex = index
-      this.targetCycle = (index == 1 ? this.cycle : this.cycle1)
-      this.dateShow = true
-    },
-    setLine1Data() {
-      var xData = ['03-03', '03-04', '03-05', '03-06', '03-07']
-      var yData = [['12', '15', '16', '3', '40']]
-      this.$refs['line1'].setOption(xData, yData)
-      this.$refs['line2'].setOption(xData, yData)
-    }
-  }
-}
-</script>
-<style lang="less" scoped>
-.section {
-  padding: 10px 16px;
-}
-.box {
-  justify-content: space-between;
-  .filter {
-    font-size: 12px;
-    margin-right: -2px;
-  }
-}
-</style>

+ 23 - 9
src/view/copyTrade/myCopy/components/dataView.vue

@@ -6,10 +6,10 @@
           <!-- 成交 -->
           {{ $t('follow.l68') }}
         </div>
-        <div class="filter" @click="dateShow = true">
-          <!-- 全部 -->
+        <!-- <div class="filter" @click="dateShow = true">
+          全部
           {{ cycleText[cycle] || $t('inform.l21') }}<i class="el-icon-caret-bottom"></i>
-        </div>
+        </div> -->
       </div>
       <div class="cell">
         <div class="lab">
@@ -17,7 +17,7 @@
           {{ $t('follow.l7') }}
         </div>
         <div class="right">
-          +3,326.24%
+          {{ expertAccountInfo.balance ? (expertAccountInfo.profit * 100 / expertAccountInfo.balance).toFixed(2) : expertAccountInfo.profit ? '100.00' : '0.00' }}%
         </div>
       </div>
       <div class="cell">
@@ -26,7 +26,7 @@
           {{ $t('follow.l69') }}
         </div>
         <div class="right">
-          62.37%
+          --
         </div>
       </div>
       <div class="cell">
@@ -35,7 +35,7 @@
           {{ $t('follow.l70') }}
         </div>
         <div class="right">
-          1234
+          {{ info.count }}
         </div>
       </div>
       <div class="cell">
@@ -44,7 +44,7 @@
           {{ $t('follow.l8') }}
         </div>
         <div class="right">
-          99,542.39 USD
+          {{ $numToThousand(expertAccountInfo.profit) }} USD
         </div>
       </div>
       <div class="cell">
@@ -53,7 +53,7 @@
           {{ $t('follow.l71') }}
         </div>
         <div class="right">
-          92.73%
+          {{ expertAccountInfo.count ? (expertAccountInfo.success * 100 / expertAccountInfo.count).toFixed(2) : expertAccountInfo.success ? '100.00' : '0.00' }}%
         </div>
       </div>
       <div class="cell">
@@ -62,7 +62,7 @@
           {{ $t('follow.l72') }}
         </div>
         <div class="right">
-          389
+          {{ expertAccountInfo.count }}
         </div>
       </div>
     </div>
@@ -73,7 +73,9 @@
 </template>
 <script>
 import dateList from "./dateList.vue";
+import { getExpertList } from "@/api/copy";
 export default {
+  props: ['expertAccountInfo'],
   components: {
     dateList
   },
@@ -81,6 +83,7 @@ export default {
     return {
       cycle: '',
       dateShow: false,
+      info: {}
     }
   },
   computed: {
@@ -97,7 +100,18 @@ export default {
       }
     }
   },
+  created () {
+    this.getExpertList()
+  },
   methods: {
+    getExpertList() {
+      getExpertList({
+        eid: this.$route.params.id
+      }).then(res => {
+        var list = res.list || []
+        this.info = list[0] || {}
+      }).catch(() => {})
+    },
     selectBack(item) {
       this.dateShow = false
       if (this.cycle == item) {

+ 9 - 1
src/view/copyTrade/myCopy/components/profit.vue

@@ -33,7 +33,7 @@
       {{ $t('follow.l119') }}
     </div>
     <van-popup v-model="settlementPop" round position="bottom">
-      <settlement @cancel="settlementPop = false" />
+      <settlement @back="settlementBack" @cancel="settlementPop = false" />
     </van-popup>
   </div>
 </template>
@@ -52,6 +52,12 @@ export default {
   computed: {
     ...mapGetters(['expertInfo']),
   },
+  methods: {
+    settlementBack() {
+      this.settlementPop = false
+      this.$store.dispatch('getExpertInfo')
+    }
+  }
 }
 </script>
 <style lang="less" scoped>
@@ -62,10 +68,12 @@ export default {
   padding-top: 10px;
   font-weight: 600;
   font-size: 16px;
+  column-gap: 4px;
   .right {
     cursor: pointer;
     font-weight: 400;
     font-size: 12px;
+    text-align: right;
     .van-icon {
       margin-right: -2px;
     }

+ 54 - 5
src/view/copyTrade/myCopy/components/setting.vue

@@ -11,9 +11,9 @@
       </div>
       <div class="input-box flex">
         <div class="left flex">
-          <van-field type="number" v-model="amount"></van-field>
+          <van-field @blur="minBlur" type="number" v-model="min_ratio"></van-field>
           <div class="to">&ndash;</div>
-          <van-field type="number" v-model="amount1"></van-field>
+          <van-field @blur="maxBlur" type="number" v-model="max_ratio"></van-field>
         </div>
         <div>
           <!-- 倍 -->
@@ -25,7 +25,7 @@
         {{ $t('follow.l123') }}
       </div>
     </div>
-    <div class="box">
+    <div class="box" v-if="false">
       <div class="title1">
         <!-- 自动发单 -->
         {{ $t('follow.l124') }}
@@ -45,13 +45,62 @@
   </div>
 </template>
 <script>
+import { updateExpert } from "@/api/copy";
+import { mapGetters } from "vuex";
 export default {
   data () {
     return {
-      amount: '',
-      amount1: '',
+      min_ratio: '',
+      max_ratio: '',
       checked: true,
     }
+  },
+  computed: {
+    ...mapGetters(['expertInfo']),
+  },
+  watch: {
+    expertInfo: {
+      handler() {
+        if (!this.min_ratio) {
+          this.min_ratio = this.expertInfo.min_ratio
+        }
+        if (!this.max_ratio) {
+          this.max_ratio = this.expertInfo.max_ratio
+        }
+      },
+      deep: true
+    },
+  },
+  created () {
+    if (!this.min_ratio) {
+      this.min_ratio = this.expertInfo.min_ratio
+    }
+    if (!this.max_ratio) {
+      this.max_ratio = this.expertInfo.max_ratio
+    }
+  },
+  methods: {
+    minBlur() {
+      var ratio = Number(this.min_ratio)
+      if (ratio > 0 && ratio <= Number(this.max_ratio) && ratio != this.expertInfo.min_ratio) {
+        this.updateExpert({
+          min_ratio: ratio
+        })
+      }
+    },
+    maxBlur() {
+      var ratio = Number(this.max_ratio)
+      if (ratio > 0 && ratio >= Number(this.min_ratio) && ratio != this.expertInfo.max_ratio) {
+        this.updateExpert({
+          max_ratio: ratio
+        })
+      }
+    },
+    updateExpert(data) {
+      updateExpert(data).then(() => {
+        this.$store.dispatch('getExpertInfo')
+      }).catch(() => {})
+    }
   }
 }
 </script>

+ 22 - 2
src/view/copyTrade/myCopy/components/settlement.vue

@@ -13,7 +13,7 @@
         <!-- 取消 -->
         {{ $t('common.l65') }}
       </div>
-      <div class="btn rth" @click="cancel">
+      <div class="btn rth" @click="exchangeFollowBonus">
         <!-- 确定 -->
         {{ $t('common.l64') }}
       </div>
@@ -22,10 +22,11 @@
 </template>
 <script>
 import { mapGetters } from "vuex";
+import { exchangeFollowBonus } from "@/api/copy";
 export default {
   data () {
     return {
-      
+      fullscreenLoading: false
     }
   },
   computed: {
@@ -35,6 +36,25 @@ export default {
     cancel() {
       this.$emit('cancel')
     },
+    exchangeFollowBonus() {
+      if (!this.expertInfo.balance) {
+        this.cancel()
+        return
+      }
+      this.fullscreenLoading = true
+      exchangeFollowBonus({
+        amount: this.expertInfo.balance
+      }).then(() => {
+        this.$notify({
+          // message: '提交成功',
+          message: this.$t('join.l55'),
+          type: 'success'
+        });
+        this.$emit('back')
+      }).catch(() => {}).finally(() => {
+        this.fullscreenLoading = false
+      })
+    }
   },
 }
 </script>

+ 47 - 14
src/view/copyTrade/myCopy/index.vue

@@ -22,8 +22,6 @@
             </div>
             <div class="level">
               {{ followLevelName[expertInfo.level] }}
-              <!-- 高级 -->
-              <!-- {{ $t('setting.l14') }} -->
             </div>
             <!-- 等级细则 -->
             <div class="href" @click.stop="$router.push('/statement/followLevel')">
@@ -60,21 +58,21 @@
       <div class="box2">
         <van-row>
           <van-col span="8">
-            <div>319,873.36</div>
+            <div>{{ $numToThousand(expertAccountInfo.balance) }}</div>
             <div class="label">
               <!-- 总资产(USD) -->
               {{ $t('account.l') }}(USD)
             </div>
           </van-col>
           <van-col span="8" class="center">
-            <div>319</div>
+            <div>{{ expertAccountInfo.count }}</div>
             <div class="label">
               <!-- 总笔数 -->
               {{ $t('follow.l61') }}
             </div>
           </van-col>
           <van-col span="8" class="text-right">
-            <div>{{getDay(expertInfo.insert_datetime)}}</div>
+            <div>{{getDay(expertAccountInfo.insert_datetime) || '--'}}</div>
             <div class="label">
               <!-- 加入时间(天) -->
               {{ $t('follow.l62') }}({{ $t('option.l18') }})
@@ -83,14 +81,14 @@
         </van-row>
         <van-row>
           <van-col span="8">
-            <div>319,873.36</div>
+            <div>{{ getcount(expertAccountInfo.count, expertAccountInfo.insert_datetime) }}</div>
             <div class="label">
               <!-- 交易频率(笔/天) -->
               {{ $t('follow.l63') }}({{ $t('follow.l64') }}/{{ $t('option.l18') }})
             </div>
           </van-col>
           <van-col span="8" class="center">
-            <div>10%</div>
+            <div>{{expertInfo.bonus_ratio ? $bigDecimal.multiply(expertInfo.bonus_ratio, 100) : '--'}}%</div>
             <div class="label">
               <!-- 分润比例 -->
               {{ $t('follow.l26') }}
@@ -100,7 +98,7 @@
       </div>
     </div>
     <div class="conatiner1">
-      <div class="tabbar1 flex">
+      <div class="tabbar1 flex" :class="{app: appFlag}">
         <div class="bar" :class="{active: tab == '1'}" @click="tab = '1'">
           <!-- 图表 -->
           {{ $t('exchange.l6') }}
@@ -122,9 +120,9 @@
           <div class="line"></div>
         </div>
       </div>
-      <chartView v-if="tab == '1'" />
-      <dataView v-if="tab == '2'" />
-      <orderView v-if="tab == '3'" />
+      <chartView v-if="tab == '1'" :market="market ? (marketTag[market] || 'CFD') : ''" />
+      <dataView :expertAccountInfo="expertAccountInfo" :market="marketTag[market] || 'CFD'" v-if="tab == '2'" />
+      <orderView :market="marketTag[market] || 'CFD'" v-if="tab == '3'" />
       <followers v-if="tab == '4'" />
     </div>
   </div>
@@ -132,12 +130,13 @@
 <script>
 import profit from "./components/profit.vue";
 import setting from "./components/setting.vue";
-import chartView from "./components/chartView.vue";
+import chartView from "@/view/copyTrade/tradeDetail/components/chartView.vue";
 import dataView from "./components/dataView.vue";
-import orderView from "./orderView";
+import orderView from "@/view/copyTrade/tradeDetail/orderView";
 import followers from "./components/followers.vue";
 import BackBar1 from '@/components/backBar1'
 import shareIcon1 from "@/components/shareIcon1";
+import { getExpertAccountList } from "@/api/copy";
 import { mapGetters } from "vuex";
 export default {
   components: {
@@ -154,11 +153,28 @@ export default {
     return {
       market: '',
       tab: '1',
+      expertAccountList: [],
       id: '',
     }
   },
   computed: {
     ...mapGetters(['expertInfo', 'followLevelNumber', 'followLevelRate', 'followLevelName']),
+    expertAccountInfo() {
+      var info = {}
+      this.expertAccountList.forEach((item) => {
+        if (item.market == (this.marketTag[this.market] || 'CFD')) {
+          info = item
+        }
+      })
+      return info
+    },
+    marketTag() {
+      return {
+        "US": 'US',
+        "HK": 'HK',
+        "CN": 'CN',
+      }
+    },
     product_group() {
       var product_group = this.expertInfo.product_group ? JSON.parse(this.expertInfo.product_group) : []
       return product_group.filter(item => this.tagName[item])
@@ -197,12 +213,26 @@ export default {
           this.market = this.product_group[0] || ''
         }
       })
+      this.getExpertAccountList()
     })
   },
   methods: {
+    getExpertAccountList() {
+      getExpertAccountList({
+        eid: this.expertInfo.eid
+      }).then(res => {
+        this.expertAccountList = res.list || []
+      }).catch(() => {})
+    },
+    getcount(count, time) {
+      if (!count || !time) {
+        return 0
+      }
+      return (count/this.getDay(time)).toFixed(2)
+    },
     getDay(time) {
       if(!time) {
-        return '--'
+        return 0
       }
       var timeDifference = new Date() - new Date(time.replace(' ', 'T') + '+08:00')
       var day = Math.ceil(timeDifference / (1000 * 60 * 60 * 24))
@@ -323,6 +353,9 @@ export default {
   flex-wrap: nowrap;
   overflow-x: auto;
   background-color: #fff;
+  &.app {
+    top: 0;
+  }
   &::-webkit-scrollbar {
     display: none;
   }

+ 0 - 203
src/view/copyTrade/myCopy/orderView/components/historyList.vue

@@ -1,203 +0,0 @@
-<template>
-  <van-list
-    :offset="900"
-    v-model="loading"
-    :finished="finished"
-    :finished-text="list.length ? $t('common.l5') : ''"
-    @load="onLoad"
-  >
-    <div class="li" v-for="item in list" :key="item.ticket">
-      <div class="left">
-        <div class="box flex">
-          <div class="title" v-if="productDataObj[item.symbol]">
-            {{ productDataObj[item.symbol].title }}
-          </div>
-          <div>({{ item.symbol }})</div>
-          <div class="cmd" :class="'cmd' + item.cmd">
-            <!-- 买 -->
-            {{ item.cmd == 0 ? $t('follow.l32') : $t('follow.l33') }}
-          </div>
-        </div>
-        <div class="price flex">
-          <div>{{ $handleDigits(item.open_price, productDataObj[item.symbol] ? productDataObj[item.symbol].digits : 2) }}</div>
-          &gt;
-          <div :class="{up: item.cmd == 0, down: item.cmd == 1}">{{ $handleDigits(item.close_price, productDataObj[item.symbol] ? productDataObj[item.symbol].digits : 2) }}</div>
-        </div>
-        <div class="time flex">
-          <div>{{ item.open_time.replace(/-/g, '/') }}</div>
-          <img class="icon" src="/img/copy/icon1.png" alt="">
-          <div>{{ item.close_time.replace(/-/g, '/') }}</div>
-        </div>
-      </div>
-      <div class="right">
-        <div class="flex box1">
-          <div class="lab">
-            <!-- 数量 -->
-            {{ $t('common.l25') }}
-          </div>
-          <div v-if="productDataObj[item.symbol]">
-            {{ $handleDigits($bigDecimal.multiply(item.volume, productDataObj[item.symbol].contract_size)) }}
-          </div>
-        </div>
-        <div class="income-box">
-          <div>
-            <!-- 收益率 -->
-            {{ $t('follow.l7') }}
-          </div>
-          <div class="val" :class="getRateReturn(item) > 0 ? 'up' : 'down'">
-            {{ getRateReturn(item) }}%
-          </div>
-        </div>
-      </div>
-    </div>
-    <NoData v-if="!loading && list.length == 0" />
-  </van-list>
-</template>
-<script>
-import { getExpertTradeList } from "@/api/copy";
-import bus from '@/utils/bus'
-import { mapGetters } from "vuex";
-export default {
-  inject: ['getproductDataObj'],
-  data () {
-    return {
-      pageNum: 0,
-      pageSize: 20,
-      finished: false,
-      loading: false,
-      list: [],
-      symbolList: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['expertInfo']),
-    productDataObj() {
-      return this.getproductDataObj()
-    },
-  },
-  created () {
-  },
-  methods: {
-    onLoad() {
-      this.pageNum += 1;
-      if (this.pageNum == 1) {
-        this.list = [];
-      }
-      this.getExpertTradeList()
-    },
-    getExpertTradeList() {
-      getExpertTradeList({
-        eid: this.expertInfo.eid,
-        status: 2,
-        pageNum: this.pageNum,
-        pageSize: this.pageSize,
-      }).then(res => {
-        var list = res.list || [];
-        var symbolList = []
-        list.forEach((item) => {
-          if (this.symbolList.indexOf(item.symbol) === -1 && !this.productDataObj[item.symbol]) {
-            symbolList.push(item.symbol)
-            this.symbolList.push(item.symbol)
-          }
-        })
-        bus.$emit("alterProductData", {
-          getData: symbolList
-        });
-        if (this.pageNum == 1) {
-          this.list = list;
-        } else {
-          this.list = this.list.concat(list);
-        }
-        this.loading = false;
-        if (res.endRow == res.total) {
-          this.finished = true;
-        }
-      }).catch(() => {})
-    },
-    getRateReturn(item) {
-      return (((item.close_price - item.open_price) / item.open_price) * 100).toFixed(2)
-    }
-  }
-}
-</script>
-<style lang="less" scoped>
-.van-list {
-  padding: 0 16px 10px;
-}
-.li {
-  border-radius: 8px;
-  border: 1px solid #F6F6F6;
-  padding: 14px 9px;
-  position: relative;
-  margin-bottom: 10px;
-  display: flex;
-  justify-content: space-between;
-  column-gap: 12px;
-}
-.left {
-  flex: 1;
-  min-width: 0px;
-}
-.box {
-  margin-bottom: 6px;
-  .title {
-    min-width: 0px;
-    max-width: 100%;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-  }
-  .cmd {
-    margin-left: 6px;
-    padding: 2px;
-    border-radius: 2px;
-    background-color: var(--red-);
-    font-weight: 600;
-    font-size: 10px;
-    color: #FFFFFF;
-  }
-  .cmd1 {
-    background-color: var(--green-);
-  }
-}
-.price {
-  font-size: 12px;
-  color: #B6B6B6;
-  column-gap: 4px;
-}
-.time {
-  font-size: 10px;
-  color: #B6B6B6;
-  margin-top: 10px;
-  column-gap: 4px;
-  .icon {
-    width: 10px;
-  }
-}
-.right {
-  text-align: right;
-  .box1 {
-    font-size: 10px;
-    column-gap: 4px;
-    margin-bottom: 10px;
-    .lab {
-      color: #B6B6B6;
-    }
-  }
-}
-.income-box {
-  font-size: 12px;
-  color: #888888;
-  .val {
-    font-weight: 600;
-    font-size: 14px;
-    margin-top: 6px;
-  }
-}
-.up {
-  color: var(--red-);
-}
-.down {
-  color: var(--green-);
-}
-</style>

+ 0 - 186
src/view/copyTrade/myCopy/orderView/components/openList.vue

@@ -1,186 +0,0 @@
-<template>
-  <div class="list">
-    <div class="li" v-for="item in list" :key="item.ticket">
-      <div class="left">
-        <div class="box flex">
-          <div class="title" v-if="productDataObj[item.symbol]">
-            {{ productDataObj[item.symbol].title }}
-          </div>
-          <div>({{ item.symbol }})</div>
-          <div class="cmd" :class="'cmd' + item.cmd">
-            <!-- 买 -->
-            {{ item.cmd == 0 ? $t('follow.l32') : $t('follow.l33') }}
-          </div>
-        </div>
-        <div class="price flex">
-          <div>{{ $handleDigits(item.open_price, productDataObj[item.symbol] ? productDataObj[item.symbol].digits : 2) }}</div>
-          &gt;
-          <div v-if="productDataObj[item.symbol]" :class="{up: item.cmd == 0, down: item.cmd == 1}">{{ $handleDigits((item.cmd == 0 ? productDataObj[item.symbol].sell : productDataObj[item.symbol].buy) || item.close_price, productDataObj[item.symbol].digits) }}</div>
-        </div>
-        <div class="time flex">
-          <div>{{ item.open_time.replace(/-/g, '/') }}</div>
-        </div>
-      </div>
-      <div class="right">
-        <div class="flex box1">
-          <div class="lab">
-            <!-- 数量 -->
-            {{ $t('common.l25') }}
-          </div>
-          <div v-if="productDataObj[item.symbol]">
-            {{ $handleDigits($bigDecimal.multiply(item.volume, productDataObj[item.symbol].contract_size)) }}
-          </div>
-        </div>
-        <div class="income-box">
-          <div>
-            <!-- 收益率 -->
-            {{ $t('follow.l7') }}
-          </div>
-          <div class="val" v-if="productDataObj[item.symbol]" :class="getRateReturn(item) > 0 ? 'up' : 'down'">
-            {{ getRateReturn(item) }}%
-          </div>
-        </div>
-      </div>
-    </div>
-    <NoData v-if="!loading && list.length == 0" />
-  </div>
-</template>
-<script>
-import { getExpertTradeList } from "@/api/copy";
-import bus from '@/utils/bus'
-import { mapGetters } from "vuex";
-export default {
-  inject: ['getproductDataObj'],
-  data () {
-    return {
-      loading: false,
-      list: [],
-      symbolList: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['expertInfo']),
-    productDataObj() {
-      return this.getproductDataObj()
-    },
-  },
-  created () {
-    this.getExpertTradeList()
-  },
-  methods: {
-    getExpertTradeList() {
-      this.loading = true;
-      getExpertTradeList({
-        eid: this.expertInfo.eid,
-        status: 1,
-      }).then(res => {
-        var list = res.list || [];
-        var symbolList = []
-        list.forEach((item) => {
-          if (this.symbolList.indexOf(item.symbol) === -1) {
-            this.symbolList.push(item.symbol)
-            if (!this.productDataObj[item.symbol]) {
-              symbolList.push(item.symbol)
-            }
-          }
-        })
-        bus.$emit("alterProductData", {
-          getData: symbolList,
-          subscribeList: [...this.symbolList]
-        });
-        this.list = list;
-      }).catch(() => {}).finally(() => {
-        this.loading = false;
-      })
-    },
-    getRateReturn(item) {
-      var close_price = item.close_price
-      if (item.cmd == 0 && this.productDataObj[item.symbol].sell) {
-        close_price = this.productDataObj[item.symbol].sell
-      }
-      if (item.cmd == 1 && this.productDataObj[item.symbol].buy) {
-        close_price = this.productDataObj[item.symbol].buy
-      }
-      return (((close_price - item.open_price) / item.open_price) * 100).toFixed(2)
-    }
-  }
-}
-</script>
-<style lang="less" scoped>
-.list {
-  padding: 0 16px 10px;
-}
-.li {
-  border-radius: 8px;
-  border: 1px solid #F6F6F6;
-  padding: 14px 9px;
-  position: relative;
-  margin-bottom: 10px;
-  display: flex;
-  justify-content: space-between;
-  column-gap: 12px;
-}
-.left {
-  flex: 1;
-  min-width: 0px;
-}
-.box {
-  margin-bottom: 6px;
-  .title {
-    min-width: 0px;
-    max-width: 100%;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-  }
-  .cmd {
-    margin-left: 6px;
-    padding: 2px;
-    border-radius: 2px;
-    background-color: var(--red-);
-    font-weight: 600;
-    font-size: 10px;
-    color: #FFFFFF;
-  }
-}
-.price {
-  font-size: 12px;
-  color: #B6B6B6;
-  column-gap: 4px;
-}
-.time {
-  font-size: 10px;
-  color: #B6B6B6;
-  margin-top: 10px;
-  column-gap: 4px;
-  .icon {
-    width: 10px;
-  }
-}
-.right {
-  text-align: right;
-  .box1 {
-    font-size: 10px;
-    column-gap: 4px;
-    margin-bottom: 10px;
-    .lab {
-      color: #B6B6B6;
-    }
-  }
-}
-.income-box {
-  font-size: 12px;
-  color: #888888;
-  .val {
-    font-weight: 600;
-    font-size: 14px;
-    margin-top: 6px;
-  }
-}
-.up {
-  color: var(--red-);
-}
-.down {
-  color: var(--green-);
-}
-</style>

+ 0 - 56
src/view/copyTrade/myCopy/orderView/index.vue

@@ -1,56 +0,0 @@
-<template>
-  <div>
-    <div class="btns flex">
-      <div class="btn" :class="{active: type === 1}" @click="type = 1">
-        <!-- 历史订单 -->
-        {{ $t('exchange.l72') }}
-      </div>
-      <div class="btn" :class="{active: type === 2}" @click="type = 2">
-        <!-- 当前订单 -->
-        {{ $t('follow.l80') }}
-      </div>
-    </div>
-    <historyList v-if="type == 1" />
-    <openList v-if="type == 2" />
-  </div>
-</template>
-<script>
-import openList from "./components/openList.vue";
-import historyList from "./components/historyList.vue";
-export default {
-  components: {
-    openList,
-    historyList
-  },
-  data () {
-    return {
-      type: 1,
-    }
-  }
-}
-</script>
-<style lang="less" scoped>
-.btns {
-  padding: 10px 16px;
-  background-color: #fff;
-  white-space: nowrap;
-  flex-wrap: nowrap;
-  overflow-x: auto;
-  &::-webkit-scrollbar {
-    display: none;
-  }
-  .btn {
-    cursor: pointer;
-    margin-right: 20px;
-    border-radius: 2px;
-    border: 1px solid #ffffff;
-    font-size: 12px;
-    color: #B6B6B6;
-    padding: 5px;
-    &.active {
-      border-color: #000;
-      color: #000000;
-    }
-  }
-}
-</style>

+ 5 - 2
src/view/copyTrade/myTrade/components/incomeDetails.vue

@@ -125,7 +125,10 @@ export default {
       var eidRatio = {}
       this.followList.forEach((item) => {
         bonus = this.$bigDecimal.add(bonus, item.bonus)
-        eidRatio[item.eid] = item.ratio
+        eidRatio[item.eid] = {
+          ratio: item.ratio,
+          bonus_ratio: item.bonus_ratio
+        }
       })
       this.eidRatio = eidRatio
       return this.$bigDecimal.multiply(bonus, -1)
@@ -143,7 +146,7 @@ export default {
         profit = this.$bigDecimal.add(profit, v.swaps)
         profit = this.$bigDecimal.divide(profit, this.currencyList[currency] || 1)
         if (Number(profit) > 0) {
-          positionBonus = this.$bigDecimal.add(positionBonus, this.$bigDecimal.divide(this.$bigDecimal.multiply(profit, this.eidRatio[item.eid] || 0), 100))
+          positionBonus = this.$bigDecimal.add(positionBonus, this.$bigDecimal.multiply(this.$bigDecimal.multiply(profit, this.eidRatio[item.eid].ratio || 0), this.eidRatio[item.eid].bonus_ratio))
         }
         allProfit = this.$bigDecimal.add(allProfit, profit)
       })

+ 4 - 1
src/view/copyTrade/myTrade/index.vue

@@ -2,7 +2,7 @@
   <div>
     <!-- 我的跟单 -->
     <BackBar1 :title="$t('follow.l12')"/>
-    <div class="header">
+    <div class="header" :class="{app: appFlag}">
       <div class="box">
         <van-row gutter="6" type="flex">
           <van-col span="8">
@@ -108,6 +108,9 @@ export default {
   top: 50px;
   z-index: 6;
   background-color: #fff;
+  &.app {
+    top: 0;
+  }
   .box {
     border-radius: 8px;
     border: 1px solid #F6F6F6;

+ 158 - 80
src/view/copyTrade/profitDetails/components/list.vue

@@ -1,108 +1,186 @@
 <template>
   <div class="list">
-    <div class="li" v-for="item in 7" :key="item">
-      <van-image
-        width="36"
-        height="36"
-        round
-        fit="cover"
-        :src="'/img/follow/follow.png'"
-      />
-      <div class="body" v-if="item == 1">
-        <div class="name-box">
-          <div class="name">
-            <!-- 申请结算 -->
-            {{ $t('follow.l117') }}
+    <van-list
+      v-model="loading"
+      :finished="finished"
+      :finished-text="list.length ? $t('common.l5') : ''"
+      @load="onLoad"
+    >
+      <div class="li" v-for="item in list" :key="item.id">
+        <van-image
+          width="36"
+          height="36"
+          round
+          fit="cover"
+          :src="(item.path == 2 ? expertInfo.header : item.user_header) || '/img/follow/follow.png'"
+        />
+        <div class="body" v-if="item.path == 2">
+          <div class="name-box">
+            <div class="name">
+              <!-- 申请结算 -->
+              {{ $t('follow.l117') }}
+            </div>
+            <div class="time flex">
+              <div class="lab">
+                <!-- 申请时间  -->
+                {{ $t('follow.l131') }}
+              </div>
+              <div>
+                {{ item.insert_datetime.replace(/-/g, '/') }}
+              </div>
+            </div>
           </div>
-          <div class="time flex">
+          <div class="cell flex">
             <div class="lab">
-              <!-- 申请时间  -->
-              {{ $t('follow.l131') }}
+              <!-- 结算金额 -->
+              {{ $t('option.l34') }}
             </div>
-            <div>
-              2024/04/29/14:32:27
+            <div class="right">
+              {{ $numToThousand(item.amount) }} USD
             </div>
           </div>
-        </div>
-        <div class="cell flex">
-          <div class="lab">
-            <!-- 结算金额 -->
-            {{ $t('option.l34') }}
-          </div>
-          <div class="right">
-            + 2,124.98 USD
-          </div>
-        </div>
-        <div class="cell flex">
-          <div class="lab">
-            <!-- 当前状态 -->
-            {{ $t('follow.l135') }}
-          </div>
-          <div class="right">
-            待审核
-          </div>
-        </div>
-      </div>
-      <div class="body" v-else>
-        <div class="name-box">
-          <div class="name">
-            用户昵称
-          </div>
-          <div class="time flex">
+          <div class="cell flex">
             <div class="lab">
-              <!--  交易时间 -->
-              {{ $t('product.l82') }}
+              <!-- 当前状态 -->
+              {{ $t('follow.l135') }}
             </div>
-            <div>
-              2024/04/29/14:32:27
+            <div class="right">
+              {{ statusText[item.status] }}
             </div>
           </div>
         </div>
-        <div class="cell flex">
-          <div class="lab">
-            <!-- 跟单标的 -->
-            {{ $t('follow.l132') }}
-          </div>
-          <div class="right">
-            贵州茅台 600519.SH
-          </div>
-        </div>
-        <div class="cell flex">
-          <div class="lab">
-            <!-- 跟单数量 -->
-            {{ $t('follow.l133') }}
-          </div>
-          <div class="right">
-            200
+        <div class="body" v-else>
+          <div class="name-box">
+            <div class="name">
+              {{ item.user_title }}
+            </div>
+            <div class="time flex">
+              <div class="lab">
+                <!--  交易时间 -->
+                {{ $t('product.l82') }}
+              </div>
+              <div>
+                {{ item.insert_datetime.replace(/-/g, '/') }}
+              </div>
+            </div>
           </div>
-        </div>
-        <div class="cell flex">
-          <div class="lab">
-            <!-- 跟单收益 -->
-            {{ $t('follow.l134') }}
+          <div class="cell flex">
+            <div class="lab">
+              <!-- 跟单标的 -->
+              {{ $t('follow.l132') }}
+            </div>
+            <div class="right">
+              {{ productDataObj[item.from.symbol] ? productDataObj[item.from.symbol].title : '' }} {{ item.from.symbol }}
+            </div>
           </div>
-          <div class="right up">
-            + 2,124.98 USD
+          <div class="cell flex">
+            <div class="lab">
+              <!-- 跟单数量 -->
+              {{ $t('follow.l133') }}
+            </div>
+            <div class="right" v-if="productDataObj[item.from.symbol]">
+              {{ $handleDigits($bigDecimal.multiply(item.from.volume, productDataObj[item.from.symbol].contract_size)) }}
+            </div>
           </div>
-        </div>
-        <div class="cell flex">
-          <div class="lab">
-            <!-- 分润金额 -->
-            {{ $t('follow.l28') }}
+          <div class="cell flex">
+            <div class="lab">
+              <!-- 跟单收益 -->
+              {{ $t('follow.l134') }}
+            </div>
+            <div class="right up">
+              {{item.from.profit > 0 ? '+' : '' }} {{ $numToThousand(item.from.profit) }} USD
+            </div>
           </div>
-          <div class="right down">
-            + 2,124.98 USD
+          <div class="cell flex">
+            <div class="lab">
+              <!-- 分润金额 -->
+              {{ $t('follow.l28') }}
+            </div>
+            <div class="right up">
+              + {{ $numToThousand(item.amount) }} USD
+            </div>
           </div>
         </div>
       </div>
-    </div>
+     <NoData v-if="!loading && list.length == 0" />
+    </van-list>
   </div>
 </template>
 <script>
+import { getFollowBonusList } from "@/api/copy";
+import bus from '@/utils/bus'
+import { mapGetters } from "vuex";
 export default {
+  inject: ['getproductDataObj'],
   data () {
     return {
-      
+      pageNum: 0,
+      pageSize: 20,
+      list: [],
+      finished: false,
+      loading: false,
+      symbolList: [],
+      statusText: {
+        // '1': '未支付',
+        // '2': '待审核',
+        // '3': '已驳回',
+        // '4': '处理中',
+        // '5': '已撤销',
+        // '100': '已完成',
+        '1': this.$t('ajax.201'),
+        '2': this.$t('ajax.350'),
+        '3': this.$t('ajax.408'),
+        '4': this.$t('ajax.401'),
+        '5': this.$t('ajax.404'),
+        '100': this.$t('ajax.403'),
+      },
+    }
+  },
+  computed: {
+    ...mapGetters(['expertInfo']),
+    productDataObj() {
+      return this.getproductDataObj()
+    },
+  },
+  methods: {
+    reset() {
+      this.pageNum = 0
+      this.onLoad()
+    },
+    onLoad() {
+      this.pageNum += 1;
+      if (this.pageNum == 1) {
+        this.list = [];
+      }
+      this.getFollowBonusList()
+    },
+    getFollowBonusList() {
+      getFollowBonusList({
+        pageNum: this.pageNum,
+        pageSize: this.pageSize,
+      }).then(res => {
+        var list = res.list || [];
+        var symbolList = []
+        list.forEach(item => {
+          item.from = item.from ? JSON.parse(item.from) : {}
+          if (this.symbolList.indexOf(item.from.symbol) === -1 && !this.productDataObj[item.from.symbol]) {
+            symbolList.push(item.from.symbol)
+            this.symbolList.push(item.from.symbol)
+          }
+        })
+        bus.$emit("alterProductData", {
+          getData: symbolList
+        });
+        if (this.pageNum == 1) {
+          this.list = list;
+        } else {
+          this.list = this.list.concat(list);
+        }
+        this.loading = false;
+        if (res.endRow == res.total) {
+          this.finished = true;
+        }
+      })
     }
   }
 }

+ 35 - 12
src/view/copyTrade/profitDetails/index.vue

@@ -23,7 +23,7 @@
           {{ $t('follow.l70') }}
         </div>
         <div class="right">
-          123
+          {{ info.count }}
         </div>
       </div>
       <div class="cell">
@@ -32,7 +32,7 @@
           {{ $t('follow.l1') }}
         </div>
         <div class="right">
-          99,542.39 USD
+          {{ $numToThousand(expertInfo.profit) }} USD
         </div>
       </div>
       <div class="cell">
@@ -41,7 +41,7 @@
           {{ $t('follow.l72') }}
         </div>
         <div class="right">
-          99
+          {{ expertInfo.count }}
         </div>
       </div>
       <div class="cell">
@@ -50,7 +50,7 @@
           {{ $t('follow.l128') }}
         </div>
         <div class="right">
-          99,542.39 USD
+          {{ $numToThousand($bigDecimal.add(expertInfo.bonus, expertInfo.balance)) }} USD
         </div>
       </div>
       <div class="cell">
@@ -59,7 +59,7 @@
           {{ $t('follow.l129') }}
         </div>
         <div class="right">
-          99,542.39 USD
+          {{ $numToThousand(expertInfo.bonus) }} USD
         </div>
       </div>
       <div class="cell">
@@ -68,7 +68,7 @@
           {{ $t('follow.l130') }}
         </div>
         <div class="right">
-          99,542.39 USD
+          {{ $numToThousand(expertInfo.balance) }} USD
         </div>
       </div>
     </div>
@@ -79,10 +79,10 @@
           {{ $t('follow.l118') }}
         </div>
       </div>
-      <listView />
+      <listView ref="list" />
     </div>
     <van-popup v-model="settlementPop" round position="bottom">
-      <settlement @cancel="settlementPop = false" />
+      <settlement @back="settlementBack" @cancel="settlementPop = false" />
     </van-popup>
   </div>
 </template>
@@ -91,6 +91,8 @@ import settlement from "@/view/copyTrade/myCopy/components/settlement.vue";
 import BackBar1 from '@/components/backBar1'
 import listView from "./components/list.vue";
 import shareIcon1 from "@/components/shareIcon1";
+import { mapGetters } from "vuex";
+import { getExpertList } from "@/api/copy";
 export default {
   components: {
     BackBar1,
@@ -100,7 +102,31 @@ export default {
   },
   data () {
     return {
-      settlementPop: false
+      settlementPop: false,
+      info: {}
+    }
+  },
+  computed: {
+    ...mapGetters(['expertInfo']),
+  },
+  created () {
+    this.$store.dispatch('getExpertInfo').then(() => {
+      this.getExpertList()
+    })
+  },
+  methods: {
+    getExpertList() {
+      getExpertList({
+        eid: this.expertInfo.eid
+      }).then(res => {
+        var list = res.list || []
+        this.info = list[0] || {}
+      }).catch(() => {})
+    },
+    settlementBack() {
+      this.settlementPop = false
+      this.$store.dispatch('getExpertInfo')
+      this.$refs['list'].reset()
     }
   }
 }
@@ -143,9 +169,6 @@ export default {
   .top {
     background-color: #fff;
     padding: 0 16px;
-    position: sticky;
-    top: 50px;
-    z-index: 4;
   }
 }
 </style>

+ 1 - 0
src/view/copyTrade/register/index.vue

@@ -212,6 +212,7 @@ export default {
       var data = {
         ...this.form,
         title: this.userInfo.im_name,
+        header: this.userInfo.head_file,
         area: this.area,
         file: JSON.stringify(this.fileList),
         product_group: JSON.stringify(this.type)

+ 68 - 13
src/view/copyTrade/tradeDetail/components/chartView.vue

@@ -10,7 +10,7 @@
           {{ cycleText[cycle] }}<i class="el-icon-caret-bottom"></i>
         </div>
       </div>
-      <lineView height="168px" :legendShow="false" :lineTitle="lineTitle" id="line1" ref="line1" />
+      <lineView height="168px" :percentage="true" :legendShow="false" :lineTitle="lineTitle" id="line1" ref="line1" />
     </div>
     <div class="section">
       <div class="box flex">
@@ -30,9 +30,11 @@
   </div>
 </template>
 <script>
+import { getExpertTradeListByDay } from "@/api/copy";
 import lineView from "@/components/charts/line.vue";
 import dateList from "./dateList.vue";
 export default {
+  props: ['market'],
   components: {
     lineView,
     dateList
@@ -48,18 +50,31 @@ export default {
       dateShow: false,
     }
   },
+  watch: {
+    market() {
+      this.getExpertTradeListByDayGroup1()
+      this.getExpertTradeListByDayGroup2()
+    }
+  },
   computed: {
     cycleText() {
       return {
-        '7': "近7天",
-        '30': "近一月",
-        '90': "近三月",
-        '180': "近半年",
+        // '7': "近7天",
+        // '30': "近一月",
+        // '90': "近三月",
+        // '180': "近半年",
+        '7': this.$t('follow.l73'),
+        '30': this.$t('follow.l74'),
+        '90': this.$t('follow.l75'),
+        '180': this.$t('follow.l76'),
       }
     }
   },
-  mounted () {
-    this.setLine1Data()
+  created () {
+    if (this.market) {
+      this.getExpertTradeListByDayGroup1()
+      this.getExpertTradeListByDayGroup2()
+    }
   },
   methods: {
     selectBack(item) {
@@ -69,12 +84,14 @@ export default {
           return
         }
         this.cycle = item
+        this.getExpertTradeListByDayGroup1()
       }
       if (this.targetIndex == 2) {
         if (this.cycle1 == item) {
           return
         }
         this.cycle1 = item
+        this.getExpertTradeListByDayGroup2()
       }
     },
     dateShowClick(index) {
@@ -82,12 +99,50 @@ export default {
       this.targetCycle = (index == 1 ? this.cycle : this.cycle1)
       this.dateShow = true
     },
-    setLine1Data() {
-      var xData = ['03-03', '03-04', '03-05', '03-06', '03-07']
-      var yData = [['12', '15', '16', '3', '40']]
-      this.$refs['line1'].setOption(xData, yData)
-      this.$refs['line2'].setOption(xData, yData)
-    }
+    getExpertTradeListByDayGroup1() {
+      var time_start = new Date().getTime()
+      var time_end = new Date()
+      time_end = time_end.setDate(time_end.getDate()-this.cycle);
+      getExpertTradeListByDay({
+        eid: this.$route.params.id,
+        time_start: time_end,
+        time_end: time_start,
+        market: this.market,
+      }).then(res => {
+        var list = (res.list || []).sort((a, b) => new Date(a.date.replace(/-/g, '/')).getTime() - new Date(b.date.replace(/-/g, '/')).getTime())
+        var xData = []
+        var yData = [[]]
+        list.forEach(item => {
+          xData.push(this.$parseTime(new Date(item.date.replace(/-/g, '/')), '{m}-{d}'))
+          yData[0].push(item.balance ? (item.profit*100/item.balance).toFixed(2) : item.profit ? 100.00 : 0.00)
+        })
+        this.$nextTick(() => {
+          this.$refs['line1'].setOption(xData, yData)
+        })
+      }).catch(() => {})
+    },
+    getExpertTradeListByDayGroup2() {
+      var time_start = new Date().getTime()
+      var time_end = new Date()
+      time_end = time_end.setDate(time_end.getDate()-this.cycle1);
+      getExpertTradeListByDay({
+        eid: this.$route.params.id,
+        time_start: time_end,
+        time_end: time_start,
+        market: this.market,
+      }).then(res => {
+        var list = (res.list || []).sort((a, b) => new Date(a.date.replace(/-/g, '/')).getTime() - new Date(b.date.replace(/-/g, '/')).getTime())
+        var xData = []
+        var yData = [[]]
+        list.forEach(item => {
+          xData.push(this.$parseTime(new Date(item.date.replace(/-/g, '/')), '{m}-{d}'))
+          yData[0].push(item.profit)
+        })
+        this.$nextTick(() => {
+          this.$refs['line2'].setOption(xData, yData)
+        })
+      }).catch(() => {})
+    },
   }
 }
 </script>

+ 10 - 9
src/view/copyTrade/tradeDetail/components/dataView.vue

@@ -6,10 +6,10 @@
           <!-- 成交 -->
           {{ $t('follow.l68') }}
         </div>
-        <div class="filter" @click="dateShow = true">
-          <!-- 全部 -->
+        <!-- <div class="filter" @click="dateShow = true">
+          全部
           {{ cycleText[cycle] || $t('inform.l21') }}<i class="el-icon-caret-bottom"></i>
-        </div>
+        </div> -->
       </div>
       <div class="cell">
         <div class="lab">
@@ -17,7 +17,7 @@
           {{ $t('follow.l7') }}
         </div>
         <div class="right">
-          +3,326.24%
+          {{ expertAccountInfo.balance ? (expertAccountInfo.profit * 100 / expertAccountInfo.balance).toFixed(2) : expertAccountInfo.profit ? '100.00' : '0.00' }}%
         </div>
       </div>
       <div class="cell">
@@ -26,7 +26,7 @@
           {{ $t('follow.l69') }}
         </div>
         <div class="right">
-          62.37%
+          --
         </div>
       </div>
       <div class="cell">
@@ -35,7 +35,7 @@
           {{ $t('follow.l70') }}
         </div>
         <div class="right">
-          1234
+          {{ info.count }}
         </div>
       </div>
       <div class="cell">
@@ -44,7 +44,7 @@
           {{ $t('follow.l8') }}
         </div>
         <div class="right">
-          99,542.39 USD
+          {{ $numToThousand(expertAccountInfo.profit) }} USD
         </div>
       </div>
       <div class="cell">
@@ -53,7 +53,7 @@
           {{ $t('follow.l71') }}
         </div>
         <div class="right">
-          92.73%
+          {{ expertAccountInfo.count ? (expertAccountInfo.success * 100 / expertAccountInfo.count).toFixed(2) : expertAccountInfo.success ? '100.00' : '0.00' }}%
         </div>
       </div>
       <div class="cell">
@@ -62,7 +62,7 @@
           {{ $t('follow.l72') }}
         </div>
         <div class="right">
-          389
+          {{ expertAccountInfo.count }}
         </div>
       </div>
     </div>
@@ -74,6 +74,7 @@
 <script>
 import dateList from "./dateList.vue";
 export default {
+  props: ['expertAccountInfo', 'info'],
   components: {
     dateList
   },

+ 45 - 11
src/view/copyTrade/tradeDetail/index.vue

@@ -52,21 +52,21 @@
       <div class="box2">
         <van-row>
           <van-col span="8">
-            <div>319,873.36</div>
+            <div>{{ $numToThousand(expertAccountInfo.balance) }}</div>
             <div class="label">
               <!-- 总资产(USD) -->
               {{ $t('account.l') }}(USD)
             </div>
           </van-col>
           <van-col span="8" class="center">
-            <div>319</div>
+            <div>{{ expertAccountInfo.count }}</div>
             <div class="label">
               <!-- 总笔数 -->
               {{ $t('follow.l61') }}
             </div>
           </van-col>
           <van-col span="8" class="text-right">
-            <div>{{getDay(expertInfo.insert_datetime)}}</div>
+            <div>{{getDay(expertAccountInfo.insert_datetime) || '--'}}</div>
             <div class="label">
               <!-- 加入时间(天) -->
               {{ $t('follow.l62') }}({{ $t('option.l18') }})
@@ -75,14 +75,14 @@
         </van-row>
         <van-row>
           <van-col span="8">
-            <div>319,873.36</div>
+            <div>{{ getcount(expertAccountInfo.count, expertAccountInfo.insert_datetime) }}</div>
             <div class="label">
               <!-- 交易频率(笔/天) -->
               {{ $t('follow.l63') }}({{ $t('follow.l64') }}/{{ $t('option.l18') }})
             </div>
           </van-col>
           <van-col span="8" class="center">
-            <div>{{expertInfo.ratio}}%</div>
+            <div>{{expertInfo.bonus_ratio ? $bigDecimal.multiply(expertInfo.bonus_ratio, 100) : '--'}}%</div>
             <div class="label">
               <!-- 分润比例 -->
               {{ $t('follow.l26') }}
@@ -92,7 +92,7 @@
       </div>
     </div>
     <div class="conatiner1">
-      <div class="tabbar1 flex">
+      <div class="tabbar1 flex" :class="{app: appFlag}">
         <div class="bar" :class="{active: tab == '1'}" @click="tab = '1'">
           <!-- 图表 -->
           {{ $t('exchange.l6') }}
@@ -114,9 +114,9 @@
           <div class="line"></div>
         </div>
       </div>
-      <chartView v-if="tab == '1'" />
-      <dataView v-if="tab == '2'" />
-      <orderView v-if="tab == '3'" />
+      <chartView v-if="tab == '1'" :market="market ? (marketTag[market] || 'CFD') : ''" />
+      <dataView :info="expertInfo" :expertAccountInfo="expertAccountInfo" :market="marketTag[market] || 'CFD'" v-if="tab == '2'" />
+      <orderView :market="marketTag[market] || 'CFD'" v-if="tab == '3'" />
       <followers v-if="tab == '4'" />
     </div>
     <div class="fixed" v-if="followIdList.indexOf(id) === -1 && userInfo.uid != id">
@@ -134,7 +134,7 @@ import orderView from "./orderView";
 import followers from "./components/followers.vue";
 import BackBar1 from '@/components/backBar1'
 import shareIcon1 from "@/components/shareIcon1";
-import { getExpertList } from "@/api/copy";
+import { getExpertList, getExpertAccountList } from "@/api/copy";
 import { mapGetters } from "vuex";
 export default {
   components: {
@@ -150,11 +150,28 @@ export default {
       market: '',
       tab: '1',
       expertInfo: {},
+      expertAccountList: [],
       id: '',
     }
   },
   computed: {
     ...mapGetters(['followList', 'followLevelNumber', 'followLevelRate', 'followLevelName']),
+    expertAccountInfo() {
+      var info = {}
+      this.expertAccountList.forEach((item) => {
+        if (item.market == (this.marketTag[this.market] || 'CFD')) {
+          info = item
+        }
+      })
+      return info
+    },
+    marketTag() {
+      return {
+        "US": 'US',
+        "HK": 'HK',
+        "CN": 'CN',
+      }
+    },
     followingList() {
       return this.followList.filter(item => item.status == 1)
     },
@@ -194,6 +211,7 @@ export default {
   created () {
     this.id = this.$route.params.id
     this.getExpertList()
+    this.getExpertAccountList()
     if (this.isLogin) {
       this.$store.dispatch('getFollowList')
     }
@@ -212,9 +230,22 @@ export default {
         })
       }).catch(() => {})
     },
+    getExpertAccountList() {
+      getExpertAccountList({
+        eid: this.id
+      }).then(res => {
+        this.expertAccountList = res.list || []
+      }).catch(() => {})
+    },
+    getcount(count, time) {
+      if (!count || !time) {
+        return 0
+      }
+      return (count/this.getDay(time)).toFixed(2)
+    },
     getDay(time) {
       if(!time) {
-        return '--'
+        return 0
       }
       var timeDifference = new Date() - new Date(time.replace(' ', 'T') + '+08:00')
       var day = Math.ceil(timeDifference / (1000 * 60 * 60 * 24))
@@ -333,6 +364,9 @@ export default {
   flex-wrap: nowrap;
   overflow-x: auto;
   background-color: #fff;
+  &.app {
+    top: 0;
+  }
   &::-webkit-scrollbar {
     display: none;
   }

+ 8 - 0
src/view/copyTrade/tradeDetail/orderView/components/historyList.vue

@@ -57,6 +57,7 @@
 import { getExpertTradeList } from "@/api/copy";
 import bus from '@/utils/bus'
 export default {
+  props: ['market'],
   inject: ['getproductDataObj'],
   data () {
     return {
@@ -69,6 +70,12 @@ export default {
       id: '',
     }
   },
+  watch: {
+    market() {
+      this.pageNum = 0
+      this.onLoad()
+    }
+  },
   computed: {
     productDataObj() {
       return this.getproductDataObj()
@@ -91,6 +98,7 @@ export default {
         status: 2,
         pageNum: this.pageNum,
         pageSize: this.pageSize,
+        market: this.market
       }).then(res => {
         var list = res.list || [];
         var symbolList = []

+ 7 - 0
src/view/copyTrade/tradeDetail/orderView/components/openList.vue

@@ -49,6 +49,7 @@
 import { getExpertTradeList } from "@/api/copy";
 import bus from '@/utils/bus'
 export default {
+  props: ['market'],
   inject: ['getproductDataObj'],
   data () {
     return {
@@ -63,6 +64,11 @@ export default {
       return this.getproductDataObj()
     },
   },
+  watch: {
+    market() {
+      this.getExpertTradeList()
+    }
+  },
   created () {
     this.id = this.$route.params.id
     this.getExpertTradeList()
@@ -73,6 +79,7 @@ export default {
       getExpertTradeList({
         eid: this.id,
         status: 1,
+        market: this.market,
       }).then(res => {
         var list = res.list || [];
         var symbolList = []

+ 3 - 2
src/view/copyTrade/tradeDetail/orderView/index.vue

@@ -10,14 +10,15 @@
         {{ $t('follow.l80') }}
       </div>
     </div>
-    <historyList v-if="type == 1" />
-    <openList v-if="type == 2" />
+    <historyList :market="market" v-if="type == 1" />
+    <openList :market="market" v-if="type == 2" />
   </div>
 </template>
 <script>
 import openList from "./components/openList.vue";
 import historyList from "./components/historyList.vue";
 export default {
+  props: ['market'],
   components: {
     openList,
     historyList

+ 1 - 0
src/view/joinApply/index.vue

@@ -135,6 +135,7 @@ export default {
       status: '',
       type: 'X',
       fileList: [],
+      fullscreenLoading: false,
       typeList: [
         {
           name: 'X',

+ 2 - 2
src/view/landing/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="page" v-if="loaded":class="{'en': language != 'zh-CN' && language != 'zh-TW'}">
+  <div class="page" v-if="loaded" :class="{'en': language != 'zh-CN' && language != 'zh-TW'}">
     <header class="header flex">
       <div class="left">
         <div class="logo-box flex">
@@ -848,9 +848,9 @@ export default {
       if (this.language == lan) {
         return
       }
+      this.$i18n.locale = lan
       this.$store.commit('setLang', lan)
       bus.$emit('selectLang')
-      this.$i18n.locale = lan
       setVantLang(lan)
       this.$store.commit('CHANGE_META_INFO', {
         title: this.$t('html.title'),

+ 1 - 1
src/view/market/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div class="tabs flex">
+    <div class="tabs flex" v-if="!appFlag">
       <van-tabs line-width="12px" line-height="2px" :ellipsis="false" v-model="activeName" @change="tabChange" animated swipeable>
         <van-tab :name="item.code" v-for="(item, index) in tabList" :key="index" :title="tabName[item.title]">
         </van-tab>

+ 1 - 1
src/view/market/stock/index.vue

@@ -23,7 +23,7 @@
         <div class="line"></div>
       </div>
     </div>
-    <marketList :key="market":swipeList="swipeList" :market="market"/>
+    <marketList :key="market" :swipeList="swipeList" :market="market"/>
   </div>
 </template>
 <script>

+ 2 - 1
src/view/productDetail/option/components/inquiry.vue

@@ -151,7 +151,8 @@ export default {
       standard: [],
       amount: '1',
       account: '',
-      checked: false
+      checked: false,
+      fullscreenLoading: false,
     }
   },
   methods: {

+ 2 - 1
src/view/workOrderAdd/index.vue

@@ -83,7 +83,8 @@ export default {
       type: 1,
       content: '',
       title: '',
-      file: ''
+      file: '',
+      fullscreenLoading: false
     }
   },
   methods: {