From a31fc3c1e6fd7dc550c52348d5c3c4be6f120cdc Mon Sep 17 00:00:00 2001 From: zoujiandong <10130823232@qq.com> Date: Fri, 13 Jun 2025 19:09:30 +0800 Subject: [PATCH] 6.13 --- api/api.js | 20 +- components/navBarSearch/navBarSearch.vue | 2 + .../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 +++++ main.js | 4 +- pages.json | 21 + pages/case/case.vue | 18 +- pages/caseTalk/caseTalk.vue | 9 +- pages/certImg/certImg.vue | 32 ++ pages/certList/certList.vue | 152 ++---- pages/detail/detail.vue | 340 ++++++++++--- pages/index/index.vue | 44 +- pages/login/login.vue | 1 + pages/my/my.vue | 2 +- pages/search/search.vue | 459 ++++++++++++++++-- pages/searchList/searchList.vue | 277 +---------- pages/sickList/sickList.vue | 455 +++++++++++++++++ pages/specialList/specialList.vue | 102 +++- pages/videoList/videoList.vue | 391 +++++++++++++++ static/caseIcon.png | Bin 0 -> 438 bytes utils/navTo.js | 47 +- 40 files changed, 4210 insertions(+), 532 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 pages/certImg/certImg.vue create mode 100644 pages/sickList/sickList.vue create mode 100644 pages/videoList/videoList.vue create mode 100644 static/caseIcon.png diff --git a/api/api.js b/api/api.js index 6c7c2aa..f69c699 100644 --- a/api/api.js +++ b/api/api.js @@ -18,6 +18,7 @@ const api = { getHomeStatics(data) { //首页统计数据 return request('/clinical/stats', data, 'get', true); }, + getArticleDetail(id) { //获取详情 return request('/clinical/article/'+id,{}, 'get', false); }, @@ -82,6 +83,9 @@ const api = { getStaticDoctor(id){ return request('/clinical/stats/doctor/'+id,{}, 'get',false); }, + getStaticSick(data) { //首页统计数据 + return request('/clinical/stats/label', data, 'get', false); + }, getStaticHospital(id){ return request('/clinical/stats/hospital/'+id, {}, 'get',false); }, @@ -152,7 +156,7 @@ const api = { return request('/user/collect/search',data, 'post',false,'application/json'); }, getMyRead(data){ - return request('/user/case/read/search',data, 'post',false,'application/json'); + return request('/user/case/read/search',data, 'post',true,'application/json'); }, getOss(data){ return request('/sign/oss',data, 'get', false); @@ -160,11 +164,21 @@ const api = { getCaseLabel(data){ return request('/case/label',data,'get', false); }, - + getSearchLabel(data){ + return request('/clinical/label/search',data,'post', true,'application/json'); + }, + addVote(id,data){ + return request('/exchange/vote/'+id,data,'post',true,'application/json'); + }, ossUpload(url,data){ return request(url,data,'post','multipart/form-data') }, - + getUserPoint(data){ + return request('/user/point',data,'get'); + }, + givePoint(data){ + return request('/reward',data,'post',true); + } } diff --git a/components/navBarSearch/navBarSearch.vue b/components/navBarSearch/navBarSearch.vue index d97d046..4017d61 100644 --- a/components/navBarSearch/navBarSearch.vue +++ b/components/navBarSearch/navBarSearch.vue @@ -59,6 +59,8 @@ watch(()=>props.type,(newVal)=>{ placeholder.value='输入医生姓名' }else if(newVal==='hospital'){ placeholder.value='输入医院名称' + }else if(newVal==='video' || newVal==='article' || newVal==='case' ){ + placeholder.value='搜索疾病、症状、医院' } },{immediate: true }) 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/main.js b/main.js index 3861bf2..182c56d 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,7 @@ import App from './App' +import navTo from './utils/navTo' import uviewPlus, { setConfig } from 'uview-plus' // #ifndef VUE3 -console.log(222) import Vue from 'vue' import './uni.promisify.adaptor' Vue.config.productionTip = false @@ -16,6 +16,7 @@ app.$mount() import { createSSRApp } from 'vue' export function createApp() { const app = createSSRApp(App) + app.use(uviewPlus, () => { return { options: { @@ -28,6 +29,7 @@ export function createApp() { } }) console.log(uni.$u.config.v); + app.config.globalProperties.$navTo = navTo return { app } diff --git a/pages.json b/pages.json index 51a14ac..3313972 100644 --- a/pages.json +++ b/pages.json @@ -27,6 +27,27 @@ "navigationStyle": "custom" } }, + { + "path": "pages/certImg/certImg", + "style": { + "navigationBarTitleText": "uni-app", + "navigationStyle": "custom" + } + }, + { + "path": "pages/sickList/sickList", + "style": { + "navigationBarTitleText": "uni-app", + "navigationStyle": "custom" + } + }, + { + "path": "pages/videoList/videoList", + "style": { + "navigationBarTitleText": "uni-app", + "navigationStyle": "custom" + } + }, { "path": "pages/login/login", "style": { diff --git a/pages/case/case.vue b/pages/case/case.vue index 614d59d..224cf72 100644 --- a/pages/case/case.vue +++ b/pages/case/case.vue @@ -1,7 +1,7 @@ @@ -131,7 +150,7 @@ \ No newline at end of file diff --git a/static/caseIcon.png b/static/caseIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..e60a6197c9830c801bca23be29e9f854a7f5abaa GIT binary patch literal 438 zcmV;n0ZIOeP)Px$a7jc#R9Hu2WEfz;IKcKZj5=U61O`V47#pXtN+|uA!oa|&&%i*3gvrS8@W=1p znS0kSdJ7H#pWp6s<}|6?fHwsvkm*a2Rl2@;G9%%>R`7-Z<Mxf4M`3GP}cm$ z$m8;#fsqF}g#Z6#{Pp+quYJ3AE&fVG$itP8>;RvTq>29-8S}7N^8f$;UE9{obEl~T zyhD;#F)%WOVs`+;rEP2Gf~s_)0m&f%t~viRWig;d0VCu8pN#+hE!@0z!40BqAFYf= gLtr!n215t{08(6MAl-Z6761SM07*qoM6N<$g0DBp;s5{u literal 0 HcmV?d00001 diff --git a/utils/navTo.js b/utils/navTo.js index 5033b35..b190b98 100644 --- a/utils/navTo.js +++ b/utils/navTo.js @@ -1,22 +1,35 @@ import pageUrl from './pageUrl' -function navTo(obj){ - // let token=''; - // if(process.env.NODE_ENV === 'development'){ - // token = uni.getStorageSync('DEV_AUTH_TOKEN_CASEDATA'); - // }else{ - // token = uni.getStorageSync('AUTH_TOKEN_CASEDATA'); - // } - // if(!token){ - // let page_url=pageUrl(); - // uni.setStorageSync('redirectUrl',page_url); - // uni.navigateTo({ - // url: '/pages/login/login?redirectUrl=has' - // }); - // }else{ - // uni.navigateTo(obj) - // } - uni.navigateTo(obj) + +function navTo(obj) { + let token = ''; + if (process.env.NODE_ENV === 'development') { + token = uni.getStorageSync('DEV_AUTH_TOKEN_CASEDATA'); + } else { + token = uni.getStorageSync('AUTH_TOKEN_CASEDATA'); + } + if (!token) { + let page_url = pageUrl(); + uni.setStorageSync('redirectUrl', page_url); + uni.navigateTo({ + url: '/pages/login/login?redirectUrl=has' + }); + } else { + // # ifdef MP-WEIXIN + const pages = getCurrentPages(); + let len = pages.length; + if (len < 10) { + uni.navigateTo(obj) + } else { + uni.redirectTo(obj) + } + // # endif + + // # ifdef H5 + uni.navigateTo(obj) + //# endif + } + } export default navTo \ No newline at end of file