From 1b52c78fe721985c0c6b8dd0ae94cc9d41090dec Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Mon, 5 Aug 2024 14:25:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E9=97=BB=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 18 ++ App.vue | 53 +++++ LICENSE | 21 ++ README.md | 22 ++ changelog.md | 23 +++ common/html-parser.js | 352 ++++++++++++++++++++++++++++++++ common/util.js | 52 +++++ components/nodata.nvue | 188 +++++++++++++++++ components/uni-list.vue | 130 ++++++++++++ components/uni-load-more.vue | 381 +++++++++++++++++++++++++++++++++++ components/uni-refresh.wxs | 85 ++++++++ h5.template.html | 45 +++++ index.html | 20 ++ main.js | 26 +++ manifest.json | 108 ++++++++++ package.json | 20 ++ pages.json | 32 +++ pages/news/detail.nvue | 178 ++++++++++++++++ pages/news/index.nvue | 381 +++++++++++++++++++++++++++++++++++ pages/news/news-item.nvue | 198 ++++++++++++++++++ pages/news/news-page.nvue | 316 +++++++++++++++++++++++++++++ pages/ucenter/ucenter.nvue | 188 +++++++++++++++++ responsive/right-window.vue | 29 +++ static/app-icon.png | Bin 0 -> 9167 bytes static/center-active.png | Bin 0 -> 3075 bytes static/center.png | Bin 0 -> 1211 bytes static/home-active.png | Bin 0 -> 3732 bytes static/home.png | Bin 0 -> 3469 bytes static/logo.png | Bin 0 -> 4577 bytes static/text-icon.ttf | Bin 0 -> 3512 bytes uni.scss | 76 +++++++ 31 files changed, 2942 insertions(+) create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 LICENSE create mode 100644 README.md create mode 100644 changelog.md create mode 100644 common/html-parser.js create mode 100644 common/util.js create mode 100644 components/nodata.nvue create mode 100644 components/uni-list.vue create mode 100644 components/uni-load-more.vue create mode 100644 components/uni-refresh.wxs create mode 100644 h5.template.html create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/news/detail.nvue create mode 100644 pages/news/index.nvue create mode 100644 pages/news/news-item.nvue create mode 100644 pages/news/news-page.nvue create mode 100644 pages/ucenter/ucenter.nvue create mode 100644 responsive/right-window.vue create mode 100644 static/app-icon.png create mode 100644 static/center-active.png create mode 100644 static/center.png create mode 100644 static/home-active.png create mode 100644 static/home.png create mode 100644 static/logo.png create mode 100644 static/text-icon.ttf create mode 100644 uni.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6be0179 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Mac +.DS_Store +**/.DS_Store + +# vim/vi +*.swp + +# JavaScript +node_modules/ +.node_modules/ +.eslintcache +unpackage/dist/build/ +unpackage/dist/dev/ + +# python +*.pyc +/.hbuilderx/ +/unpackage/ diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..f4c87f2 --- /dev/null +++ b/App.vue @@ -0,0 +1,53 @@ + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..38d423d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 DCloud + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb72d4f --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# uni-template-news +基于uni-app开发的新闻/资讯类App模板 + +## 体验方式 +同步/下载项目后,拖入 HBuilderX 中即可运行体验。 + +## 特点 +* 兼容多个平台 +* 自定义组件实现顶部选项卡切换 +* App 平台使用 nvue 进一步优化体验 + +### 平台支持 +* app-vue +* app-nvue +* H5 +* 微信小程序 +* 支付宝小程序 +* 百度小程序 +* 头条小程序 + +## 注意事项 +* 非 App-nvue 平台暂不支持下拉刷新 diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..2e0852e --- /dev/null +++ b/changelog.md @@ -0,0 +1,23 @@ +## 3.1.7(2022-06-30) +- 新增 支持 ios 安全区 +## 3.1.6(2022-02-08) +- 移除无效的H5平台百度统计 +## 3.1.5(2021-11-26) +- 新增 小程序平台支持VUE3 (HBuilderX 3.3+) +- 修复 某些情况下无法滚动的问题 +## 3.1.4(2021-07-30) +- 适配 VUE3 (需要 HBuilderX 3.2.0+) +## 3.1.3(2021-07-28) +- 适配 VUE3 (需要 HBuilderX 3.2.0+) +## 3.0.0(2021-02-19) +- 修复 某些操作导致上拉加载无效的问题 +## 2.9.5(2020-10-23) +- 修复 app 平台 ios 顶部页签高度显示不正确的问题 +## 2.9.2(2020-09-27) +- 修复app平台运行时出错的bug +## 2.9.1(2020-09-27) +- 修复加载更多文字过大问题 +## 2.9.0(2020-09-25) +- 适配大屏 +## 2.4.2(2019-11-18) +- 重构代码,支持编译到所有平台 \ No newline at end of file diff --git a/common/html-parser.js b/common/html-parser.js new file mode 100644 index 0000000..20a89b2 --- /dev/null +++ b/common/html-parser.js @@ -0,0 +1,352 @@ +/* + * HTML5 Parser By Sam Blowes + * + * Designed for HTML5 documents + * + * Original code by John Resig (ejohn.org) + * http://ejohn.org/blog/pure-javascript-html-parser/ + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * + * ---------------------------------------------------------------------------- + * License + * ---------------------------------------------------------------------------- + * + * This code is triple licensed using Apache Software License 2.0, + * Mozilla Public License or GNU Public License + * + * //////////////////////////////////////////////////////////////////////////// + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * //////////////////////////////////////////////////////////////////////////// + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is Simple HTML Parser. + * + * The Initial Developer of the Original Code is Erik Arvidsson. + * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights + * Reserved. + * + * //////////////////////////////////////////////////////////////////////////// + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ---------------------------------------------------------------------------- + * Usage + * ---------------------------------------------------------------------------- + * + * // Use like so: + * HTMLParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * // or to get an XML string: + * HTMLtoXML(htmlString); + * + * // or to get an XML DOM Document + * HTMLtoDOM(htmlString); + * + * // or to inject into an existing document/DOM node + * HTMLtoDOM(htmlString, document); + * HTMLtoDOM(htmlString, document.body); + * + */ +// Regular Expressions for parsing tags and attributes +var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; +var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/; +var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5 + +var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); // Block Elements - HTML 5 +// fixed by xxx 将 ins 标签从块级名单中移除 + +var block = makeMap('a,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,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 + +var inline = makeMap('abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,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) + +var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled" + +var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); // Special Elements (can contain anything) + +var special = makeMap('script,style'); +function HTMLParser(html, handler) { + var index; + var chars; + var match; + var stack = []; + var last = html; + + stack.last = function () { + return this[this.length - 1]; + }; + + while (html) { + chars = true; // Make sure we're not in a script or style element + + if (!stack.last() || !special[stack.last()]) { + // Comment + if (html.indexOf(''); + + if (index >= 0) { + if (handler.comment) { + handler.comment(html.substring(4, index)); + } + + html = html.substring(index + 3); + chars = false; + } // end tag + + } else if (html.indexOf(']*>'), function (all, text) { + text = text.replace(/|/g, '$1$2'); + + if (handler.chars) { + handler.chars(text); + } + + return ''; + }); + parseEndTag('', stack.last()); + } + + if (html == last) { + throw 'Parse Error: ' + html; + } + + last = html; + } // Clean up any remaining tags + + + parseEndTag(); + + 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) { + var attrs = []; + rest.replace(attr, function (match, name) { + var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[name] ? name : ''; + attrs.push({ + name: name, + value: value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // " + + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + } + } + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + if (!tagName) { + var pos = 0; + } // Find the closest opened tag of the same type + else { + for (var pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos] == tagName) { + break; + } + } + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (var i = stack.length - 1; i >= pos; i--) { + if (handler.end) { + handler.end(stack[i]); + } + } // Remove the open elements from the stack + + + stack.length = pos; + } + } +} + +function makeMap(str) { + var obj = {}; + var items = str.split(','); + + for (var i = 0; i < items.length; i++) { + obj[items[i]] = true; + } + + return obj; +} + +function removeDOCTYPE(html) { + return html.replace(/<\?xml.*\?>\n/, '').replace(/\n/, '').replace(/\n/, ''); +} + +function parseAttrs(attrs) { + return attrs.reduce(function (pre, attr) { + var value = attr.value; + var name = attr.name; + + if (pre[name]) { + pre[name] = pre[name] + " " + value; + } else { + pre[name] = value; + } + + return pre; + }, {}); +} + +function parseHtml(html) { + html = removeDOCTYPE(html); + var stacks = []; + var results = { + node: 'root', + children: [] + }; + HTMLParser(html, { + start: function start(tag, attrs, unary) { + var node = { + name: tag + }; + + if (attrs.length !== 0) { + node.attrs = parseAttrs(attrs); + } + + if (unary) { + var parent = stacks[0] || results; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } else { + stacks.unshift(node); + } + }, + end: function end(tag) { + var node = stacks.shift(); + if (node.name !== tag) console.error('invalid state: mismatch end tag'); + + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + chars: function chars(text) { + var node = { + type: 'text', + text: text + }; + + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + comment: function comment(text) { + var node = { + node: 'comment', + text: text + }; + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }); + return results.children; +} + +export default parseHtml; diff --git a/common/util.js b/common/util.js new file mode 100644 index 0000000..13f40f6 --- /dev/null +++ b/common/util.js @@ -0,0 +1,52 @@ +function friendlyDate(timestamp) { + var formats = { + 'year': '%n% 年前', + 'month': '%n% 月前', + 'day': '%n% 天前', + 'hour': '%n% 小时前', + 'minute': '%n% 分钟前', + 'second': '%n% 秒前', + }; + + var now = Date.now(); + var seconds = Math.floor((now - timestamp) / 1000); + var minutes = Math.floor(seconds / 60); + var hours = Math.floor(minutes / 60); + var days = Math.floor(hours / 24); + var months = Math.floor(days / 30); + var years = Math.floor(months / 12); + + var diffType = ''; + var diffValue = 0; + if (years > 0) { + diffType = 'year'; + diffValue = years; + } else { + if (months > 0) { + diffType = 'month'; + diffValue = months; + } else { + if (days > 0) { + diffType = 'day'; + diffValue = days; + } else { + if (hours > 0) { + diffType = 'hour'; + diffValue = hours; + } else { + if (minutes > 0) { + diffType = 'minute'; + diffValue = minutes; + } else { + diffType = 'second'; + diffValue = seconds === 0 ? (seconds = 1) : seconds; + } + } + } + } + } + return formats[diffType].replace('%n%', diffValue); +} +export { + friendlyDate +} diff --git a/components/nodata.nvue b/components/nodata.nvue new file mode 100644 index 0000000..fae9977 --- /dev/null +++ b/components/nodata.nvue @@ -0,0 +1,188 @@ + + + + + diff --git a/components/uni-list.vue b/components/uni-list.vue new file mode 100644 index 0000000..ab9586c --- /dev/null +++ b/components/uni-list.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/components/uni-load-more.vue b/components/uni-load-more.vue new file mode 100644 index 0000000..8a052ee --- /dev/null +++ b/components/uni-load-more.vue @@ -0,0 +1,381 @@ + + + + + \ No newline at end of file diff --git a/components/uni-refresh.wxs b/components/uni-refresh.wxs new file mode 100644 index 0000000..4e1a1fa --- /dev/null +++ b/components/uni-refresh.wxs @@ -0,0 +1,85 @@ +var pullDown = { + threshold: 95, + maxHeight: 200, + callRefresh: 'onrefresh', + callPullingDown: 'onpullingdown', + refreshSelector: '.uni-refresh' +}; + +function ready(newValue, oldValue, ownerInstance, instance) { + var state = instance.getState() + state.canPullDown = newValue; + console.log(newValue); +} + +function touchStart(e, instance) { + var state = instance.getState(); + state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); + state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); + if (!state.canPullDown) { + return + } + + state.height = 0; + state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; + state.refreshInstance.setStyle({ + 'height': 0 + }); + state.refreshInstance.callMethod("onchange", true); +} + +function touchMove(e, ownerInstance) { + var instance = e.instance; + var state = instance.getState(); + if (!state.canPullDown) { + return + } + + var oldHeight = state.height; + var endY = e.touches[0].pageY || e.changedTouches[0].pageY; + var height = endY - state.touchStartY; + if (height > pullDown.maxHeight) { + return; + } + + var refreshInstance = state.refreshInstance; + refreshInstance.setStyle({ + 'height': height + 'px' + }); + + height = height < pullDown.maxHeight ? height : pullDown.maxHeight; + state.height = height; + refreshInstance.callMethod(pullDown.callPullingDown, { + height: height + }); +} + +function touchEnd(e, ownerInstance) { + var state = e.instance.getState(); + if (!state.canPullDown) { + return + } + + state.refreshInstance.callMethod("onchange", false); + + var refreshInstance = state.refreshInstance; + if (state.height > pullDown.threshold) { + refreshInstance.callMethod(pullDown.callRefresh); + return; + } + + refreshInstance.setStyle({ + 'height': 0 + }); +} + +function propObserver(newValue, oldValue, instance) { + pullDown = newValue; +} + +module.exports = { + touchmove: touchMove, + touchstart: touchStart, + touchend: touchEnd, + propObserver: propObserver +} diff --git a/h5.template.html b/h5.template.html new file mode 100644 index 0000000..581f248 --- /dev/null +++ b/h5.template.html @@ -0,0 +1,45 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..18e8362 --- /dev/null +++ b/main.js @@ -0,0 +1,26 @@ +import App from './App.vue' + +const host = 'https://unidemo.dcloud.net.cn/'; + +// #ifndef VUE3 +import Vue from 'vue' +Vue.config.productionTip = false +Vue.prototype.$host = host; +App.mpType = 'app' +const app = new Vue({ + ...App +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { + createSSRApp +} from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..b58c480 --- /dev/null +++ b/manifest.json @@ -0,0 +1,108 @@ +{ + "name" : "news", + "appid" : "__UNI__8C5575B", + "description" : "基于uni-app开发的新闻/资讯类App模板", + "versionName" : "3.1.23", + "versionCode" : 1, + "transformPx" : false, + "uniStatistics" : { + "enable" : false + }, + "compatConfig" : { + "MODE" : 2 // 2代表兼容Vue2模式,3代表非兼容Vue2模式 + }, + "app-plus" : { + "usingComponents" : true, + "nvueCompiler" : "uni-app", + /* 5+App特有相关 */ + "modules" : {}, + /* 模块配置 */ + "distribute" : { + /* 应用发布信息 */ + "android" : { + /* android打包配置 */ + "permissions" : [ + "", + "", + "", + "", + "", + "" + ], + "permissionPhoneState" : { + "request" : "none" + }, + "abiFilters" : [ "armeabi-v7a" ] + }, + "ios" : { + "idfa" : false + }, + /* ios打包配置 */ + "sdkConfigs" : { + "ad" : {} + }, + "icons" : { + "android" : { + "hdpi" : "unpackage/res/icons/72x72.png", + "xhdpi" : "unpackage/res/icons/96x96.png", + "xxhdpi" : "unpackage/res/icons/144x144.png", + "xxxhdpi" : "unpackage/res/icons/192x192.png" + }, + "ios" : { + "appstore" : "unpackage/res/icons/1024x1024.png", + "ipad" : { + "app" : "unpackage/res/icons/76x76.png", + "app@2x" : "unpackage/res/icons/152x152.png", + "notification" : "unpackage/res/icons/20x20.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "proapp@2x" : "unpackage/res/icons/167x167.png", + "settings" : "unpackage/res/icons/29x29.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "spotlight" : "unpackage/res/icons/40x40.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png" + }, + "iphone" : { + "app@2x" : "unpackage/res/icons/120x120.png", + "app@3x" : "unpackage/res/icons/180x180.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "notification@3x" : "unpackage/res/icons/60x60.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "settings@3x" : "unpackage/res/icons/87x87.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png", + "spotlight@3x" : "unpackage/res/icons/120x120.png" + } + } + } + } + }, + "quickapp" : {}, + "mp-weixin" : { + "appid" : "wxabb93d365d4475a4", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "h5" : { + "router" : { + "base" : "./", + "mode" : "hash" + }, + "template" : "h5.template.html", + "optimization" : { + "treeShaking" : { + "enable" : true + } + } + }, + "vueVersion" : "3" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e6fc176 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "id": "uni-template-news", + "name": "新闻资讯App模板", + "displayName": "新闻资讯App模板", + "version": "3.1.7", + "description": "基于uni-app开发的新闻/资讯类App模板", + "keywords": [ + "模板", + "新闻", + "资讯", + "nvue", + "新闻模板" + ], + "dcloudext": { + "category": [ + "前端页面模板", + "uni-app前端项目模板" + ] + } +} \ No newline at end of file diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..d4a57e6 --- /dev/null +++ b/pages.json @@ -0,0 +1,32 @@ +{ + "pages": [{ + "path": "pages/news/index", + "style": {} + }, + { + "path": "pages/news/detail", + "style": { + "app-plus": { + "titleNView": { + "type": "transparent" + } + } + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "white", + "navigationBarTitleText": "新闻资讯", + "navigationBarBackgroundColor": "#2F85FC", + "backgroundColor": "#FFFFFF" + }, + "rightWindow": { + "path": "responsive/right-window.vue", + "style": { + "width": "calc(100vw - 450px)" + }, + "matchMedia": { + "minWidth": 768 + } + } +} diff --git a/pages/news/detail.nvue b/pages/news/detail.nvue new file mode 100644 index 0000000..da5c6a0 --- /dev/null +++ b/pages/news/detail.nvue @@ -0,0 +1,178 @@ + + + + + diff --git a/pages/news/index.nvue b/pages/news/index.nvue new file mode 100644 index 0000000..bb76bc6 --- /dev/null +++ b/pages/news/index.nvue @@ -0,0 +1,381 @@ + + + + + diff --git a/pages/news/news-item.nvue b/pages/news/news-item.nvue new file mode 100644 index 0000000..f0990e9 --- /dev/null +++ b/pages/news/news-item.nvue @@ -0,0 +1,198 @@ + + + + + diff --git a/pages/news/news-page.nvue b/pages/news/news-page.nvue new file mode 100644 index 0000000..1a00c81 --- /dev/null +++ b/pages/news/news-page.nvue @@ -0,0 +1,316 @@ + + + + + \ No newline at end of file diff --git a/pages/ucenter/ucenter.nvue b/pages/ucenter/ucenter.nvue new file mode 100644 index 0000000..5dcc717 --- /dev/null +++ b/pages/ucenter/ucenter.nvue @@ -0,0 +1,188 @@ + + + + + diff --git a/responsive/right-window.vue b/responsive/right-window.vue new file mode 100644 index 0000000..fae1f53 --- /dev/null +++ b/responsive/right-window.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/static/app-icon.png b/static/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5a83cc37723b9eaa07018694607c6de62e3859 GIT binary patch literal 9167 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 U(`ylKidZ|Tq literal 0 HcmV?d00001 diff --git a/static/center-active.png b/static/center-active.png new file mode 100644 index 0000000000000000000000000000000000000000..43aa282367464fafff40c2f8f0c373d52851dde8 GIT binary patch literal 3075 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 Rvg!Z;002ovPDHLkV1kMB&1?Vw literal 0 HcmV?d00001 diff --git a/static/center.png b/static/center.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3edcf38def49eb13ef4815ae98d622bf56e226 GIT binary patch literal 1211 zcmV;s1VsCZP)8{hRYCSi2~_C><(Wo(LXx`5~kU;!iy=EY~&2p=>W zunO+P;&>DB;!lk-I#r>W@ibP(d)N?Pwkj_Cv*SsufQPUJ{%(=g#RI3~c>ID@@pg;C zA$SvluVN1DgX>!4wE|cWA7Z91%0@73e_VyHv1m#BDjcl<&d1@Uj;~&&p^hoZ{4SQj zA-JUOG0i#fMQKnwmISQTQ^R)z&ckEaxaNWIw0Iy@<0brwBwy#+J&bYb+<8HfKR3Rw z0nq{=P3Y#*sMe?v-ht;n5QRsY+MZh-d+j+Mgb9YZ=~ZRWOHDd_ z(}>aqK$I_4%4xu41kO^QA*_XVDorsJCks)=hg>e2s4IXdi3hS1FIl#z>v1wZ>0`k% zWhBY@CG%3ItGA2({B4+*DSH9~ilCfV<zVI&Vhx zj4G){dmv+V71eqmD_)XynT^5IS#m_G0k8>fDOb1% zzZl0LchIq<9LzEU^{QBoW;>K-Ijo+M07PJ>!-LAx&F<}pE?&M7bCxhoZ%L^gGE9d9 zutDjPacSoS>j)r^bg{A=4_06BH9R}%NKiDG@RBWK5)A8$a$k!b+N+d)+xNOEk6J4zmmw~-_1OY@9v z*_~5th76(JhlYt{_+VRddY`=g4b=y-Sm$(-W-^iJ9bAaZ2O3o~3r!>t|FdNpfGO>s Ze*i0L+A#`?48{Ne002ovPDHLkV1fxqJ`Ml? literal 0 HcmV?d00001 diff --git a/static/home-active.png b/static/home-active.png new file mode 100644 index 0000000000000000000000000000000000000000..31c0759d5423ae27ec6735795ad5ab4afda0def8 GIT binary patch literal 3732 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 literal 0 HcmV?d00001 diff --git a/static/home.png b/static/home.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee7ecb55ac37ef21c6adc430f57be33a65fbea6 GIT binary patch literal 3469 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 LNkvXXu0mjfThfl& literal 0 HcmV?d00001 diff --git a/static/text-icon.ttf b/static/text-icon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69772689e05fb74224fdae19840fc21660c13520 GIT binary patch literal 3512 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