@jx3box/jx3box-editor 2.2.48 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/config/global.js +79 -0
  2. package/config/global.less +16 -0
  3. package/index.js +21 -8
  4. package/package.json +64 -63
  5. package/readme.md +25 -99
  6. package/src/Article.vue +96 -57
  7. package/src/ArticleMarkdown.vue +54 -47
  8. package/src/BoxResource.vue +67 -42
  9. package/src/Buff.vue +18 -7
  10. package/src/GameText.vue +32 -45
  11. package/src/Item.vue +143 -235
  12. package/src/ItemSimple.vue +27 -37
  13. package/src/Markdown.vue +362 -210
  14. package/src/Npc.vue +51 -30
  15. package/src/Resource.vue +296 -252
  16. package/src/Skill.vue +36 -26
  17. package/src/Tinymce.vue +124 -137
  18. package/src/Upload.vue +238 -155
  19. package/src/UploadAlbum.vue +189 -118
  20. package/{assets → src/assets}/css/article.less +1 -0
  21. package/src/assets/css/markdown.less +4 -0
  22. package/{assets → src/assets}/css/module/author.less +4 -3
  23. package/{assets → src/assets}/css/module/directory.less +23 -32
  24. package/{assets → src/assets}/css/module/talent.less +2 -2
  25. package/{assets → src/assets}/css/resource.less +56 -22
  26. package/src/assets/css/tinymce/_.less +28 -0
  27. package/src/assets/css/tinymce/a.less +21 -0
  28. package/{assets → src/assets}/css/tinymce/code.less +1 -1
  29. package/{assets/css → src/assets/css/tinymce}/combo.less +123 -18
  30. package/{assets → src/assets}/css/tinymce/fold.less +3 -6
  31. package/src/assets/css/tinymce/h.less +90 -0
  32. package/{assets → src/assets}/css/tinymce/latex.less +14 -14
  33. package/{assets → src/assets}/css/tinymce/macro.less +3 -3
  34. package/{assets → src/assets}/css/tinymce/pz.less +2 -2
  35. package/{assets → src/assets}/css/tinymce/table.less +5 -10
  36. package/{assets → src/assets}/css/tinymce.less +8 -4
  37. package/src/assets/css/upload.less +195 -0
  38. package/src/assets/css/upload_album.less +164 -0
  39. package/src/assets/css/var.less +2 -0
  40. package/src/assets/img/other/qr-code.svg +1 -0
  41. package/{assets → src/assets}/js/audio.js +2 -2
  42. package/{assets → src/assets}/js/directory.js +51 -23
  43. package/src/assets/js/hljs_languages.js +177 -0
  44. package/src/assets/js/katex.js +211 -0
  45. package/src/assets/js/renderImgPreview.js +49 -0
  46. package/{assets → src/assets}/js/xss.js +48 -5
  47. package/src/components/Author.vue +32 -13
  48. package/src/components/Avatar.vue +22 -3
  49. package/src/components/Combo.vue +118 -72
  50. package/src/components/PostAuthor.vue +13 -11
  51. package/src/components/QRcode.vue +136 -0
  52. package/src/components/SkillMartial.vue +13 -12
  53. package/src/pages/article.js +14 -0
  54. package/src/pages/index.js +5 -0
  55. package/src/pages/markdown.js +14 -0
  56. package/src/pages/tinymce.js +49 -0
  57. package/src/pages/upload.js +14 -0
  58. package/{service → src/service}/author.js +2 -2
  59. package/{service → src/service}/cms.js +5 -3
  60. package/{service → src/service}/database.js +4 -2
  61. package/{service → src/service}/item.js +1 -1
  62. package/{service → src/service}/node.js +1 -1
  63. package/{service → src/service}/resource.js +1 -1
  64. package/src/views/article.vue +72 -0
  65. package/src/views/index.vue +11 -0
  66. package/src/views/markdown.vue +58 -0
  67. package/src/views/tinymce.vue +58 -0
  68. package/src/views/upload.vue +111 -0
  69. package/.env +0 -2
  70. package/.vscode/settings.json +0 -5
  71. package/assets/css/katex-fix.css +0 -20
  72. package/assets/css/tinymce/_.less +0 -30
  73. package/assets/css/tinymce/a.less +0 -30
  74. package/assets/css/tinymce/combo.less +0 -111
  75. package/assets/css/tinymce/h.less +0 -58
  76. package/assets/css/upload.less +0 -105
  77. package/assets/js/katex.js +0 -191
  78. package/assets/js/renderImgPreview.js +0 -25
  79. package/babel.config.js +0 -3
  80. package/docs/markdown.md +0 -16
  81. package/jsconfig.json +0 -9
  82. package/public/article.html +0 -15
  83. package/public/css/article.css +0 -2481
  84. package/public/css/article.less +0 -3
  85. package/public/favicon.ico +0 -0
  86. package/public/tinymce.html +0 -33
  87. package/src/Equip.vue +0 -301
  88. package/src/components/LetterDemo.vue +0 -93
  89. package/src/components/medal.vue +0 -43
  90. package/test-audio.html +0 -121
  91. package/vue.config.js +0 -147
  92. /package/{assets → src/assets}/css/markdown/_.less +0 -0
  93. /package/{assets → src/assets}/css/markdown/macro.less +0 -0
  94. /package/{assets/css/article_markdown.less → src/assets/css/markdown/markdown-article.less} +0 -0
  95. /package/{assets/css/markdown.less → src/assets/css/markdown/markdown-editor.less} +0 -0
  96. /package/{assets → src/assets}/css/markdown/talent.less +0 -0
  97. /package/{assets → src/assets}/css/markdown/video.less +0 -0
  98. /package/{assets → src/assets}/css/module/buff.less +0 -0
  99. /package/{assets → src/assets}/css/module/icon.less +0 -0
  100. /package/{assets → src/assets}/css/module/item.less +0 -0
  101. /package/{assets → src/assets}/css/module/item_simple.less +0 -0
  102. /package/{assets → src/assets}/css/module/jx3_element.less +0 -0
  103. /package/{assets → src/assets}/css/module/macro.less +0 -0
  104. /package/{assets → src/assets}/css/module/npc.less +0 -0
  105. /package/{assets → src/assets}/css/module/resource.less +0 -0
  106. /package/{assets → src/assets}/css/module/skill.less +0 -0
  107. /package/{assets → src/assets}/css/tinymce/hr.less +0 -0
  108. /package/{assets → src/assets}/css/tinymce/img.less +0 -0
  109. /package/{assets → src/assets}/css/tinymce/imgpreview.less +0 -0
  110. /package/{assets → src/assets}/css/tinymce/list.less +0 -0
  111. /package/{assets → src/assets}/css/tinymce/nextpage.less +0 -0
  112. /package/{assets → src/assets}/css/tinymce/p.less +0 -0
  113. /package/{assets → src/assets}/css/tinymce/plugin.less +0 -0
  114. /package/{assets → src/assets}/css/tinymce/qixue.less +0 -0
  115. /package/{assets → src/assets}/css/tinymce/quote.less +0 -0
  116. /package/{assets → src/assets}/css/tinymce/video.less +0 -0
  117. /package/{assets → src/assets}/css/tinymce/voice.less +0 -0
  118. /package/{assets → src/assets}/data/detach_type.json +0 -0
  119. /package/{assets → src/assets}/data/game_font.json +0 -0
  120. /package/{assets → src/assets}/data/markdown_whitelist.json +0 -0
  121. /package/{assets → src/assets}/data/weapon_type.json +0 -0
  122. /package/{assets → src/assets}/img/buff.svg +0 -0
  123. /package/{assets → src/assets}/img/equip_bg.png +0 -0
  124. /package/{assets → src/assets}/img/file.svg +0 -0
  125. /package/{assets → src/assets}/img/icons.svg +0 -0
  126. /package/{assets → src/assets}/img/item/pve.png +0 -0
  127. /package/{assets → src/assets}/img/item/pvp.png +0 -0
  128. /package/{assets → src/assets}/img/item/pvx.png +0 -0
  129. /package/{assets → src/assets}/img/item/std.png +0 -0
  130. /package/{assets → src/assets}/img/item/wujie.png +0 -0
  131. /package/{assets → src/assets}/img/item.svg +0 -0
  132. /package/{assets → src/assets}/img/jx3.svg +0 -0
  133. /package/{assets → src/assets}/img/jx3box.svg +0 -0
  134. /package/{assets → src/assets}/img/npc/attack.svg +0 -0
  135. /package/{assets → src/assets}/img/npc/buff.svg +0 -0
  136. /package/{assets → src/assets}/img/npc/energy.svg +0 -0
  137. /package/{assets → src/assets}/img/npc/miss.svg +0 -0
  138. /package/{assets → src/assets}/img/npc/npc.svg +0 -0
  139. /package/{assets → src/assets}/img/npc/radar.svg +0 -0
  140. /package/{assets → src/assets}/img/npc/shield.svg +0 -0
  141. /package/{assets → src/assets}/img/npc/sight.svg +0 -0
  142. /package/{assets → src/assets}/img/npc/skull.svg +0 -0
  143. /package/{assets → src/assets}/img/npc/target.svg +0 -0
  144. /package/{assets → src/assets}/img/skill.svg +0 -0
  145. /package/{assets → src/assets}/img/skillset.png +0 -0
  146. /package/{assets → src/assets}/js/a.js +0 -0
  147. /package/{assets → src/assets}/js/code.js +0 -0
  148. /package/{assets → src/assets}/js/combo.js +0 -0
  149. /package/{assets → src/assets}/js/drag.js +0 -0
  150. /package/{assets → src/assets}/js/filter2.js +0 -0
  151. /package/{assets → src/assets}/js/fold.js +0 -0
  152. /package/{assets → src/assets}/js/gallery.js +0 -0
  153. /package/{assets → src/assets}/js/iframe.js +0 -0
  154. /package/{assets → src/assets}/js/img.js +0 -0
  155. /package/{assets → src/assets}/js/item/attribute_percent.js +0 -0
  156. /package/{assets → src/assets}/js/item/bind.js +0 -0
  157. /package/{assets → src/assets}/js/item/border.js +0 -0
  158. /package/{assets → src/assets}/js/item/border_quest.js +0 -0
  159. /package/{assets → src/assets}/js/item/color.js +0 -0
  160. /package/{assets → src/assets}/js/item/hljs_languages.js +0 -0
  161. /package/{assets → src/assets}/js/item/icon_url.js +0 -0
  162. /package/{assets → src/assets}/js/item/second_format.js +0 -0
  163. /package/{assets → src/assets}/js/jx3_element.js +0 -0
  164. /package/{assets → src/assets}/js/macro.js +0 -0
  165. /package/{assets → src/assets}/js/nextpage.js +0 -0
  166. /package/{assets → src/assets}/js/pswp.js +0 -0
  167. /package/{assets → src/assets}/js/pswp_template.js +0 -0
  168. /package/{assets → src/assets}/js/pz_iframe.js +0 -0
  169. /package/{assets → src/assets}/js/qixue.js +0 -0
  170. /package/{assets → src/assets}/js/script.js +0 -0
  171. /package/{assets → src/assets}/js/talent2.js +0 -0
  172. /package/{assets → src/assets}/js/tex-mml-chtml.js +0 -0
  173. /package/{service → src/service}/enum/CollectionPublic.js +0 -0
  174. /package/{service → src/service}/enum/EquipPosition.js +0 -0
  175. /package/{service → src/service}/enum/EquipType.js +0 -0
package/src/Item.vue CHANGED
@@ -5,100 +5,70 @@
5
5
  :class="{
6
6
  'c-item-equipment': source.AucGenre >= 1 && source.AucGenre <= 4,
7
7
  'c-item-furniture': source.AucGenre == 21,
8
- }">
8
+ }"
9
+ >
9
10
  <div class="c-item-wrapper">
10
11
  <!-- 精炼等级 -->
11
12
  <div v-if="source.MaxStrengthLevel" class="u-max-strength-level">
12
- <span
13
- v-text="`精炼等级:0 / ${source.MaxStrengthLevel}`"></span>
13
+ <span v-text="`精炼等级:0 / ${source.MaxStrengthLevel}`"></span>
14
14
  </div>
15
15
  <!-- 物品名称 -->
16
- <div
17
- class="u-title"
18
- :style="{ color: color(source.Quality) }"
19
- v-text="source.Name"></div>
16
+ <div class="u-title" :style="{ color: color(source.Quality) }" v-text="source.Name"></div>
20
17
  <!-- 装备类型 -->
21
18
  <div class="u-usage" v-if="show_equip_usage">
22
19
  <template v-if="source.EquipUsage == 1">
23
- <img
24
- class="u-label-icon"
25
- src="../assets/img/item/pve.png"
26
- alt="" />
20
+ <img class="u-label-icon" src="./assets/img/item/pve.png" alt="" />
27
21
  <span>秘境挑战</span>
28
22
  </template>
29
23
  <template v-if="source.EquipUsage == 2">
30
- <img
31
- class="u-label-icon"
32
- src="../assets/img/item/pvp.png"
33
- alt="" />
24
+ <img class="u-label-icon" src="./assets/img/item/pvp.png" alt="" />
34
25
  <span>竞技对抗</span>
35
26
  </template>
36
27
  <template v-if="source.EquipUsage == 3">
37
- <img
38
- class="u-label-icon"
39
- src="../assets/img/item/pvx.png"
40
- alt="" />
28
+ <img class="u-label-icon" src="./assets/img/item/pvx.png" alt="" />
41
29
  <span>休闲</span>
42
30
  </template>
43
31
  </div>
44
32
  <!-- 绑定状态 -->
45
- <div
46
- v-if="source.BindType > 1"
47
- class="u-bind"
48
- v-text="bind(source.BindType)"></div>
33
+ <div v-if="source.BindType > 1" class="u-bind" v-text="bind(source.BindType)"></div>
49
34
  <!-- 唯一 -->
50
- <div
51
- v-if="parseInt(source.MaxExistAmount) === 1"
52
- class="unique"
53
- v-text="'唯一'"></div>
35
+ <div v-if="parseInt(source.MaxExistAmount) === 1" class="unique" v-text="'唯一'"></div>
54
36
  <!-- 存在时间 -->
55
37
  <div
56
38
  v-if="parseInt(source.MaxExistTime) > 0"
57
39
  class="u-max-exist-time"
58
- v-text="'限时时间:' + showDuration(source.MaxExistTime)"></div>
40
+ v-text="'限时时间:' + showDuration(source.MaxExistTime)"
41
+ ></div>
59
42
  <!-- 最大拥有数 -->
60
43
  <div
61
44
  v-if="parseInt(source.MaxExistAmount) > 1"
62
45
  class="u-max-exist-amount"
63
- v-text="'最大拥有数:' + source.MaxExistAmount"></div>
46
+ v-text="'最大拥有数:' + source.MaxExistAmount"
47
+ ></div>
64
48
  <!-- 武器类别 -->
65
- <div v-if="source.AucGenre == 1" class="u-weapon-type-label"
66
- >武器</div
67
- >
68
- <div v-if="source.AucGenre == 2" class="u-weapon-type-label"
69
- >暗器</div
70
- >
49
+ <div v-if="source.AucGenre == 1" class="u-weapon-type-label">武器</div>
50
+ <div v-if="source.AucGenre == 2" class="u-weapon-type-label">暗器</div>
71
51
  <!-- 物品类型文案 -->
72
- <div
73
- v-if="source.TypeLabel"
74
- class="u-type-label"
75
- v-text="source.TypeLabel"></div>
52
+ <div v-if="source.TypeLabel" class="u-type-label" v-text="source.TypeLabel"></div>
76
53
  <!-- 装备属性 -->
77
- <div
78
- class="u-attributes"
79
- v-if="source.attributes && source.attributes.length">
54
+ <div class="u-attributes" v-if="source.attributes && source.attributes.length">
80
55
  <div
81
56
  v-for="attribute in common_attributes"
82
57
  :key="attribute.type"
83
58
  class="u-field"
84
- :class="[`u-${attribute.color}`]">
59
+ :class="[`u-${attribute.color}`]"
60
+ >
85
61
  <span
86
62
  v-if="
87
63
  attribute.type == 'atMeleeWeaponAttackSpeedBase' ||
88
64
  attribute.type == 'atRangeWeaponAttackSpeedBase'
89
65
  "
90
66
  class="u-value u-speed"
91
- v-text="attribute.label"></span>
92
- <span
93
- v-else-if="attribute.type == 'atHorseAttribute'"
94
- class="u-value u-horse-attribute">
95
- <img
96
- v-if="attribute.icon_id > 0"
97
- class="u-horse-icon"
98
- :src="iconLink(attribute.icon_id)" />
99
- <div
100
- class="u-horse-desc"
101
- v-html="attribute.label"></div>
67
+ v-text="attribute.label"
68
+ ></span>
69
+ <span v-else-if="attribute.type == 'atHorseAttribute'" class="u-value u-horse-attribute">
70
+ <img v-if="attribute.icon_id > 0" class="u-horse-icon" :src="iconLink(attribute.icon_id)" />
71
+ <div class="u-horse-desc" v-html="attribute.label"></div>
102
72
  </span>
103
73
  <span v-else class="u-value">
104
74
  <game-text :text="attribute.label"></game-text>
@@ -106,57 +76,38 @@
106
76
  </div>
107
77
  <template v-if="orange_std_attribute.length > 0">
108
78
  <div class="u-spec-attribute-title u-yellow">
109
- <img
110
- class="u-label-icon"
111
- src="../assets/img/item/std.png" />
79
+ <img class="u-label-icon" src="./assets/img/item/std.png" />
112
80
  <span>特殊属性效果</span>
113
81
  </div>
114
82
  <div
115
83
  class="u-value u-spec-attribute"
116
84
  v-for="attribute in orange_std_attribute"
117
- :key="attribute.label">
85
+ :key="attribute.label"
86
+ >
118
87
  <game-text :text="attribute.label"></game-text>
119
88
  </div>
120
89
  </template>
121
90
  <template v-if="orange_wujie_attribute.length > 0">
122
91
  <div class="u-spec-attribute-title u-yellow">
123
- <img
124
- class="u-label-icon"
125
- src="../assets/img/item/wujie.png" />
92
+ <img class="u-label-icon" src="./assets/img/item/wujie.png" />
126
93
  <span>特殊属性效果</span>
127
94
  </div>
128
- <div
129
- class="u-value u-spec-attribute"
130
- v-for="(attribute, key) in orange_wujie_attribute"
131
- :key="key">
95
+ <div class="u-value u-spec-attribute" v-for="(attribute, key) in orange_wujie_attribute" :key="key">
132
96
  <game-text :text="attribute.label"></game-text>
133
97
  </div>
134
- <div class="u-value u-spec-attribute u-orange"
135
- >属性效果双端一致</div
136
- >
98
+ <div class="u-value u-spec-attribute u-orange">属性效果双端一致</div>
137
99
  </template>
138
100
  </div>
139
101
  <!-- 家具属性 -->
140
- <div
141
- class="u-furniture-attributes"
142
- v-if="source.furniture_attributes">
143
- <div
144
- class="u-field u-green"
145
- v-if="source.furniture_attributes.record">
146
- <span
147
- class="u-value"
148
- v-text="
149
- `装修评分:${source.furniture_attributes.record}`
150
- "></span>
102
+ <div class="u-furniture-attributes" v-if="source.furniture_attributes">
103
+ <div class="u-field u-green" v-if="source.furniture_attributes.record">
104
+ <span class="u-value" v-text="`装修评分:${source.furniture_attributes.record}`"></span>
151
105
  </div>
152
106
  </div>
153
107
  <!-- 镶嵌 -->
154
108
  <ul v-if="source.Diamonds" class="u-diamonds u-gray">
155
109
  <!-- 五行石 -->
156
- <li
157
- class="u-diamond"
158
- v-for="(label, key) in source.Diamonds"
159
- :key="key">
110
+ <li class="u-diamond" v-for="(label, key) in source.Diamonds" :key="key">
160
111
  <span class="u-square"></span>
161
112
  <span class="u-text" v-text="`镶嵌孔:${label}`"></span>
162
113
  </li>
@@ -167,170 +118,116 @@
167
118
  </li>
168
119
  </ul>
169
120
  <!-- 仅性别可穿戴 -->
170
- <div
171
- v-if="source.Requires && source.Requires[7]"
172
- class="u-require-sex"
173
- v-text="source.Requires[7]"></div>
121
+ <div v-if="source.Requires && source.Requires[7]" class="u-require-sex" v-text="source.Requires[7]"></div>
174
122
  <!-- 需要门派 -->
175
123
  <div
176
124
  v-if="source.Requires && source.Requires[6]"
177
125
  class="u-require-school"
178
- v-text="source.Requires[6]"></div>
126
+ v-text="source.Requires[6]"
127
+ ></div>
179
128
  <!-- 需要等级 -->
180
- <div
181
- v-if="source.Requires && source.Requires[5]"
182
- class="u-require-level"
183
- v-text="source.Requires[5]"></div>
129
+ <div v-if="source.Requires && source.Requires[5]" class="u-require-level" v-text="source.Requires[5]"></div>
184
130
  <!-- 需要阵营 -->
185
131
  <div
186
132
  v-if="source.Requires && source.Requires[100]"
187
133
  class="u-require-camp"
188
- v-text="source.Requires[100]"></div>
134
+ v-text="source.Requires[100]"
135
+ ></div>
189
136
  <!-- 需求宅邸等级 -->
190
137
  <div
191
138
  v-if="source.Requires && source.Requires[101]"
192
139
  class="u-require-homeland-level"
193
- v-text="source.Requires[101]"></div>
140
+ v-text="source.Requires[101]"
141
+ ></div>
194
142
  <!-- 最大耐久度 -->
195
143
  <div
196
- v-if="
197
- source.AucGenre >= 1 &&
198
- source.AucGenre <= 3 &&
199
- source.MaxDurability
200
- "
144
+ v-if="source.AucGenre >= 1 && source.AucGenre <= 3 && source.MaxDurability"
201
145
  class="u-max-durability"
202
- v-text="'最大耐久度' + source.MaxDurability"></div>
146
+ v-text="'最大耐久度' + source.MaxDurability"
147
+ ></div>
203
148
  <!-- 套装信息 -->
204
149
  <div v-if="source.Set" class="u-set">
205
150
  <br />
206
- <div
207
- class="u-yellow"
208
- v-text="
209
- `${source.Set.name}(1/${source.Set.siblings.length})`
210
- "></div>
151
+ <div class="u-yellow" v-text="`${source.Set.name}(1/${source.Set.siblings.length})`"></div>
211
152
  <ul class="u-set-siblings u-gray">
212
153
  <li
213
154
  v-for="(sibling, key) in source.Set.siblings"
214
155
  :key="key"
215
156
  :class="{
216
- 'u-yellow':
217
- sibling &&
218
- (sibling == source.Name ||
219
- sibling.includes(source.Name)),
220
- }">
157
+ 'u-yellow': sibling && (sibling == source.Name || sibling.includes(source.Name)),
158
+ }"
159
+ >
221
160
  {{
222
161
  sibling
223
162
  .split("/")
224
- .map(s => s.trim())
163
+ .map((s) => s.trim())
225
164
  .sort((a, b) => a.localeCompare(b))
226
165
  .join(" / ")
227
- }}</li
228
- >
166
+ }}
167
+ </li>
229
168
  </ul>
230
169
  <br />
231
170
  <ul class="u-set-attributes u-gray">
232
- <li
233
- v-for="(attribute, key) in source.Set.attributes"
234
- :key="key">
171
+ <li v-for="(attribute, key) in source.Set.attributes" :key="key">
235
172
  <span>{{ `[${key}]` }}</span>
236
- <game-text
237
- :client="client"
238
- :text="attribute"
239
- :ignore-color="true"></game-text>
173
+ <game-text :client="client" :text="attribute" :ignore-color="true"></game-text>
240
174
  </li>
241
175
  </ul>
242
176
  <br />
243
177
  </div>
244
178
  <!-- 图片 -->
245
179
  <div class="u-image-url" v-if="source.ImageUrl">
246
- <img
247
- :src="source.ImageUrl"
248
- @error.once="source.ImageUrl = null" />
180
+ <img :src="source.ImageUrl" @error.once="handleImageError" />
249
181
  </div>
250
182
  <!-- 描述 -->
251
183
  <p v-if="source.Desc" class="u-desc u-yellow">
252
184
  <game-text :client="client" :text="source.Desc"></game-text>
253
185
  </p>
254
186
  <!-- 五彩石属性 -->
255
- <p
256
- v-if="source.WuCaiHtml"
257
- class="u-desc"
258
- v-html="source.WuCaiHtml"></p>
187
+ <p v-if="source.WuCaiHtml" class="u-desc" v-html="source.WuCaiHtml"></p>
259
188
  <!-- 品质等级 -->
260
- <div
261
- v-if="source.Level"
262
- class="u-level u-yellow"
263
- v-text="'品质等级' + source.Level"></div>
189
+ <div v-if="source.Level" class="u-level u-yellow" v-text="'品质等级' + source.Level"></div>
264
190
  <!-- 装备分数 -->
265
191
  <div
266
192
  v-if="Number(source.EquipmentRating)"
267
193
  class="u-equipment-rating u-orange"
268
- v-text="'装备分数' + source.EquipmentRating"></div>
194
+ v-text="'装备分数' + source.EquipmentRating"
195
+ ></div>
269
196
  <!-- 推荐门派心法 -->
270
- <div
271
- v-if="source.Recommend"
272
- class="u-equipment-recommend"
273
- v-text="'推荐门派:' + source.Recommend"></div>
197
+ <div v-if="source.Recommend" class="u-equipment-recommend" v-text="'推荐门派:' + source.Recommend"></div>
274
198
  <!-- 冷却时间 -->
275
199
  <div
276
200
  v-if="source.CoolDown"
277
201
  class="u-equipment-recommend"
278
- v-text="'使用间隔' + second_format(source.CoolDown)"></div>
202
+ v-text="'使用间隔' + second_format(source.CoolDown)"
203
+ ></div>
279
204
  <!-- 外观名称 -->
280
- <div
281
- v-if="source.Appearance"
282
- class="u-appearance"
283
- v-text="'外观名称:' + source.Appearance"></div>
205
+ <div v-if="source.Appearance" class="u-appearance" v-text="'外观名称:' + source.Appearance"></div>
284
206
  <!-- 可收集门派 -->
285
- <div
286
- v-if="source.CanExterior"
287
- class="u-can-exterior"
288
- v-text="'外观:' + source.CanExterior"></div>
207
+ <div v-if="source.CanExterior" class="u-can-exterior" v-text="'外观:' + source.CanExterior"></div>
289
208
  <!-- 储物箱共享 -->
290
- <div
291
- v-if="
292
- source.CanShared &&
293
- !(source.AucGenre >= 1 && source.AucGenre <= 4)
294
- "
295
- class="u-can-shared"
296
- >该物品可以放入账号储物箱共享。</div
297
- >
298
- <div
299
- v-if="
300
- source.CanShared &&
301
- source.AucGenre >= 1 &&
302
- source.AucGenre <= 4
303
- "
304
- class="u-can-shared"
305
- >该装备未精炼、镶嵌、附魔、穿戴前可以放入账号储物箱共享。</div
306
- >
209
+ <div v-if="source.CanShared && !(source.AucGenre >= 1 && source.AucGenre <= 4)" class="u-can-shared">
210
+ 该物品可以放入账号储物箱共享。
211
+ </div>
212
+ <div v-if="source.CanShared && source.AucGenre >= 1 && source.AucGenre <= 4" class="u-can-shared">
213
+ 该装备未精炼、镶嵌、附魔、穿戴前可以放入账号储物箱共享。
214
+ </div>
307
215
  <!-- 家具可交互可缩放 -->
308
216
  <div v-if="source.furniture_attributes" class="u-furniture-can">
309
217
  <span v-if="source.furniture_attributes.interact">可交互</span>
310
218
  <span
311
219
  v-if="source.furniture_attributes.scale_range"
312
- v-text="
313
- `可缩放(${source.furniture_attributes.scale_range.replace(
314
- ';',
315
- ' - '
316
- )}倍)`
317
- "></span>
220
+ v-text="`可缩放(${source.furniture_attributes.scale_range.replace(';', ' - ')}倍)`"
221
+ ></span>
318
222
  </div>
319
223
  <!-- 物品来源 -->
320
224
  <div v-if="source.GetSource" class="u-get-source">
321
225
  <span class="u-get-source-header">获取途径:</span>
322
- <div
323
- class="u-get-source-list"
324
- v-for="source in source.GetSource"
325
- :key="source.label">
226
+ <div class="u-get-source-list" v-for="source in source.GetSource" :key="source.label">
326
227
  <span class="u-get-source-type"> {{ source.label }} </span>
327
228
  <template v-if="source.children">
328
- <div
329
- v-for="child in source.children"
330
- :key="child.label || child">
331
- <span
332
- class="u-get-source-child"
333
- v-if="typeof child === 'string'">
229
+ <div v-for="child in source.children" :key="child.label || child">
230
+ <span class="u-get-source-child" v-if="typeof child === 'string'">
334
231
  {{ child }}
335
232
  </span>
336
233
  <span
@@ -338,40 +235,36 @@
338
235
  v-else-if="child.label"
339
236
  @click="onClickSource(child)"
340
237
  :style="sourceStyle(child)"
341
- :class="{ 'is-link': child.app && child.id }">
238
+ :class="{ 'is-link': child.app && child.id }"
239
+ >
342
240
  {{ sourceLabel(child) }}
343
241
  </span>
344
242
  </div>
345
243
  </template>
346
244
  </div>
347
245
  </div>
246
+ <div v-else-if="source.GetType" class="u-get-type" v-text="`物品来源:${source.GetType}`"></div>
348
247
  <div
349
- v-else-if="source.GetType"
248
+ v-if="source.furniture_attributes && source.furniture_attributes.limit"
350
249
  class="u-get-type"
351
- v-text="`物品来源:${source.GetType}`"></div>
352
- <div
353
- v-if="
354
- source.furniture_attributes &&
355
- source.furniture_attributes.limit
356
- "
357
- class="u-get-type"
358
- v-text="`摆放上限:${source.furniture_attributes.limit}`"></div>
250
+ v-text="`摆放上限:${source.furniture_attributes.limit}`"
251
+ ></div>
359
252
  </div>
360
253
  </div>
361
254
  </template>
362
255
 
363
256
  <script>
364
- import { get_item } from "../service/item.js";
257
+ import { get_item } from "./service/item.js";
365
258
  import { getLink } from "@jx3box/jx3box-common/js/utils.js";
366
259
 
367
260
  import GameText from "./GameText.vue";
368
261
 
369
- import attribute_percent from "../assets/js/item/attribute_percent.js";
370
- import bind from "../assets/js/item/bind.js";
371
- import color from "../assets/js/item/color.js";
262
+ import attribute_percent from "./assets/js/item/attribute_percent.js";
263
+ import bind from "./assets/js/item/bind.js";
264
+ import color from "./assets/js/item/color.js";
372
265
  import { iconLink } from "@jx3box/jx3box-common/js/utils";
373
266
 
374
- import second_format from "../assets/js/item/second_format.js";
267
+ import second_format from "./assets/js/item/second_format.js";
375
268
  import dayjs from "dayjs";
376
269
  import duration from "dayjs/plugin/duration";
377
270
  dayjs.extend(duration);
@@ -395,6 +288,7 @@ export default {
395
288
  data() {
396
289
  return {
397
290
  source: null,
291
+ requestVersion: 0,
398
292
  };
399
293
  },
400
294
  components: {
@@ -415,32 +309,27 @@ export default {
415
309
  final_client: function () {
416
310
  return this.client || this.client_by_id;
417
311
  },
312
+ fetch_params: function () {
313
+ return [this.item_id, this.final_client];
314
+ },
418
315
  cache_key: function () {
419
316
  return `item-${this.final_client}-${this.item_id}`;
420
317
  },
421
318
  // 是否展示装备类型
422
319
  show_equip_usage() {
423
- if (Number(this.source?.AucGenre) === 1 && this.source.Quality > 4)
424
- return false;
320
+ if (Number(this.source?.AucGenre) === 1 && this.source.Quality > 4) return false;
425
321
  if ([1, 2, 3].includes(Number(this.source?.AucGenre))) return true;
426
- if (this.source?.AucGenre == 4 && this.source?.AucSubType < 4)
427
- return true;
322
+ if (this.source?.AucGenre == 4 && this.source?.AucSubType < 4) return true;
428
323
  return false;
429
324
  },
430
325
  common_attributes() {
431
- return this.source?.attributes?.filter(
432
- item => item.color != "orange"
433
- );
326
+ return this.source?.attributes?.filter((item) => item.color != "orange");
434
327
  },
435
328
  orange_std_attribute() {
436
- return this.source?.attributes?.filter(
437
- item => item.color == "orange" && !item.is_mobile
438
- );
329
+ return this.source?.attributes?.filter((item) => item.color == "orange" && !item.is_mobile);
439
330
  },
440
331
  orange_wujie_attribute() {
441
- return this.source?.attributes?.filter(
442
- item => item.color == "orange" && item.is_mobile
443
- );
332
+ return this.source?.attributes?.filter((item) => item.color == "orange" && item.is_mobile);
444
333
  },
445
334
  },
446
335
  methods: {
@@ -464,6 +353,16 @@ export default {
464
353
  window.open(link, "_blank");
465
354
  }
466
355
  },
356
+ cloneSource(item) {
357
+ return item ? { ...item } : item;
358
+ },
359
+ handleImageError() {
360
+ if (!this.source) return;
361
+ this.source = {
362
+ ...this.source,
363
+ ImageUrl: null,
364
+ };
365
+ },
467
366
  iconLink: function (id) {
468
367
  return iconLink(id, this.final_client);
469
368
  },
@@ -483,41 +382,50 @@ export default {
483
382
  item: {
484
383
  immediate: true,
485
384
  handler() {
486
- if (typeof this.item !== "undefined") this.source = this.item;
385
+ if (typeof this.item !== "undefined") {
386
+ this.source = this.cloneSource(this.item);
387
+ }
487
388
  },
488
389
  },
489
- item_id: {
390
+ fetch_params: {
490
391
  immediate: true,
491
- handler(val) {
492
- if (val) {
493
- // 提取本地数据
494
- let _cache = sessionStorage.getItem(this.cache_key);
392
+ handler([itemId]) {
393
+ if (typeof this.item !== "undefined") return;
495
394
 
496
- // 本地读取缓存
497
- if (_cache) {
498
- try {
499
- this.source = JSON.parse(_cache);
500
- } catch (e) {
501
- console.log(e, "[Item]无法解析本地缓存");
502
- }
395
+ this.requestVersion += 1;
396
+ const currentVersion = this.requestVersion;
503
397
 
504
- // 服务端拉取
505
- } else {
506
- get_item(this.item_id, this.final_client).then(res => {
507
- let item = res.data;
508
- let isValidItem = JSON.stringify(item) !== "{}";
509
- if (isValidItem) {
510
- this.source = item;
511
- sessionStorage.setItem(
512
- this.cache_key,
513
- JSON.stringify(this.source)
514
- );
515
- } else {
516
- this.source = null;
517
- }
518
- });
398
+ if (!itemId) {
399
+ this.source = null;
400
+ return;
401
+ }
402
+
403
+ // 提取本地数据
404
+ let _cache = sessionStorage.getItem(this.cache_key);
405
+
406
+ // 本地读取缓存
407
+ if (_cache) {
408
+ try {
409
+ this.source = JSON.parse(_cache);
410
+ return;
411
+ } catch (e) {
412
+ console.log(e, "[Item]无法解析本地缓存");
519
413
  }
520
414
  }
415
+
416
+ // 服务端拉取
417
+ get_item(itemId, this.final_client).then((res) => {
418
+ if (currentVersion !== this.requestVersion) return;
419
+
420
+ let item = res?.data;
421
+ let isValidItem = item && JSON.stringify(item) !== "{}";
422
+ if (isValidItem) {
423
+ this.source = item;
424
+ sessionStorage.setItem(this.cache_key, JSON.stringify(this.source));
425
+ } else {
426
+ this.source = null;
427
+ }
428
+ });
521
429
  },
522
430
  },
523
431
  },
@@ -525,5 +433,5 @@ export default {
525
433
  </script>
526
434
 
527
435
  <style lang="less">
528
- @import "../assets/css/module/item.less";
436
+ @import "./assets/css/module/item.less";
529
437
  </style>