From f67ec6cce3a293086fca12da5e741504bceef659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=93=E5=B9=B3=E8=89=BA?= <52643018@qq.com> Date: Fri, 29 Apr 2022 15:52:30 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=AE=8C=E5=96=84=E3=80=91=20?= =?UTF-8?q?=E9=80=81=E8=AF=84=E8=AF=A6=E6=83=85=E3=80=81=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E3=80=81=E8=B4=B9=E7=94=A8=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E3=80=81=E8=AF=84=E7=BA=A7=E8=BD=A8=E8=BF=B9=E7=AD=89=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E4=BA=A4=E4=BA=92=20=E3=80=90=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=91=20=E6=96=87=E7=AB=A0=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=EF=BC=8C=E9=80=9A=E7=94=A8=E7=9A=84=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E5=AF=8C=E6=96=87=E6=9C=AC=E9=A1=B5=E9=9D=A2=EF=BC=8C=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E4=BB=8B=E7=BB=8D=E5=B1=95=E7=A4=BA=E7=AD=89=20?= =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91=20=E5=AF=8C=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E8=A7=A3=E6=9E=90=E7=BB=84=E4=BB=B6=20=E8=87=B3?= =?UTF-8?q?=E6=AD=A4=E6=89=80=E6=9C=89=E9=A1=B5=E9=9D=A2=E5=9D=87=E5=8C=80?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=8C=E6=88=90=EF=BC=8C=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E4=BA=86=E9=80=BB=E8=BE=91=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lf-table.vue | 12 +- .../u-parse/components/wxParseAudio.vue | 27 ++ components/u-parse/components/wxParseImg.vue | 86 ++++++ .../u-parse/components/wxParseTemplate0.vue | 107 +++++++ .../u-parse/components/wxParseTemplate1.vue | 99 +++++++ .../u-parse/components/wxParseTemplate10.vue | 97 +++++++ .../u-parse/components/wxParseTemplate11.vue | 87 ++++++ .../u-parse/components/wxParseTemplate2.vue | 98 +++++++ .../u-parse/components/wxParseTemplate3.vue | 98 +++++++ .../u-parse/components/wxParseTemplate4.vue | 98 +++++++ .../u-parse/components/wxParseTemplate5.vue | 98 +++++++ .../u-parse/components/wxParseTemplate6.vue | 98 +++++++ .../u-parse/components/wxParseTemplate7.vue | 98 +++++++ .../u-parse/components/wxParseTemplate8.vue | 98 +++++++ .../u-parse/components/wxParseTemplate9.vue | 98 +++++++ .../u-parse/components/wxParseVideo.vue | 15 + components/u-parse/libs/html2json.js | 261 ++++++++++++++++++ components/u-parse/libs/htmlparser.js | 156 +++++++++++ components/u-parse/libs/wxDiscode.js | 195 +++++++++++++ components/u-parse/readme.md | 102 +++++++ components/u-parse/u-parse.css | 232 ++++++++++++++++ components/u-parse/u-parse.vue | 118 ++++++++ packages/addAddress/addAddress.vue | 9 - packages/article/article.vue | 42 +++ packages/sonpingDetail/expenseDetail.vue | 143 ++++++---- packages/sonpingDetail/ratingTrajectory.vue | 57 ++-- packages/sonpingDetail/sonpingDetail.vue | 52 +++- packages/sonpingDetail/viewDetail.vue | 15 +- pages.json | 6 + pages/ratingQuery/ratingQuery.vue | 20 +- 30 files changed, 2618 insertions(+), 104 deletions(-) create mode 100644 components/u-parse/components/wxParseAudio.vue create mode 100644 components/u-parse/components/wxParseImg.vue create mode 100644 components/u-parse/components/wxParseTemplate0.vue create mode 100644 components/u-parse/components/wxParseTemplate1.vue create mode 100644 components/u-parse/components/wxParseTemplate10.vue create mode 100644 components/u-parse/components/wxParseTemplate11.vue create mode 100644 components/u-parse/components/wxParseTemplate2.vue create mode 100644 components/u-parse/components/wxParseTemplate3.vue create mode 100644 components/u-parse/components/wxParseTemplate4.vue create mode 100644 components/u-parse/components/wxParseTemplate5.vue create mode 100644 components/u-parse/components/wxParseTemplate6.vue create mode 100644 components/u-parse/components/wxParseTemplate7.vue create mode 100644 components/u-parse/components/wxParseTemplate8.vue create mode 100644 components/u-parse/components/wxParseTemplate9.vue create mode 100644 components/u-parse/components/wxParseVideo.vue create mode 100644 components/u-parse/libs/html2json.js create mode 100644 components/u-parse/libs/htmlparser.js create mode 100644 components/u-parse/libs/wxDiscode.js create mode 100644 components/u-parse/readme.md create mode 100644 components/u-parse/u-parse.css create mode 100644 components/u-parse/u-parse.vue create mode 100644 packages/article/article.vue diff --git a/components/lf-table.vue b/components/lf-table.vue index 37da317..baf813b 100644 --- a/components/lf-table.vue +++ b/components/lf-table.vue @@ -8,7 +8,7 @@ + :style="{height: formRowHeight,width: itemH.width+'rpx', border: border ? '1px solid #F6F6F6' : 'none', 'background-color': headBgColor}"> {{itemH.text}} @@ -18,7 +18,7 @@ - + {{itemC[itemH.key]}} @@ -64,6 +64,14 @@ rowHeight: { type: [String,Number], default: 80 + }, + border: { + type: Boolean, + default: true + }, + headBgColor: { + type: String, + default: '#f7f5f6' } }, data() { diff --git a/components/u-parse/components/wxParseAudio.vue b/components/u-parse/components/wxParseAudio.vue new file mode 100644 index 0000000..86df246 --- /dev/null +++ b/components/u-parse/components/wxParseAudio.vue @@ -0,0 +1,27 @@ + + + diff --git a/components/u-parse/components/wxParseImg.vue b/components/u-parse/components/wxParseImg.vue new file mode 100644 index 0000000..00747e4 --- /dev/null +++ b/components/u-parse/components/wxParseImg.vue @@ -0,0 +1,86 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate0.vue b/components/u-parse/components/wxParseTemplate0.vue new file mode 100644 index 0000000..0c76e74 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate0.vue @@ -0,0 +1,107 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate1.vue b/components/u-parse/components/wxParseTemplate1.vue new file mode 100644 index 0000000..a864f23 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate1.vue @@ -0,0 +1,99 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate10.vue b/components/u-parse/components/wxParseTemplate10.vue new file mode 100644 index 0000000..9a8d8b6 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate10.vue @@ -0,0 +1,97 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate11.vue b/components/u-parse/components/wxParseTemplate11.vue new file mode 100644 index 0000000..1402d11 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate11.vue @@ -0,0 +1,87 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate2.vue b/components/u-parse/components/wxParseTemplate2.vue new file mode 100644 index 0000000..d6d027d --- /dev/null +++ b/components/u-parse/components/wxParseTemplate2.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate3.vue b/components/u-parse/components/wxParseTemplate3.vue new file mode 100644 index 0000000..f899edd --- /dev/null +++ b/components/u-parse/components/wxParseTemplate3.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate4.vue b/components/u-parse/components/wxParseTemplate4.vue new file mode 100644 index 0000000..9bd558c --- /dev/null +++ b/components/u-parse/components/wxParseTemplate4.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate5.vue b/components/u-parse/components/wxParseTemplate5.vue new file mode 100644 index 0000000..4f6cc27 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate5.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate6.vue b/components/u-parse/components/wxParseTemplate6.vue new file mode 100644 index 0000000..4781c64 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate6.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate7.vue b/components/u-parse/components/wxParseTemplate7.vue new file mode 100644 index 0000000..1efc4dc --- /dev/null +++ b/components/u-parse/components/wxParseTemplate7.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate8.vue b/components/u-parse/components/wxParseTemplate8.vue new file mode 100644 index 0000000..2ac546f --- /dev/null +++ b/components/u-parse/components/wxParseTemplate8.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate9.vue b/components/u-parse/components/wxParseTemplate9.vue new file mode 100644 index 0000000..c771e5f --- /dev/null +++ b/components/u-parse/components/wxParseTemplate9.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseVideo.vue b/components/u-parse/components/wxParseVideo.vue new file mode 100644 index 0000000..a952f58 --- /dev/null +++ b/components/u-parse/components/wxParseVideo.vue @@ -0,0 +1,15 @@ + + + diff --git a/components/u-parse/libs/html2json.js b/components/u-parse/libs/html2json.js new file mode 100644 index 0000000..0927382 --- /dev/null +++ b/components/u-parse/libs/html2json.js @@ -0,0 +1,261 @@ +/** + * html2Json 改造来自: https://github.com/Jxck/html2json + * + * + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ + +import wxDiscode from './wxDiscode'; +import HTMLParser from './htmlparser'; + +function makeMap(str) { + const obj = {}; + const items = str.split(','); + for (let i = 0; i < items.length; i += 1) obj[items[i]] = true; + return obj; +} + +// Block Elements - HTML 5 +const block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); + +// Inline Elements - HTML 5 +const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); + +// Elements that you can, intentionally, leave open +// (and which close themselves) +const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + +function removeDOCTYPE(html) { + const isDocument = /([^]*)<\/body>/.test(html); + return isDocument ? RegExp.$1 : html; +} + +function trimHtml(html) { + return html + .replace(//gi, '') + .replace(/\/\*.*?\*\//gi, '') + .replace(/[ ]+/gi, '') + .replace(//gi, ''); +} + +function getScreenInfo() { + const screen = {}; + wx.getSystemInfo({ + success: (res) => { + screen.width = res.windowWidth; + screen.height = res.windowHeight; + }, + }); + return screen; +} + +function html2json(html, customHandler, imageProp, host) { + // 处理字符串 + html = removeDOCTYPE(html); + html = trimHtml(html); + html = wxDiscode.strDiscode(html); + // 生成node节点 + const bufArray = []; + const results = { + nodes: [], + imageUrls: [], + }; + + const screen = getScreenInfo(); + function Node(tag) { + this.node = 'element'; + this.tag = tag; + + this.$screen = screen; + } + + HTMLParser(html, { + start(tag, attrs, unary) { + // node for this element + const node = new Node(tag); + + if (bufArray.length !== 0) { + const parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + } + + if (block[tag]) { + node.tagType = 'block'; + } else if (inline[tag]) { + node.tagType = 'inline'; + } else if (closeSelf[tag]) { + node.tagType = 'closeSelf'; + } + + node.attr = attrs.reduce((pre, attr) => { + const { name } = attr; + let { value } = attr; + if (name === 'class') { + node.classStr = value; + } + // has multi attibutes + // make it array of attribute + if (name === 'style') { + node.styleStr = value; + } + if (value.match(/ /)) { + value = value.split(' '); + } + + // if attr already exists + // merge it + if (pre[name]) { + if (Array.isArray(pre[name])) { + // already array, push to last + pre[name].push(value); + } else { + // single value, make it array + pre[name] = [pre[name], value]; + } + } else { + // not exist, put it + pre[name] = value; + } + + return pre; + }, {}); + + // 优化样式相关属性 + if (node.classStr) { + node.classStr += ` ${node.tag}`; + } else { + node.classStr = node.tag; + } + if (node.tagType === 'inline') { + node.classStr += ' inline'; + } + + // 对img添加额外数据 + if (node.tag === 'img') { + let imgUrl = node.attr.src; + imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain); + Object.assign(node.attr, imageProp, { + src: imgUrl || '', + }); + if (imgUrl) { + results.imageUrls.push(imgUrl); + } + } + + // 处理a标签属性 + if (node.tag === 'a') { + node.attr.href = node.attr.href || ''; + } + + // 处理font标签样式属性 + if (node.tag === 'font') { + const fontSize = [ + 'x-small', + 'small', + 'medium', + 'large', + 'x-large', + 'xx-large', + '-webkit-xxx-large', + ]; + const styleAttrs = { + color: 'color', + face: 'font-family', + size: 'font-size', + }; + if (!node.styleStr) node.styleStr = ''; + Object.keys(styleAttrs).forEach((key) => { + if (node.attr[key]) { + const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key]; + node.styleStr += `${styleAttrs[key]}: ${value};`; + } + }); + } + + // 临时记录source资源 + if (node.tag === 'source') { + results.source = node.attr.src; + } + + if (customHandler.start) { + customHandler.start(node, results); + } + + if (unary) { + // if this tag doesn't have end tag + // like + // add to parents + const parent = bufArray[0] || results; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } else { + bufArray.unshift(node); + } + }, + end(tag) { + // merge into parent tag + const node = bufArray.shift(); + if (node.tag !== tag) { + console.error('invalid state: mismatch end tag'); + } + + // 当有缓存source资源时于于video补上src资源 + if (node.tag === 'video' && results.source) { + node.attr.src = results.source; + delete results.source; + } + + if (customHandler.end) { + customHandler.end(node, results); + } + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + const parent = bufArray[0]; + if (!parent.nodes) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + chars(text) { + if (!text.trim()) return; + + const node = { + node: 'text', + text, + }; + + if (customHandler.chars) { + customHandler.chars(node, results); + } + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + const parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + }); + + return results; +} + +export default html2json; diff --git a/components/u-parse/libs/htmlparser.js b/components/u-parse/libs/htmlparser.js new file mode 100644 index 0000000..2939da3 --- /dev/null +++ b/components/u-parse/libs/htmlparser.js @@ -0,0 +1,156 @@ +/** + * + * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser + * + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ +// Regular Expressions for parsing tags and attributes + +const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; +const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/; +const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; + +function makeMap(str) { + const obj = {}; + const items = str.split(','); + for (let i = 0; i < items.length; i += 1) obj[items[i]] = true; + return obj; +} + +// Empty Elements - HTML 5 +const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); + +// Block Elements - HTML 5 +const block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); + +// Inline Elements - HTML 5 +const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); + +// Elements that you can, intentionally, leave open +// (and which close themselves) +const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + +// Attributes that have their values filled in disabled="disabled" +const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); + +function HTMLParser(html, handler) { + let index; + let chars; + let match; + let last = html; + const stack = []; + + stack.last = () => stack[stack.length - 1]; + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + let pos; + if (!tagName) { + pos = 0; + } else { + // Find the closest opened tag of the same type + tagName = tagName.toLowerCase(); + for (pos = stack.length - 1; pos >= 0; pos -= 1) { + if (stack[pos] === tagName) break; + } + } + if (pos >= 0) { + // Close all the open elements, up the stack + for (let i = stack.length - 1; i >= pos; i -= 1) { + if (handler.end) handler.end(stack[i]); + } + + // Remove the open elements from the stack + stack.length = pos; + } + } + + function parseStartTag(tag, tagName, rest, unary) { + tagName = tagName.toLowerCase(); + + if (block[tagName]) { + while (stack.last() && inline[stack.last()]) { + parseEndTag('', stack.last()); + } + } + + if (closeSelf[tagName] && stack.last() === tagName) { + parseEndTag('', tagName); + } + + unary = empty[tagName] || !!unary; + + if (!unary) stack.push(tagName); + + if (handler.start) { + const attrs = []; + + rest.replace(attr, function genAttr(matches, name) { + const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : ''); + + attrs.push({ + name, + value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // " + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + } + } + + while (html) { + chars = true; + + if (html.indexOf(''); + str = str.replace(/•/g, '•'); + + return str; +} + +// HTML 支持的其他实体 +function strOtherDiscode(str) { + str = str.replace(/Œ/g, 'Œ'); + str = str.replace(/œ/g, 'œ'); + str = str.replace(/Š/g, 'Š'); + str = str.replace(/š/g, 'š'); + str = str.replace(/Ÿ/g, 'Ÿ'); + str = str.replace(/ƒ/g, 'ƒ'); + str = str.replace(/ˆ/g, 'ˆ'); + str = str.replace(/˜/g, '˜'); + str = str.replace(/ /g, ''); + str = str.replace(/ /g, ''); + str = str.replace(/ /g, ''); + str = str.replace(/‌/g, ''); + str = str.replace(/‍/g, ''); + str = str.replace(/‎/g, ''); + str = str.replace(/‏/g, ''); + str = str.replace(/–/g, '–'); + str = str.replace(/—/g, '—'); + str = str.replace(/‘/g, '‘'); + str = str.replace(/’/g, '’'); + str = str.replace(/‚/g, '‚'); + str = str.replace(/“/g, '“'); + str = str.replace(/”/g, '”'); + str = str.replace(/„/g, '„'); + str = str.replace(/†/g, '†'); + str = str.replace(/‡/g, '‡'); + str = str.replace(/•/g, '•'); + str = str.replace(/…/g, '…'); + str = str.replace(/‰/g, '‰'); + str = str.replace(/′/g, '′'); + str = str.replace(/″/g, '″'); + str = str.replace(/‹/g, '‹'); + str = str.replace(/›/g, '›'); + str = str.replace(/‾/g, '‾'); + str = str.replace(/€/g, '€'); + str = str.replace(/™/g, '™'); + + str = str.replace(/←/g, '←'); + str = str.replace(/↑/g, '↑'); + str = str.replace(/→/g, '→'); + str = str.replace(/↓/g, '↓'); + str = str.replace(/↔/g, '↔'); + str = str.replace(/↵/g, '↵'); + str = str.replace(/⌈/g, '⌈'); + str = str.replace(/⌉/g, '⌉'); + + str = str.replace(/⌊/g, '⌊'); + str = str.replace(/⌋/g, '⌋'); + str = str.replace(/◊/g, '◊'); + str = str.replace(/♠/g, '♠'); + str = str.replace(/♣/g, '♣'); + str = str.replace(/♥/g, '♥'); + + str = str.replace(/♦/g, '♦'); + str = str.replace(/'/g, "'"); + return str; +} + +function strDiscode(str) { + str = strNumDiscode(str); + str = strGreeceDiscode(str); + str = strcharacterDiscode(str); + str = strOtherDiscode(str); + return str; +} + +function urlToHttpUrl(url, domain) { + if (/^\/\//.test(url)) { + return `https:${url}`; + } else if (/^\//.test(url)) { + return `https://${domain}${url}`; + } + return url; +} + +export default { + strDiscode, + urlToHttpUrl, +}; diff --git a/components/u-parse/readme.md b/components/u-parse/readme.md new file mode 100644 index 0000000..f79b9c3 --- /dev/null +++ b/components/u-parse/readme.md @@ -0,0 +1,102 @@ +## uParse 适用于 uni-app/mpvue 的富文本解析组件 + +> 支持 Html、Markdown 解析,Fork自: [mpvue-wxParse](https://github.com/F-loat/mpvue-wxParse) + + +## 属性 + +| 名称 | 类型 | 默认值 | 描述 | +| -----------------|--------------- | ------------- | ---------------- | +| loading | Boolean | false | 数据加载状态 | +| className | String | — | 自定义 class 名称 | +| content | String | — | 渲染内容 | +| noData | String | 数据不能为空 | 空数据时的渲染展示 | +| startHandler | Function | 见源码 | 自定义 parser 函数 | +| endHandler | Function | null | 自定义 parser 函数 | +| charsHandler | Function | null | 自定义 parser 函数 | +| imageProp | Object | 见下文 | 图片相关参数 | + +### 自定义 parser 函数具体介绍 + +* 传入的参数为当前节点 `node` 对象及解析结果 `results` 对象,例如 `startHandler(node, results)` +* 无需返回值,通过对传入的参数直接操作来完成需要的改动 +* 自定义函数会在原解析函数处理之后执行 + +### imageProp 对象具体属性 + +| 名称 | 类型 | 默认值 | 描述 | +| -----------------|--------------- | ------------- | ------------------ | +| mode | String | 'aspectFit' | 图片裁剪、缩放的模式 | +| padding | Number | 0 | 图片内边距 | +| lazyLoad | Boolean | false | 图片懒加载 | +| domain | String | '' | 图片服务域名 | + +## 事件 + +| 名称 | 参数 | 描述 | +| -----------------|----------------- | ---------------- | +| preview | 图片地址,原始事件 | 预览图片时触发 | +| navigate | 链接地址,原始事件 | 点击链接时触发 | + +## 基本使用方法 + + +``` vue + + + + + +``` + + +## 渲染 Markdown + +> 先将 markdown 转换为 html 即可 + +``` +npm install marked +``` + +``` js +import marked from 'marked' +import uParse from '@/components/u-parse/u-parse.vue' + +export default { + components: { + uParse + }, + data () { + return { + article: marked(`#hello, markdown!`) + } + } +} +``` diff --git a/components/u-parse/u-parse.css b/components/u-parse/u-parse.css new file mode 100644 index 0000000..691993a --- /dev/null +++ b/components/u-parse/u-parse.css @@ -0,0 +1,232 @@ +/** + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ + +.wxParse { + width: 100%; + font-family: Helvetica, sans-serif; + font-size: 30upx; + color: #666; + line-height: 1.8; +} + +.wxParse view { + word-break: hyphenate; +} + +.wxParse .inline { + display: inline; + margin: 0; + padding: 0; +} + +.wxParse .div { + margin: 0; + padding: 0; +} + +.wxParse .h1 .text { + font-size: 2em; + margin: 0.67em 0; +} +.wxParse .h2 .text { + font-size: 1.5em; + margin: 0.83em 0; +} +.wxParse .h3 .text { + font-size: 1.17em; + margin: 1em 0; +} +.wxParse .h4 .text { + margin: 1.33em 0; +} +.wxParse .h5 .text { + font-size: 0.83em; + margin: 1.67em 0; +} +.wxParse .h6 .text { + font-size: 0.67em; + margin: 2.33em 0; +} + +.wxParse .h1 .text, +.wxParse .h2 .text, +.wxParse .h3 .text, +.wxParse .h4 .text, +.wxParse .h5 .text, +.wxParse .h6 .text, +.wxParse .b, +.wxParse .strong { + font-weight: bolder; +} + + +.wxParse .p { + margin: 1em 0; +} + +.wxParse .i, +.wxParse .cite, +.wxParse .em, +.wxParse .var, +.wxParse .address { + font-style: italic; +} + +.wxParse .pre, +.wxParse .tt, +.wxParse .code, +.wxParse .kbd, +.wxParse .samp { + font-family: monospace; +} +.wxParse .pre { + overflow: auto; + background: #f5f5f5; + padding: 16upx; + white-space: pre; + margin: 1em 0upx; +} +.wxParse .code { + display: inline; + background: #f5f5f5; +} + +.wxParse .big { + font-size: 1.17em; +} + +.wxParse .small, +.wxParse .sub, +.wxParse .sup { + font-size: 0.83em; +} + +.wxParse .sub { + vertical-align: sub; +} +.wxParse .sup { + vertical-align: super; +} + +.wxParse .s, +.wxParse .strike, +.wxParse .del { + text-decoration: line-through; +} + +.wxParse .strong, +.wxParse .s { + display: inline; +} + +.wxParse .a { + color: deepskyblue; +} + +.wxParse .video { + text-align: center; + margin: 22upx 0; +} + +.wxParse .video-video { + width: 100%; +} + +.wxParse .img { + display: inline-block; + width: 0; + height: 0; + max-width: 100%; + overflow: hidden; +} + +.wxParse .blockquote { + margin: 10upx 0; + padding: 22upx 0 22upx 22upx; + font-family: Courier, Calibri, "宋体"; + background: #f5f5f5; + border-left: 6upx solid #dbdbdb; +} +.wxParse .blockquote .p { + margin: 0; +} + +.wxParse .ul, .wxParse .ol { + display: block; + margin: 1em 0; + padding-left: 33upx; +} +.wxParse .ol { + list-style-type: disc; +} +.wxParse .ol { + list-style-type: decimal; +} +.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template { + display: list-item; + align-items: baseline; + text-align: match-parent; +} + +.wxParse .ol>.li,.wxParse .ul>.li { + display: list-item; + align-items: baseline; + text-align: match-parent; +} +.wxParse .ul .ul, .wxParse .ol .ul { + list-style-type: circle; +} +.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul { + list-style-type: square; +} + +.wxParse .u { + text-decoration: underline; +} +.wxParse .hide { + display: none; +} +.wxParse .del { + display: inline; +} +.wxParse .figure { + overflow: hidden; +} + +.wxParse .table { + width: 100%; +} +.wxParse .thead, .wxParse .tfoot, .wxParse .tr { + display: flex; + flex-direction: row; +} +.wxParse .tr { + width:100%; + display: flex; + border-right: 2upx solid #e0e0e0; + border-bottom: 2upx solid #e0e0e0; +} +.wxParse .th, +.wxParse .td { + display: flex; + width: 1276upx; + overflow: auto; + flex: 1; + padding: 11upx; + border-left: 2upx solid #e0e0e0; +} +.wxParse .td:last { + border-top: 2upx solid #e0e0e0; +} +.wxParse .th { + background: #f0f0f0; + border-top: 2upx solid #e0e0e0; +} diff --git a/components/u-parse/u-parse.vue b/components/u-parse/u-parse.vue new file mode 100644 index 0000000..494e60c --- /dev/null +++ b/components/u-parse/u-parse.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/packages/addAddress/addAddress.vue b/packages/addAddress/addAddress.vue index 38c6d64..f14c724 100644 --- a/packages/addAddress/addAddress.vue +++ b/packages/addAddress/addAddress.vue @@ -33,7 +33,6 @@ 保存 - @@ -134,14 +133,6 @@ border-radius: 10rpx; border: solid 2rpx rgb(231, 162, 63); } - .section_3 { - margin-top: 706rpx; - align-self: center; - background-color: rgb(0, 0, 0); - border-radius: 4rpx; - width: 196rpx; - height: 8rpx; - } .text_2 { color: rgb(51, 51, 51); font-size: 32rpx; diff --git a/packages/article/article.vue b/packages/article/article.vue new file mode 100644 index 0000000..b4441c3 --- /dev/null +++ b/packages/article/article.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/packages/sonpingDetail/expenseDetail.vue b/packages/sonpingDetail/expenseDetail.vue index ce3a216..356771a 100644 --- a/packages/sonpingDetail/expenseDetail.vue +++ b/packages/sonpingDetail/expenseDetail.vue @@ -12,63 +12,86 @@ - - - 评级费用 - - ¥120 - - - - - ANDRW WIGGINS - ¥40 - - - ANDRW WIGGINS - ¥40 - - - ANDRW WIGGINS - ¥40 - - - - - 其他费用 - - ¥0 - - - - - 费用名称 - 价格 - 数量 - 合计 - - + + + + + + + ANDRW WIGGINS + ¥40 + + + ANDRW WIGGINS + ¥40 + + + ANDRW WIGGINS + ¥40 + + + + + + + + + + + + + - - \ No newline at end of file diff --git a/packages/sonpingDetail/ratingTrajectory.vue b/packages/sonpingDetail/ratingTrajectory.vue index 8ad9204..fc2384a 100644 --- a/packages/sonpingDetail/ratingTrajectory.vue +++ b/packages/sonpingDetail/ratingTrajectory.vue @@ -6,24 +6,32 @@ 发货单号: 9847583947839743-1 - - 客服电话: - 010737488947 - + + 客服电话: + 07715454545 + - - - - - 发货,您的包裹已邮寄,请注意查收 - - 2022-03-16 16:27 - - + + + + + + + + + + + + + + + + + + + + + @@ -35,7 +43,7 @@ }; - \ No newline at end of file diff --git a/packages/sonpingDetail/sonpingDetail.vue b/packages/sonpingDetail/sonpingDetail.vue index 4bbc314..42f1a4b 100644 --- a/packages/sonpingDetail/sonpingDetail.vue +++ b/packages/sonpingDetail/sonpingDetail.vue @@ -31,17 +31,17 @@ - - 收货人: - 李丽丽 - 15273936409 + + 收货人: + 李丽丽 + 15273936409 - 北京北京市海淀区钻石大厦C座 + 北京北京市海淀区钻石大厦C座 @@ -69,7 +69,7 @@ 送评信息 - + 寄送藏品: 顺丰 SF137843938493 @@ -109,19 +109,22 @@ - + 更改地址 @@ -135,8 +138,23 @@ @@ -259,7 +277,10 @@ font-size: 32rpx; font-weight: 500; line-height: 44rpx; - white-space: nowrap; + width: 100%; + box-sizing: border-box; + padding-left: 160rpx; + padding-right: 32rpx; } .text_14 { margin-left: 66rpx; @@ -286,6 +307,10 @@ font-weight: 500; line-height: 44rpx; white-space: nowrap; + overflow:hidden; + text-overflow:ellipsis; + width: 522rpx; + display: inline-block; } .text_21 { color: rgb(119, 119, 119); @@ -392,6 +417,11 @@ } .text_13 { margin-left: 10rpx; + display: inline-block; + width: 586rpx; + white-space:nowrap; + overflow:hidden; + text-overflow:ellipsis; } .image_11 { margin-top: 10rpx; @@ -427,7 +457,6 @@ .section_5 { margin-top: 40rpx; align-self: center; - background-color: rgb(0, 0, 0); border-radius: 4rpx; width: 196rpx; height: 8rpx; @@ -446,6 +475,9 @@ font-weight: 500; line-height: 44rpx; white-space: nowrap; + max-width: 280rpx; + overflow:hidden; + text-overflow:ellipsis; } .text_11 { margin-left: 30rpx; diff --git a/packages/sonpingDetail/viewDetail.vue b/packages/sonpingDetail/viewDetail.vue index 6115e4e..b28d7f8 100644 --- a/packages/sonpingDetail/viewDetail.vue +++ b/packages/sonpingDetail/viewDetail.vue @@ -7,14 +7,17 @@ @@ -88,14 +91,17 @@ @@ -110,6 +116,14 @@ data() { return {}; }, + methods: { + previewImage(){ + uni.previewImage({ + urls: ['https://codefun-proj-user-res-1256085488.cos.ap-guangzhou.myqcloud.com/62677e395a7e3f03107ffc5f/62677e4a35a7e10011e93a80/16509497768927244914.png'], + current: 0 + }) + } + } }; @@ -431,7 +445,6 @@ .section_5 { margin-top: 40rpx; align-self: center; - background-color: rgb(0, 0, 0); border-radius: 4rpx; width: 196rpx; height: 8rpx; diff --git a/pages.json b/pages.json index a91f0ee..bae921f 100644 --- a/pages.json +++ b/pages.json @@ -111,6 +111,12 @@ "navigationBarTitleText": "评级轨迹", "enablePullDownRefresh": false } + },{ + "path": "article/article", + "style": { + "navigationBarTitleText": "", + "enablePullDownRefresh": false + } }] }], "globalStyle": { diff --git a/pages/ratingQuery/ratingQuery.vue b/pages/ratingQuery/ratingQuery.vue index c1100ee..34951e5 100644 --- a/pages/ratingQuery/ratingQuery.vue +++ b/pages/ratingQuery/ratingQuery.vue @@ -3,13 +3,12 @@ - + 搜索 - @@ -18,13 +17,20 @@ export default { data() { return { - value: '' + value: '', + inputFocus: true }; }, methods: { search(){ console.log('搜索', this.value); this.$url('/packages/ratingQueryDetail/ratingQueryDetail'); + }, + focusEvent(){ + this.inputFocus = true; + }, + blurEvent(){ + this.inputFocus = false; } } }; @@ -52,14 +58,6 @@ background-color: rgb(246, 246, 246); border-radius: 10rpx; } - .section_4 { - margin-top: 1296rpx; - align-self: center; - background-color: rgb(0, 0, 0); - border-radius: 4rpx; - width: 196rpx; - height: 8rpx; - } .search { margin-left: 31rpx; margin-right: 6rpx;