From 1aab94bbc32e34a79fa4a2f484cd1f230759533c Mon Sep 17 00:00:00 2001 From: cbb <1055026847@qq.com> Date: Thu, 25 Dec 2025 17:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=B0=E5=9D=80=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=9A=E6=89=8B=E6=9C=BA=E5=8F=B7=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AD=A3=E5=88=99=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hbuilderx/launch.json | 1 + App.vue | 2 +- api/index.js | 17 + api/mall.js | 8 + components/bottom-view/bottom-view.vue | 22 + components/nav-bar/nav-bar.vue | 9 +- pages.json | 21 +- pages/address/add.vue | 167 ++ pages/address/edit.vue | 7 + pages/address/index.vue | 7 + pages/mall/confirm-order.vue | 185 ++- pages/mall/detail.vue | 249 ++- pages/mall/list.vue | 44 +- pages/mall/styles/confirm-order.scss | 236 +++ static/images/public/integral.png | Bin 0 -> 1485 bytes static/images/public/random1.png | Bin 0 -> 7967 bytes static/images/public/random2.png | Bin 0 -> 9721 bytes static/images/public/random3.png | Bin 0 -> 8667 bytes static/images/public/return-icon.png | Bin 0 -> 1304 bytes static/images/public/share-icon.png | Bin 0 -> 2334 bytes uni_modules/mp-html/README.md | 192 +++ uni_modules/mp-html/changelog.md | 163 ++ .../mp-html/components/mp-html/mp-html.vue | 500 ++++++ .../mp-html/components/mp-html/node/node.vue | 626 ++++++++ .../mp-html/components/mp-html/parser.js | 1400 +++++++++++++++++ uni_modules/mp-html/package.json | 99 ++ .../static/app-plus/mp-html/js/handler.js | 1 + .../app-plus/mp-html/js/uni.webview.min.js | 1 + .../static/app-plus/mp-html/local.html | 1 + uni_modules/uni-data-picker/changelog.md | 79 + .../components/uni-data-picker/keypress.js | 45 + .../uni-data-picker/uni-data-picker.uvue | 380 +++++ .../uni-data-picker/uni-data-picker.vue | 560 +++++++ .../uni-data-pickerview/loading.uts | 1 + .../uni-data-pickerview/uni-data-picker.js | 622 ++++++++ .../uni-data-pickerview/uni-data-picker.uts | 693 ++++++++ .../uni-data-pickerview.css | 76 + .../uni-data-pickerview.uvue | 69 + .../uni-data-pickerview.vue | 323 ++++ uni_modules/uni-data-picker/package.json | 93 ++ uni_modules/uni-data-picker/readme.md | 22 + uni_modules/uni-easyinput/changelog.md | 121 ++ .../components/uni-easyinput/common.js | 54 + .../uni-easyinput/uni-easyinput.vue | 662 ++++++++ uni_modules/uni-easyinput/package.json | 107 ++ uni_modules/uni-easyinput/readme.md | 11 + uni_modules/uni-forms/changelog.md | 100 ++ .../uni-forms-item/uni-forms-item.vue | 632 ++++++++ .../components/uni-forms/uni-forms.vue | 404 +++++ .../uni-forms/components/uni-forms/utils.js | 293 ++++ .../components/uni-forms/validate.js | 486 ++++++ uni_modules/uni-forms/package.json | 89 ++ uni_modules/uni-forms/readme.md | 23 + uni_modules/uni-icons/changelog.md | 44 + .../components/uni-icons/uni-icons.uvue | 91 ++ .../components/uni-icons/uni-icons.vue | 110 ++ .../components/uni-icons/uniicons.css | 664 ++++++++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35824 bytes .../components/uni-icons/uniicons_file.ts | 664 ++++++++ .../components/uni-icons/uniicons_file_vue.js | 649 ++++++++ uni_modules/uni-icons/package.json | 111 ++ uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-load-more/changelog.md | 23 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 404 +++++ uni_modules/uni-load-more/package.json | 105 ++ uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-number-box/changelog.md | 39 + .../uni-number-box/uni-number-box.vue | 232 +++ uni_modules/uni-number-box/package.json | 83 + uni_modules/uni-number-box/readme.md | 13 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 ++ .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 ++ .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + utils/index.js | 15 + utils/request.js | 1 - 91 files changed, 13903 insertions(+), 24 deletions(-) create mode 100644 components/bottom-view/bottom-view.vue create mode 100644 pages/address/add.vue create mode 100644 pages/address/edit.vue create mode 100644 pages/address/index.vue create mode 100644 pages/mall/styles/confirm-order.scss create mode 100644 static/images/public/integral.png create mode 100644 static/images/public/random1.png create mode 100644 static/images/public/random2.png create mode 100644 static/images/public/random3.png create mode 100644 static/images/public/return-icon.png create mode 100644 static/images/public/share-icon.png create mode 100644 uni_modules/mp-html/README.md create mode 100644 uni_modules/mp-html/changelog.md create mode 100644 uni_modules/mp-html/components/mp-html/mp-html.vue create mode 100644 uni_modules/mp-html/components/mp-html/node/node.vue create mode 100644 uni_modules/mp-html/components/mp-html/parser.js create mode 100644 uni_modules/mp-html/package.json create mode 100644 uni_modules/mp-html/static/app-plus/mp-html/js/handler.js create mode 100644 uni_modules/mp-html/static/app-plus/mp-html/js/uni.webview.min.js create mode 100644 uni_modules/mp-html/static/app-plus/mp-html/local.html create mode 100644 uni_modules/uni-data-picker/changelog.md create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/keypress.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 uni_modules/uni-data-picker/package.json create mode 100644 uni_modules/uni-data-picker/readme.md create mode 100644 uni_modules/uni-easyinput/changelog.md create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/common.js create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue create mode 100644 uni_modules/uni-easyinput/package.json create mode 100644 uni_modules/uni-easyinput/readme.md create mode 100644 uni_modules/uni-forms/changelog.md create mode 100644 uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/uni-forms.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/utils.js create mode 100644 uni_modules/uni-forms/components/uni-forms/validate.js create mode 100644 uni_modules/uni-forms/package.json create mode 100644 uni_modules/uni-forms/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.uvue create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file.ts create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-number-box/changelog.md create mode 100644 uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue create mode 100644 uni_modules/uni-number-box/package.json create mode 100644 uni_modules/uni-number-box/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 utils/index.js diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json index a5db135..daaf3e6 100644 --- a/.hbuilderx/launch.json +++ b/.hbuilderx/launch.json @@ -7,6 +7,7 @@ "type" : "uni-app:app-ios" }, { + "customPlaygroundType" : "device", "playground" : "standard", "type" : "uni-app:app-android" } diff --git a/App.vue b/App.vue index 6c8f7ab..2dff378 100644 --- a/App.vue +++ b/App.vue @@ -7,7 +7,7 @@ const silentLogin = async () => { const tokenStore = useTokenStore() if (tokenStore.token && !tokenStore.isTokenExpired()) { - console.log('去验证token') + reLaunch('/pages/news-list/news-list') return } diff --git a/api/index.js b/api/index.js index a4a8777..9f80457 100644 --- a/api/index.js +++ b/api/index.js @@ -25,3 +25,20 @@ export const getUserData = () => { method: 'get' }) } + +/** 获取用户地址列表 */ +export const getUserAddress = () => { + return http({ + url: '/api/service/userAddress/list', + method: 'get' + }) +} + +/** 添加地址 */ +export const addUserAddress = data => { + return http({ + url: '/api/service/userAddress', + method: 'post', + data + }) +} diff --git a/api/mall.js b/api/mall.js index 70a6e65..0069545 100644 --- a/api/mall.js +++ b/api/mall.js @@ -16,3 +16,11 @@ export const getProductList = data => { data }) } + +/** 商品详情 */ +export const getProductDetail = productId => { + return http({ + url: `/api/service/product/${productId}`, + method: 'get' + }) +} diff --git a/components/bottom-view/bottom-view.vue b/components/bottom-view/bottom-view.vue new file mode 100644 index 0000000..b841aac --- /dev/null +++ b/components/bottom-view/bottom-view.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/components/nav-bar/nav-bar.vue b/components/nav-bar/nav-bar.vue index f663269..e38e980 100644 --- a/components/nav-bar/nav-bar.vue +++ b/components/nav-bar/nav-bar.vue @@ -15,10 +15,14 @@ + - + + + + @@ -28,6 +32,7 @@ position: fixed; top: 0; width: 100%; + z-index: 99; } .status_bar { height: var(--status-bar-height); @@ -36,7 +41,7 @@ .nav-bar-box { padding: 0 36rpx; - height: 58rpx; + height: 44px; display: flex; align-items: center; justify-content: space-between; diff --git a/pages.json b/pages.json index 2c818d9..379008b 100644 --- a/pages.json +++ b/pages.json @@ -68,7 +68,8 @@ { "path": "pages/mall/detail", "style": { - "navigationBarTitleText": "商品详情" + "navigationBarTitleText": "商品详情", + "navigationStyle": "custom" } }, { @@ -76,6 +77,24 @@ "style": { "navigationBarTitleText": "确认订单" } + }, + { + "path": "pages/address/index", + "style": { + "navigationBarTitleText": "地址列表" + } + }, + { + "path": "pages/address/add", + "style": { + "navigationBarTitleText": "添加地址" + } + }, + { + "path": "pages/address/edit", + "style": { + "navigationBarTitleText": "修改地址" + } } ], "globalStyle": { diff --git a/pages/address/add.vue b/pages/address/add.vue new file mode 100644 index 0000000..db42426 --- /dev/null +++ b/pages/address/add.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/pages/address/edit.vue b/pages/address/edit.vue new file mode 100644 index 0000000..f32fca4 --- /dev/null +++ b/pages/address/edit.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/pages/address/index.vue b/pages/address/index.vue new file mode 100644 index 0000000..d771b35 --- /dev/null +++ b/pages/address/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/pages/mall/confirm-order.vue b/pages/mall/confirm-order.vue index 017fa36..d0219a9 100644 --- a/pages/mall/confirm-order.vue +++ b/pages/mall/confirm-order.vue @@ -1,7 +1,186 @@ - + - + diff --git a/pages/mall/detail.vue b/pages/mall/detail.vue index 46c7b74..4507813 100644 --- a/pages/mall/detail.vue +++ b/pages/mall/detail.vue @@ -1,7 +1,250 @@ - + - + diff --git a/pages/mall/list.vue b/pages/mall/list.vue index 018b09a..2cb71b6 100644 --- a/pages/mall/list.vue +++ b/pages/mall/list.vue @@ -1,27 +1,40 @@ @@ -31,8 +44,8 @@ - + - 名称 + {{ item.productName }} - 0.00 + {{ item.minPrice }} - 好评率:99% + - 拼单数量:12505件 + 拼单数量:{{ item.salesCount }}件 diff --git a/pages/mall/styles/confirm-order.scss b/pages/mall/styles/confirm-order.scss new file mode 100644 index 0000000..46a985d --- /dev/null +++ b/pages/mall/styles/confirm-order.scss @@ -0,0 +1,236 @@ +.mall-confirm-order { + padding: 32rpx 24rpx; + + // 地址 + .address-box { + padding: 34rpx 32rpx; + border-radius: 32rpx; + background: #ffffff; + display: flex; + justify-content: space-between; + align-items: center; + .wu-adres { + font-family: PingFang SC, PingFang SC; + font-style: normal; + text-transform: none; + font-weight: 500; + font-size: 28rpx; + color: #333333; + } + .left-name { + display: flex; + flex-direction: column; + font-family: PingFang SC, PingFang SC; + font-style: normal; + text-transform: none; + font-weight: 500; + .adres { + font-size: 28rpx; + color: #666666; + } + .bottom-name { + display: flex; + margin-top: 32rpx; + text { + font-size: 24rpx; + color: #999999; + &:first-child { + margin-right: 16rpx; + padding-right: 16rpx; + border-right: 2rpx solid #999999; + } + } + } + } + .right-box { + height: 32rpx; + } + } + + // 商品展示 + .product-box { + margin: 16rpx 0; + padding: 32rpx; + border-radius: 32rpx; + background: #ffffff; + display: flex; + align-items: center; + + .left-img { + width: 192rpx; + height: 192rpx; + border-radius: 8rpx; + flex-shrink: 0; + margin-right: 32rpx; + } + .right-content { + width: 100%; + height: 192rpx; + display: flex; + flex-direction: column; + justify-content: space-between; + font-family: PingFang SC, PingFang SC; + font-style: normal; + text-transform: none; + .product-name { + font-weight: bold; + font-size: 32rpx; + color: #333333; + + display: -webkit-box; + display: box; + -webkit-box-orient: vertical; + box-orient: vertical; + -webkit-line-clamp: 2; + line-clamp: 2; /* 添加标准属性 */ + overflow: hidden; + text-overflow: ellipsis; + word-break: break-word; + overflow-wrap: break-word; + } + + .line-box { + display: flex; + justify-content: space-between; + align-items: flex-end; + .rmb-box { + display: flex; + flex-direction: column; + text { + font-weight: 500; + font-size: 32rpx; + color: #eb3c39; + // 第一个 + &:first-child { + font-size: 24rpx; + color: #999999; + text-decoration-line: line-through; + } + } + } + + .add-num { + display: flex; + align-items: center; + .uni-number-box { + width: 120rpx; + } + } + } + } + } + + // 规格 + .spec-box { + padding: 32rpx; + border-radius: 32rpx; + background: #ffffff; + font-family: PingFang SC, PingFang SC; + font-style: normal; + text-transform: none; + font-weight: 500; + .title { + font-size: 28rpx; + color: #333333; + } + .spec-item { + display: flex; + flex-wrap: wrap; + margin-top: 32rpx; + text { + padding: 8rpx 16rpx; + font-size: 24rpx; + color: #333333; + background: #f4f4f4; + border-radius: 4rpx; + border: 2rpx solid #f4f4f4; + margin: 0 32rpx 16rpx 0; + } + .on-text { + background: #eb1c261a; + border-color: #eb1c26; + color: #eb1c26; + } + .disabled { + color: #999999; + } + } + } + + // 合计 + .total-box { + margin: 16rpx 0; + padding: 32rpx; + border-radius: 32rpx; + background: #ffffff; + display: flex; + align-items: center; + justify-content: space-between; + font-family: PingFang SC, PingFang SC; + text-align: left; + font-style: normal; + text-transform: none; + .name { + font-weight: 500; + font-size: 28rpx; + color: #333333; + } + .num { + display: flex; + align-items: baseline; + text { + font-weight: 500; + font-size: 24rpx; + color: #eb1c26; + // 最后一个 + &:last-child { + margin-left: 10rpx; + font-weight: bold; + font-size: 48rpx; + } + } + } + } + + // 付款方式 + .pay-way { + border-radius: 32rpx; + background: #ffffff; + margin-bottom: 110rpx; + .pay-way-item { + padding: 32rpx; + display: flex; + align-items: center; + justify-content: space-between; + .icon { + display: flex; + align-items: center; + .left-icon { + width: 37rpx; + height: 37rpx; + margin-right: 14rpx; + } + text { + font-family: PingFang SC, PingFang SC; + font-weight: 500; + font-size: 28rpx; + color: #333333; + text-align: left; + font-style: normal; + text-transform: none; + } + } + + .check { + width: 36rpx; + height: 36rpx; + border-radius: 34rpx; + border: 2rpx solid #d9d9d9; + .check-icon { + width: 36rpx; + height: 36rpx; + } + } + } + } +} diff --git a/static/images/public/integral.png b/static/images/public/integral.png new file mode 100644 index 0000000000000000000000000000000000000000..d185232e19071f9556bd99e9b121a513ef94a9e5 GIT binary patch literal 1485 zcmV;;1v2`HP)5hL9x3iGJYL z?Q6DW|4syR2*xBJjsxIXB;$g}L?;-pZhz!Ac02|Jw5|wvQ}zkBZe5e)0B{r$dLgAX zF$iY}Xr3!{DVQ>krI;kDH${MEt^HoZ{t*byBVuaOplgVI5g9XFk)Nn;KBR*s$#WC% z8kN(&4@&@Wn2%z92#@-Ji+oc~=XIEifZwp+0VqxI*tYWqO2s3J&xw^7spwTeW&+}v z0LEa8o5YY5AzgzA_<>J03sYqGS=x3qYgVXphE^38UekX z1k)1u`(pVhFH(I;#wr~LY`gn0MyfzWvVO#(OlQua*XO;J4y+|mHcG=fBbA&0ewAUO zy8AKSDB+ue;fMNWEX#7Hh-x~VmH;R8w9aTnP7?-3#{t8>8@HStR@J%RtT|7uANwn~ zwg1X<&NqUwYR=xjLT8sxVLw4M#E3~g5`OrsPN^gy+g>T1&WMM?muA&{xjf*_O2QAE z0!N3{$?qD3^<)I(ZM z^5l5-gDSm}fKe*ns{*geh=%;S^~~yZmmPQ7tO8)-kTr}bdj*iF2a*~uGW?9p6hT7X z+%UqFX8-^R_kf})E5PHitiZO53LwERG;g51xdCQ~2LULWk^muP8{;h!L0yJ`!h3>9 zk_W{16CiCW&Pn-3I1b`bNe8s0s zzfuV^ClfmiDf~I^r=1btYaJ$m0M>OzZF1rT=(77uo2+%g+wtK*^V!7rgUnS!3@@}? zcAT^XD!hl6(sfvD5D?%pjzQZL=kxB7zZYFX{-71fXOo8gy*FKXWWDL1E+}V}^_XU# zXsJ>SerWa;e_8^9MTp*$bJD>>?H+k&7K|kB)$MPIU=I1453IGL5S13)hBfU?RUW1> zDBri+errvw?->T8^=e2YVAlLk*;c>FVrA<$!6dj~Fb4=vf~FzhaiG$Yf6(>`An`?| z>4IRf%p1mLU-OqpKx~MjQ~Xk&d$%dJT^&SD1)`H_K2ix-HSa1Qj;1*(T+cDF=B3V5 zsRSf3-mjlSfHC-&n#7WrS;A!^AdV_k=Us6u{jEGChQ!JmBQpVU*m69wCC>zpd4O=F z6+^;hI&u*Zk5XC+s2_NSkn4hu1p+!`R{e8%{pBVg0WALFX4ag3;+J~jg+^qXIoS3( z--wfZQ;t|NS!}||rU=AwES{sSntLb+gU5MTooyx*D>Y|c00000NkvXXu0mjfF>tEI literal 0 HcmV?d00001 diff --git a/static/images/public/random1.png b/static/images/public/random1.png new file mode 100644 index 0000000000000000000000000000000000000000..689d6506fe1e602234b9c2ce5ab51cc997d71727 GIT binary patch literal 7967 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 Hu0mjf3(MXa literal 0 HcmV?d00001 diff --git a/static/images/public/random3.png b/static/images/public/random3.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6d6969b1244aaa2bd65acdc2c10e766a0df5d8 GIT binary patch literal 8667 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 Ef||N-*#H0l literal 0 HcmV?d00001 diff --git a/uni_modules/mp-html/README.md b/uni_modules/mp-html/README.md new file mode 100644 index 0000000..cf9ba73 --- /dev/null +++ b/uni_modules/mp-html/README.md @@ -0,0 +1,192 @@ +## 为减小组件包的大小,默认组件包中不包含编辑、latex 公式等扩展功能,需要使用扩展功能的请参考下方的 插件扩展 栏的说明 + +## 功能介绍 +- 全端支持(含 `v3、NVUE`) +- 支持丰富的标签(包括 `table`、`video`、`svg` 等) +- 支持丰富的事件效果(自动预览图片、链接处理等) +- 支持设置占位图(加载中、出错时、预览时) +- 支持锚点跳转、长按复制等丰富功能 +- 支持大部分 *html* 实体 +- 丰富的插件(关键词搜索、内容编辑、`latex` 公式等) +- 效率高、容错性强且轻量化 + +查看 [功能介绍](https://jin-yufeng.github.io/mp-html/#/overview/feature) 了解更多 + +## 使用方法 +- `uni_modules` 方式 + 1. 点击右上角的 `使用 HBuilder X 导入插件` 按钮直接导入项目或点击 `下载插件 ZIP` 按钮下载插件包并解压到项目的 `uni_modules/mp-html` 目录下 + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + + ``` + ```javascript + export default { + data() { + return { + html: '
Hello World!
' + } + } + } + ``` + 3. 需要更新版本时在 `HBuilder X` 中右键 `uni_modules/mp-html` 目录选择 `从插件市场更新` 即可 + +- 源码方式 + 1. 从 [github](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 或 [gitee](https://gitee.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 下载源码 + 插件市场的 **非 uni_modules 版本** 无法更新,不建议从插件市场获取 + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + ``` + ```javascript + import mpHtml from '@/components/mp-html/mp-html' + export default { + // HBuilderX 2.5.5+ 可以通过 easycom 自动引入 + components: { + mpHtml + }, + data() { + return { + html: '
Hello World!
' + } + } + } + ``` + +- npm 方式 + 1. 在项目根目录下执行 + ```bash + npm install mp-html + ``` + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + ``` + ```javascript + import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html' + export default { + // 不可省略 + components: { + mpHtml + }, + data() { + return { + html: '
Hello World!
' + } + } + } + ``` + 3. 需要更新版本时执行以下命令即可 + ```bash + npm update mp-html + ``` + + 使用 *cli* 方式运行的项目,通过 *npm* 方式引入时,需要在 *vue.config.js* 中配置 *transpileDependencies*,详情可见 [#330](https://github.com/jin-yufeng/mp-html/issues/330#issuecomment-913617687) + 如果在 **nvue** 中使用还要将 `dist/uni-app/static` 目录下的内容拷贝到项目的 `static` 目录下,否则无法运行 + +查看 [快速开始](https://jin-yufeng.github.io/mp-html/#/overview/quickstart) 了解更多 + +## 组件属性 + +| 属性 | 类型 | 默认值 | 说明 | +|:---:|:---:|:---:|---| +| container-style | String | | 容器的样式([2.1.0+](https://jin-yufeng.github.io/mp-html/#/changelog/changelog#v210)) | +| content | String | | 用于渲染的 html 字符串 | +| copy-link | Boolean | true | 是否允许外部链接被点击时自动复制 | +| domain | String | | 主域名(用于链接拼接) | +| error-img | String | | 图片出错时的占位图链接 | +| lazy-load | Boolean | false | 是否开启图片懒加载 | +| loading-img | String | | 图片加载过程中的占位图链接 | +| pause-video | Boolean | true | 是否在播放一个视频时自动暂停其他视频 | +| preview-img | Boolean | true | 是否允许图片被点击时自动预览 | +| scroll-table | Boolean | false | 是否给每个表格添加一个滚动层使其能单独横向滚动 | +| selectable | Boolean | false | 是否开启文本长按复制 | +| set-title | Boolean | true | 是否将 title 标签的内容设置到页面标题 | +| show-img-menu | Boolean | true | 是否允许图片被长按时显示菜单 | +| tag-style | Object | | 设置标签的默认样式 | +| use-anchor | Boolean | false | 是否使用锚点链接 | + +查看 [属性](https://jin-yufeng.github.io/mp-html/#/basic/prop) 了解更多 + +## 组件事件 + +| 名称 | 触发时机 | +|:---:|---| +| load | dom 树加载完毕时 | +| ready | 图片加载完毕时 | +| error | 发生渲染错误时 | +| imgtap | 图片被点击时 | +| linktap | 链接被点击时 | +| play | 音视频播放时 | + +查看 [事件](https://jin-yufeng.github.io/mp-html/#/basic/event) 了解更多 + +## api +组件实例上提供了一些 `api` 方法可供调用 + +| 名称 | 作用 | +|:---:|---| +| in | 将锚点跳转的范围限定在一个 scroll-view 内 | +| navigateTo | 锚点跳转 | +| getText | 获取文本内容 | +| getRect | 获取富文本内容的位置和大小 | +| setContent | 设置富文本内容 | +| imgList | 获取所有图片的数组 | +| pauseMedia | 暂停播放音视频([2.2.2+](https://jin-yufeng.github.io/mp-html/#/changelog/changelog#v222)) | +| setPlaybackRate | 设置音视频播放速率([2.4.0+](https://jin-yufeng.github.io/mp-html/#/changelog/changelog#v240)) | + +查看 [api](https://jin-yufeng.github.io/mp-html/#/advanced/api) 了解更多 + +## 插件扩展 +除基本功能外,本组件还提供了丰富的扩展,可按照需要选用 + +| 名称 | 作用 | +|:---:|---| +| audio | 音乐播放器 | +| editable | 富文本 **编辑**([示例项目](https://mp-html.oss-cn-hangzhou.aliyuncs.com/editable.zip)) | +| emoji | 解析 emoji | +| highlight | 代码块高亮显示 | +| markdown | 渲染 markdown | +| search | 关键词搜索 | +| style | 匹配 style 标签中的样式 | +| txv-video | 使用腾讯视频 | +| img-cache | 图片缓存 by [@PentaTea](https://github.com/PentaTea) | +| latex | 渲染 latex 公式 by [@Zeng-J](https://github.com/Zeng-J) | + +从插件市场导入的包中 **不含有** 扩展插件,使用插件需通过微信小程序 `富文本插件` 获取或参考以下方法进行打包: +1. 获取完整组件包 + ```bash + npm install mp-html + ``` +2. 编辑 `tools/config.js` 中的 `plugins` 项,选择需要的插件 +3. 生成新的组件包 + 在 `node_modules/mp-html` 目录下执行 + ```bash + npm install + npm run build:uni-app + ``` +4. 拷贝 `dist/uni-app` 中的内容到项目根目录 + +查看 [插件](https://jin-yufeng.github.io/mp-html/#/advanced/plugin) 了解更多 + +## 关于 nvue +`nvue` 使用原生渲染,不支持部分 `css` 样式,为实现和 `html` 相同的效果,组件内部通过 `web-view` 进行渲染,性能上差于原生,根据 `weex` 官方建议,`web` 标签仅应用在非常规的降级场景。因此,如果通过原生的方式(如 `richtext`)能够满足需要,则不建议使用本组件,如果有较多的富文本内容,则可以直接使用 `vue` 页面 +由于渲染方式与其他端不同,有以下限制: +1. 不支持 `lazy-load` 属性 +2. 视频不支持全屏播放 +3. 如果在 `flex-direction: row` 的容器中使用,需要给组件设置宽度或设置 `flex: 1` 占满剩余宽度 + +纯 `nvue` 模式下,[此问题](https://ask.dcloud.net.cn/question/119678) 修复前,不支持通过 `uni_modules` 引入,需要本地引入(将 [dist/uni-app](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 中的内容拷贝到项目根目录下) + + +## 问题反馈 +遇到问题时,请先查阅 [常见问题](https://jin-yufeng.github.io/mp-html/#/question/faq) 和 [issue](https://github.com/jin-yufeng/mp-html/issues) 中是否已有相同的问题 +可通过 [issue](https://github.com/jin-yufeng/mp-html/issues/new/choose) 、插件问答或发送邮件到 [mp_html@126.com](mailto:mp_html@126.com) 提问,不建议在评论区提问(不方便回复) +提问请严格按照 [issue 模板](https://github.com/jin-yufeng/mp-html/issues/new/choose) ,描述清楚使用环境、`html` 内容或可复现的 `demo` 项目以及复现方式,对于 **描述不清**、**无法复现** 或重复的问题将不予回复 + +欢迎加入 `QQ` 交流群: +群1(已满):`699734691` +群2(已满):`778239129` +群3:`960265313` + +查看 [问题反馈](https://jin-yufeng.github.io/mp-html/#/question/feedback) 了解更多 diff --git a/uni_modules/mp-html/changelog.md b/uni_modules/mp-html/changelog.md new file mode 100644 index 0000000..0ec5fa9 --- /dev/null +++ b/uni_modules/mp-html/changelog.md @@ -0,0 +1,163 @@ +## v2.5.2(2025-12-14) +1. `A` 增加了音视频暂停 [pause](https://jin-yufeng.github.io/mp-html/#/basic/event?id=pause) 和视频全屏 [fullscreenchange](https://jin-yufeng.github.io/mp-html/#/basic/event?id=fullscreenchange) 事件 [#495](https://github.com/jin-yufeng/mp-html/issues/495) [#595](https://github.com/jin-yufeng/mp-html/issues/595) +2. `U` 优化了 [流式输出](https://jin-yufeng.github.io/mp-html/#/overview/feature?id=stream) 效果,通过差量更新解决闪烁问题 [详细](https://github.com/jin-yufeng/mp-html/issues/657) +3. `U` `latex` 插件更新字体文件 [详细](https://github.com/jin-yufeng/mp-html/pull/647) by [@JiuyeXD](https://github.com/JiuyeXD) +4. `U` 更新 `markdown` 插件中 `marked.js` 版本 [详细](https://github.com/jin-yufeng/mp-html/issues/672) +5. `U` 微信小程序替换遗漏的废弃 `api` `getSystemInfoSync` [详细](https://github.com/jin-yufeng/mp-html/pull/653) by [@zcSkr](https://github.com/zcSkr) +6. `F` 修复了 `markdown` 插件加粗文本遇到中文符号无效的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/664) by [@qp666](https://github.com/qp666) +## v2.5.1(2025-04-20) +1. `U` 适配鸿蒙 `APP` [详细](https://github.com/jin-yufeng/mp-html/issues/615) +2. `U` 微信小程序替换废弃 `api` `getSystemInfoSync` [详细](https://github.com/jin-yufeng/mp-html/issues/613) +3. `F` 修复了 `app` 端播放视频可能报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/617) +4. `F` 修复了 `latex` 插件可能出现 `xxx can be used only in display mode` 的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/632) +5. `F` 修复了 `uni-app` 包 `latex` 公式可能不显示的问题 [#599](https://github.com/jin-yufeng/mp-html/issues/599)、[#627](https://github.com/jin-yufeng/mp-html/issues/627) +## v2.5.0(2024-04-22) +1. `U` `play` 事件增加返回 `src` 等信息 [详细](https://github.com/jin-yufeng/mp-html/issues/526) +2. `U` `preview-img` 属性支持设置为 `all` 开启 `base64` 图片预览 [详细](https://github.com/jin-yufeng/mp-html/issues/536) +3. `U` `editable` 插件增加简易模式(点击文字直接编辑) +4. `U` `latex` 插件支持块级公式 [详细](https://github.com/jin-yufeng/mp-html/issues/582) +5. `F` 修复了表格部分情况下背景丢失的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/587) +6. `F` 修复了部分 `svg` 无法显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/591) +7. `F` 修复了 `h5` 和 `app` 端部分情况下样式无法识别的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/518) +8. `F` 修复了 `latex` 插件部分情况下显示不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/580) +9. `F` 修复了 `editable` 插件表格无法删除的问题 +10. `F` 修复了 `editable` 插件 `vue3` `h5` 端点击图片报错的问题 +11. `F` 修复了 `editable` 插件点击表格没有菜单栏的问题 +## v2.4.3(2024-01-21) +1. `A` 增加 [card](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#card) 插件 [详细](https://github.com/jin-yufeng/mp-html/pull/533) by [@whoooami](https://github.com/whoooami) +2. `F` 修复了 `svg` 中包含 `foreignobject` 可能不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/523) +3. `F` 修复了合并单元格的表格部分情况下显示不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/561) +4. `F` 修复了 `img` 标签设置 `object-fit` 无效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/567) +5. `F` 修复了 `latex` 插件公式会换行的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/540) +6. `F` 修复了 `editable` 和 `audio` 插件共用时点击 `audio` 无法编辑的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/529) by [@whoooami](https://github.com/whoooami) +7. `F` 修复了微信小程序部分情况下图片会报错 `replace of undefined` 的问题 +8. `F` 修复了快手小程序图片不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/571) +## v2.4.2(2023-05-14) +1. `A` `editable` 插件支持修改文字颜色 [详细](https://github.com/jin-yufeng/mp-html/issues/254) +2. `F` 修复了 `svg` 中有 `style` 不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/505) +3. `F` 修复了使用旧版编译器可能报错 `Bad attr nodes` 的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/472) +4. `F` 修复了 `app` 端可能出现无法读取 `lazyLoad` 的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/513) +5. `F` 修复了 `editable` 插件在点击换图时未拼接 `domain` 的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/497) by [@TwoKe945](https://github.com/TwoKe945) +6. `F` 修复了 `latex` 插件部分情况下不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/515) +7. `F` 修复了 `editable` 插件点击音视频时其他标签框不消失的问题 +## v2.4.1(2022-12-25) +1. `F` 修复了没有图片时 `ready` 事件可能不触发的问题 +2. `F` 修复了加载过程中可能出现 `Root label not found` 错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/470) +3. `F` 修复了 `audio` 插件退出页面可能会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/457) +4. `F` 修复了 `vue3` 运行到 `app` 在 `HBuilder X 3.6.10` 以上报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/480) +5. `F` 修复了 `nvue` 端链接中包含 `%22` 时可能无法显示的问题 +6. `F` 修复了 `vue3` 使用 `highlight` 插件可能报错的问题 +## v2.4.0(2022-08-27) +1. `A` 增加了 [setPlaybackRate](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#setPlaybackRate) 的 `api`,可以设置音视频的播放速率 [详细](https://github.com/jin-yufeng/mp-html/issues/452) +2. `A` 示例小程序代码开源 [详细](https://github.com/jin-yufeng/mp-html-demo) +3. `U` 优化 `ready` 事件触发时机,未设置懒加载的情况下基本可以准确触发 [详细](https://github.com/jin-yufeng/mp-html/issues/195) +4. `U` `highlight` 插件在编辑状态下不进行高亮处理,便于编辑 +5. `F` 修复了 `flex` 布局下图片大小可能不正确的问题 +6. `F` 修复了 `selectable` 属性没有设置 `force` 也可能出现渲染异常的问题 +7. `F` 修复了表格中的图片大小可能不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/448) +8. `F` 修复了含有合并单元格的表格可能无法设置竖直对齐的问题 +9. `F` 修复了 `editable` 插件在 `scroll-view` 中使用时工具条位置可能不正确的问题 +10. `F` 修复了 `vue3` 使用 [search](advanced/plugin#search) 插件可能导致错误换行的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/449) +## v2.3.2(2022-08-13) +1. `A` 增加 [latex](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#latex) 插件,可以渲染数学公式 [详细](https://github.com/jin-yufeng/mp-html/pull/447) by [@Zeng-J](https://github.com/Zeng-J) +2. `U` 优化根节点下有很多标签的长内容渲染速度 +3. `U` `highlight` 插件适配 `lang-xxx` 格式 +4. `F` 修复了 `table` 标签设置 `border` 属性后可能无法修改边框样式的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/439) by [@zouxingjie](https://github.com/zouxingjie) +5. `F` 修复了 `editable` 插件输入连续空格无效的问题 +6. `F` 修复了 `vue3` 图片设置 `inline` 会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/438) +7. `F` 修复了 `vue3` 使用 `table` 可能报错的问题 +## v2.3.1(2022-05-20) +1. `U` `app` 端支持使用本地图片 +2. `U` 优化了微信小程序 `selectable` 属性在 `ios` 端的处理 [详细](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) +3. `F` 修复了 `editable` 插件不在顶部时 `tooltip` 位置可能错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/430) +4. `F` 修复了 `vue3` 运行到微信小程序可能报错丢失内容的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/414) +5. `F` 修复了 `vue3` 部分标签可能被错误换行的问题 +6. `F` 修复了 `editable` 插件 `app` 端插入视频无法预览的问题 +## v2.3.0(2022-04-01) +1. `A` 增加了 `play` 事件,音视频播放时触发,可用于与页面其他音视频进行互斥播放 [详细](basic/event#play) +2. `U` `show-img-menu` 属性支持控制预览时是否长按弹出菜单 +3. `U` 优化 `wxs` 处理,提高渲染性能 [详细](https://developers.weixin.qq.com/community/develop/article/doc/0006cc2b204740f601bd43fa25a413) +4. `U` `video` 标签支持 `object-fit` 属性 +5. `U` 增加支持一些常用实体编码 [详细](https://github.com/jin-yufeng/mp-html/issues/418) +6. `F` 修复了图片仅设置高度可能不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/410) +7. `F` 修复了 `video` 标签高度设置为 `auto` 不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/411) +8. `F` 修复了使用 `grid` 布局时可能样式错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/413) +9. `F` 修复了含有合并单元格的表格部分情况下显示异常的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/417) +10. `F` 修复了 `editable` 插件连续插入内容时顺序不正确的问题 +11. `F` 修复了 `uni-app` 包 `vue3` 使用 `audio` 插件报错的问题 +12. `F` 修复了 `uni-app` 包 `highlight` 插件使用自定义的 `prism.min.js` 报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/416) +## v2.2.2(2022-02-26) +1. `A` 增加了 [pauseMedia](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#pauseMedia) 的 `api`,可用于暂停播放音视频 [详细](https://github.com/jin-yufeng/mp-html/issues/317) +2. `U` 优化了长内容的加载速度 +3. `U` 适配 `vue3` [#389](https://github.com/jin-yufeng/mp-html/issues/389)、[#398](https://github.com/jin-yufeng/mp-html/pull/398) by [@zhouhuafei](https://github.com/zhouhuafei)、[#400](https://github.com/jin-yufeng/mp-html/issues/400) +4. `F` 修复了小程序端图片高度设置为百分比时可能不显示的问题 +5. `F` 修复了 `highlight` 插件部分情况下可能显示不完整的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/403) +## v2.2.1(2021-12-24) +1. `A` `editable` 插件增加上下移动标签功能 +2. `U` `editable` 插件支持在文本中间光标处插入内容 +3. `F` 修复了 `nvue` 端设置 `margin` 后可能导致高度不正确的问题 +4. `F` 修复了 `highlight` 插件使用压缩版的 `prism.css` 可能导致背景失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/367) +5. `F` 修复了编辑状态下使用 `emoji` 插件内容为空时可能报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/371) +6. `F` 修复了使用 `editable` 插件后将 `selectable` 属性设置为 `force` 不生效的问题 +## v2.2.0(2021-10-12) +1. `A` 增加 `customElements` 配置项,便于添加自定义功能性标签 [详细](https://github.com/jin-yufeng/mp-html/issues/350) +2. `A` `editable` 插件增加切换音视频自动播放状态的功能 [详细](https://github.com/jin-yufeng/mp-html/pull/341) by [@leeseett](https://github.com/leeseett) +3. `A` `editable` 插件删除媒体标签时触发 `remove` 事件,便于删除已上传的文件 +4. `U` `editable` 插件 `insertImg` 方法支持同时插入多张图片 [详细](https://github.com/jin-yufeng/mp-html/issues/342) +5. `U` `editable` 插入图片和音视频时支持拼接 `domian` 主域名 +6. `F` 修复了内部链接参数中包含 `://` 时被认为是外部链接的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/356) +7. `F` 修复了部分 `svg` 标签名或属性名大小写不正确时不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/351) +8. `F` 修复了 `nvue` 页面运行到非 `app` 平台时可能样式错误的问题 +## v2.1.5(2021-08-13) +1. `A` 增加支持标签的 `dir` 属性 +2. `F` 修复了 `ruby` 标签文字与拼音没有居中对齐的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/325) +3. `F` 修复了音视频标签内有 `a` 标签时可能无法播放的问题 +4. `F` 修复了 `externStyle` 中的 `class` 名包含下划线或数字时可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326) +5. `F` 修复了 `h5` 端引入 `externStyle` 可能不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326) +## v2.1.4(2021-07-14) +1. `F` 修复了 `rt` 标签无法设置样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/318) +2. `F` 修复了表格中有单元格同时合并行和列时可能显示不正确的问题 +3. `F` 修复了 `app` 端无法关闭图片长按菜单的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/322) +4. `F` 修复了 `editable` 插件只能添加图片链接不能修改的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/312) by [@leeseett](https://github.com/leeseett) +## v2.1.3(2021-06-12) +1. `A` `editable` 插件增加 `insertTable` 方法 +2. `U` `editable` 插件支持编辑表格中的空白单元格 [详细](https://github.com/jin-yufeng/mp-html/issues/310) +3. `F` 修复了 `externStyle` 中使用伪类可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/298) +4. `F` 修复了多个组件同时使用时 `tag-style` 属性时可能互相影响的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/305) by [@woodguoyu](https://github.com/woodguoyu) +5. `F` 修复了包含 `linearGradient` 的 `svg` 可能无法显示的问题 +6. `F` 修复了编译到头条小程序时可能报错的问题 +7. `F` 修复了 `nvue` 端不触发 `click` 事件的问题 +8. `F` 修复了 `editable` 插件尾部插入时无法撤销的问题 +9. `F` 修复了 `editable` 插件的 `insertHtml` 方法只能在末尾插入的问题 +10. `F` 修复了 `editable` 插件插入音频不显示的问题 +## v2.1.2(2021-04-24) +1. `A` 增加了 [img-cache](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#img-cache) 插件,可以在 `app` 端缓存图片 [详细](https://github.com/jin-yufeng/mp-html/issues/292) by [@PentaTea](https://github.com/PentaTea) +2. `U` 支持通过 `container-style` 属性设置 `white-space` 来保留连续空格和换行符 [详细](https://jin-yufeng.gitee.io/mp-html/#/question/faq#space) +3. `U` 代码风格符合 [standard](https://standardjs.com) 标准 +4. `U` `editable` 插件编辑状态下支持预览视频 [详细](https://github.com/jin-yufeng/mp-html/issues/286) +5. `F` 修复了 `svg` 标签内嵌 `svg` 时无法显示的问题 +6. `F` 修复了编译到支付宝和头条小程序时部分区域不可复制的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/291) +## v2.1.1(2021-04-09) +1. 修复了对 `p` 标签设置 `tag-style` 可能不生效的问题 +2. 修复了 `svg` 标签中的文本无法显示的问题 +3. 修复了使用 `editable` 插件编辑表格时可能报错的问题 +4. 修复了使用 `highlight` 插件运行到头条小程序时可能没有样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/280) +5. 修复了使用 `editable` 插件 `editable` 属性为 `false` 时会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/284) +6. 修复了 `style` 插件连续子选择器失效的问题 +7. 修复了 `editable` 插件无法修改图片和字体大小的问题 +## v2.1.0.2(2021-03-21) +修复了 `nvue` 端使用可能报错的问题 +## v2.1.0(2021-03-20) +1. `A` 增加了 [container-style](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#container-style) 属性 [详细](https://gitee.com/jin-yufeng/mp-html/pulls/1) +2. `A` 增加支持 `strike` 标签 +3. `A` `editable` 插件增加 `placeholder` 属性 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable) +4. `A` `editable` 插件增加 `insertHtml` 方法 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable) +5. `U` 外部样式支持标签名选择器 [详细](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart#setting) +6. `F` 修复了 `nvue` 端部分情况下可能不显示的问题 +## v2.0.5(2021-03-12) +1. `U` [linktap](https://jin-yufeng.gitee.io/mp-html/#/basic/event#linktap) 事件增加返回内部文本内容 `innerText` [详细](https://github.com/jin-yufeng/mp-html/issues/271) +2. `U` [selectable](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) 属性设置为 `force` 时能够在微信 `iOS` 端生效(文本块会变成 `inline-block`) [详细](https://github.com/jin-yufeng/mp-html/issues/267) +3. `F` 修复了部分情况下竖向无法滚动的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/182) +4. `F` 修复了多次修改富文本数据时部分内容可能不显示的问题 +5. `F` 修复了 [腾讯视频](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#txv-video) 插件可能无法播放的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/265) +6. `F` 修复了 [highlight](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#highlight) 插件没有设置高亮语言时没有应用默认样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/276) by [@fuzui](https://github.com/fuzui) diff --git a/uni_modules/mp-html/components/mp-html/mp-html.vue b/uni_modules/mp-html/components/mp-html/mp-html.vue new file mode 100644 index 0000000..f084eba --- /dev/null +++ b/uni_modules/mp-html/components/mp-html/mp-html.vue @@ -0,0 +1,500 @@ + + + + + diff --git a/uni_modules/mp-html/components/mp-html/node/node.vue b/uni_modules/mp-html/components/mp-html/node/node.vue new file mode 100644 index 0000000..80f0282 --- /dev/null +++ b/uni_modules/mp-html/components/mp-html/node/node.vue @@ -0,0 +1,626 @@ +