From 55df3d398c261e8d4f650e9124baca2d8cbbaaa0 Mon Sep 17 00:00:00 2001
From: bmy <2271608011@qq.com>
Date: Fri, 29 Nov 2024 20:54:53 +0800
Subject: [PATCH 01/28] first commit
---
css/page/domestic.css | 0
css/page/hot.css | 0
css/page/index.css | 62 +++
css/page/info.css | 48 ++
css/page/me.css | 0
css/page/search.css | 51 +++
css/tool/clear.css | 471 ++++++++++++++++++++
css/tool/color.css | 9 +
css/tool/public.css | 165 +++++++
css/tool/size.css | 20 +
css/tool/utils.css | 63 +++
js/config/index.js | 42 ++
js/http/index.js | 57 +++
js/page/domestic.js | 7 +
js/page/hot.js | 7 +
js/page/index.js | 80 ++++
js/page/info.js | 102 +++++
js/page/me.js | 7 +
js/page/search.js | 97 ++++
js/serve/home.js | 35 ++
js/serve/info.js | 14 +
js/serve/search.js | 28 ++
js/serve/tag.js | 25 ++
js/utils/index.js | 161 +++++++
js/utils/rem.js | 10 +
page/domestic.html | 37 ++
page/hot.html | 37 ++
page/index.html | 62 +++
page/info.html | 46 ++
page/me.html | 36 ++
page/search.html | 52 +++
ui参考/10.jpg | Bin 0 -> 246186 bytes
ui参考/4.jpg | Bin 0 -> 724842 bytes
ui参考/5.jpg | Bin 0 -> 438458 bytes
ui参考/626643f83ef61a16cf7fed32bdaebf31.jpg | Bin 0 -> 266860 bytes
ui参考/7.jpg | Bin 0 -> 193040 bytes
ui参考/8.jpg | Bin 0 -> 1045404 bytes
ui参考/b80522919e0cd629505efd4a6039a8cc.jpg | Bin 0 -> 96088 bytes
ui参考/daf32b230087f8dcd1629ef3de14ad1f.jpg | Bin 0 -> 192483 bytes
ui参考/mitao68.png | Bin 0 -> 9322 bytes
ui参考/rosiLogo.png | Bin 0 -> 1918 bytes
笔记.md | 26 ++
42 files changed, 1857 insertions(+)
create mode 100644 css/page/domestic.css
create mode 100644 css/page/hot.css
create mode 100644 css/page/index.css
create mode 100644 css/page/info.css
create mode 100644 css/page/me.css
create mode 100644 css/page/search.css
create mode 100644 css/tool/clear.css
create mode 100644 css/tool/color.css
create mode 100644 css/tool/public.css
create mode 100644 css/tool/size.css
create mode 100644 css/tool/utils.css
create mode 100644 js/config/index.js
create mode 100644 js/http/index.js
create mode 100644 js/page/domestic.js
create mode 100644 js/page/hot.js
create mode 100644 js/page/index.js
create mode 100644 js/page/info.js
create mode 100644 js/page/me.js
create mode 100644 js/page/search.js
create mode 100644 js/serve/home.js
create mode 100644 js/serve/info.js
create mode 100644 js/serve/search.js
create mode 100644 js/serve/tag.js
create mode 100644 js/utils/index.js
create mode 100644 js/utils/rem.js
create mode 100644 page/domestic.html
create mode 100644 page/hot.html
create mode 100644 page/index.html
create mode 100644 page/info.html
create mode 100644 page/me.html
create mode 100644 page/search.html
create mode 100644 ui参考/10.jpg
create mode 100644 ui参考/4.jpg
create mode 100644 ui参考/5.jpg
create mode 100644 ui参考/626643f83ef61a16cf7fed32bdaebf31.jpg
create mode 100644 ui参考/7.jpg
create mode 100644 ui参考/8.jpg
create mode 100644 ui参考/b80522919e0cd629505efd4a6039a8cc.jpg
create mode 100644 ui参考/daf32b230087f8dcd1629ef3de14ad1f.jpg
create mode 100644 ui参考/mitao68.png
create mode 100644 ui参考/rosiLogo.png
create mode 100644 笔记.md
diff --git a/css/page/domestic.css b/css/page/domestic.css
new file mode 100644
index 0000000..e69de29
diff --git a/css/page/hot.css b/css/page/hot.css
new file mode 100644
index 0000000..e69de29
diff --git a/css/page/index.css b/css/page/index.css
new file mode 100644
index 0000000..74b1b13
--- /dev/null
+++ b/css/page/index.css
@@ -0,0 +1,62 @@
+/* 首页的css */
+@import "../tool/color.css";
+@import "../tool/size.css";
+@import "../tool/utils.css";
+
+
+.header {
+ .search {
+ font-size: var(--f15);
+ margin-top: .16rem;
+ color: var(--tipsTextColor);
+ height: 80%;
+ background: #f5f5f5;
+ border-radius: .5rem;
+ padding: 0 .2rem;
+ box-sizing: border-box;
+ i {
+ margin-right: .16rem;
+ }
+ p {
+
+ }
+ }
+}
+
+.content {
+ padding-top: 20px;
+ .banner {
+ width: calc(100% - .6rem);
+ border-radius: .6rem;
+ transform :translateY(0);
+ img {
+ width: 100%;
+ border-radius: .6rem;
+ }
+
+ .swiper-slide{
+ overflow: hidden;
+ }
+ }
+
+
+ .recommend-tag {
+ margin: 0.4rem 0;
+ justify-content: space-between;
+ li {
+ color: var(--textColor);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ .icon {
+ font-size: var(--f25);
+ margin-bottom: .14rem;
+ }
+ .title {
+ font-size: var(--f14);
+ color: var(--tipsTextColor);
+ }
+ }
+ }
+}
+
diff --git a/css/page/info.css b/css/page/info.css
new file mode 100644
index 0000000..d57f208
--- /dev/null
+++ b/css/page/info.css
@@ -0,0 +1,48 @@
+@import "../tool/color.css";
+@import "../tool/size.css";
+@import "../tool/utils.css";
+
+
+.header {
+ color: var(--textColor);
+ font-size: var(--f16);
+ .title{
+ margin: 0 .16rem;
+ }
+ .ilist {
+ i {
+ font-size: var(--f22) !important;
+ }
+ .icon-wujiaoxing {
+ margin-right: var(--f10);
+ }
+ }
+}
+
+
+.content {
+ .info_img_list {
+ .img_list {
+ height: 800px;
+ overflow: hidden;
+ img {
+ width: 100%;
+ }
+ }
+ .view_all {
+ font-size: var(--f16);
+ color: var(--themeColor);
+ width: 100%;
+ height: 60px;
+ bottom: 0;
+ background: linear-gradient(#ffffff08, #fefefe);
+ padding-top: .6rem;
+ box-sizing: border-box;
+ div {}
+ i {
+ margin-left: .1rem;
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/css/page/me.css b/css/page/me.css
new file mode 100644
index 0000000..e69de29
diff --git a/css/page/search.css b/css/page/search.css
new file mode 100644
index 0000000..222a186
--- /dev/null
+++ b/css/page/search.css
@@ -0,0 +1,51 @@
+@import "../tool/color.css";
+@import "../tool/size.css";
+@import "../tool/utils.css";
+
+.header {
+ color: var(--textColor);
+
+ input {
+ margin: 0 .16rem;
+ font-size: var(--f15);
+ color: var(--tipsTextColor);
+ height: 80%;
+ background: #f5f5f5;
+ border-radius: .5rem;
+ padding: 0 .2rem;
+ box-sizing: border-box;
+ }
+ div {
+ font-size: 0.32rem !important;
+
+ }
+}
+
+.content {
+ .no-search {
+ padding-top: .4rem;
+ }
+ .have-search {
+ padding-top: .02rem;
+ }
+ .search_list {
+ margin-bottom: .7rem;
+ .title {
+ height: 40px;
+ font-size: var(--f13);
+ color: var(--tipsTextColor);
+ margin-bottom: 0.14rem;
+ }
+ ul {
+ li {
+ padding: 0 var(--f10);
+ margin-bottom: .16rem;
+ a {
+ font-size: var(--f16);
+ color: var(--textColor);
+ }
+ }
+ }
+ }
+}
+
diff --git a/css/tool/clear.css b/css/tool/clear.css
new file mode 100644
index 0000000..0265824
--- /dev/null
+++ b/css/tool/clear.css
@@ -0,0 +1,471 @@
+/* 清除默认样式 */
+/*
+ * Copyright (c) 2020. bmy
+ */
+
+ .iconfont {
+ font-size: .32rem;
+ }
+
+p,body,h1,h2,h3,h4,h5,h6,ul,li{
+ margin: 0;
+ padding: 0;
+}
+
+ html {
+ font-family: sans-serif; /* 1 */
+ line-height: 1;
+ }
+
+ body {
+ width: 100%;
+ font-size: 0px;
+ background-color: #fff;
+ color: rgba(0, 0, 0, 0.87);
+ }
+
+ ::-webkit-scrollbar {
+ width: 0;
+ height: 0;
+}
+
+ li {
+ list-style: none;
+ }
+
+ article,
+ aside,
+ footer,
+ header,
+ nav,
+ section {
+ display: block;
+ }
+
+ /**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+ h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+ }
+
+ /* Grouping content
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 9-.
+ * 1. Add the correct display in IE.
+ */
+
+ figcaption,
+ figure,
+ main { /* 1 */
+ display: block;
+ }
+
+ /**
+ * Add the correct margin in IE 8.
+ */
+
+ figure {
+ margin: 1em 40px;
+ }
+
+ /**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+ hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ white-space: pre-wrap;
+ word-break: break-all;
+ margin: 0;
+ }
+
+ /* Text-level semantics
+ ========================================================================== */
+
+ /**
+ * 1. Remove the gray background on active links in IE 10.
+ * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
+ */
+
+ a {
+ text-decoration: none;
+ background-color: transparent; /* 1 */
+ -webkit-text-decoration-skip: objects; /* 2 */
+ user-select: none;
+ -webkit-user-select: none;
+ }
+
+ /**
+ * Remove the outline on focused links when they are also active or hovered
+ * in all browsers (opinionated).
+ */
+
+ a:active,
+ a:hover {
+ outline-width: 0;
+ }
+
+ /**
+ * 1. Remove the bottom border in Firefox 39-.
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+ abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+ }
+
+ /**
+ * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
+ */
+
+ b,
+ strong {
+ font-weight: inherit;
+ }
+
+ /**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+ b,
+ strong {
+ font-weight: bolder;
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ code,
+ kbd,
+ samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /**
+ * Add the correct font style in Android 4.3-.
+ */
+
+ dfn {
+ font-style: italic;
+ }
+
+ /**
+ * Add the correct background and color in IE 9-.
+ */
+
+ mark {
+ background-color: #ff0;
+ color: #000;
+ }
+
+ /**
+ * Add the correct font size in all browsers.
+ */
+
+ small {
+ font-size: 80%;
+ }
+
+ /**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+ sub,
+ sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+
+ sub {
+ bottom: -0.25em;
+ }
+
+ sup {
+ top: -0.5em;
+ }
+
+ /* Embedded content
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 9-.
+ */
+
+ audio,
+ video {
+ display: inline-block;
+ }
+
+ /**
+ * Add the correct display in iOS 4-7.
+ */
+
+ audio:not([controls]) {
+ display: none;
+ height: 0;
+ }
+
+ /**
+ * Remove the border on images inside links in IE 10-.
+ */
+
+ img {
+ border-style: none;
+ }
+
+ /**
+ * Hide the overflow in IE.
+ */
+
+ svg:not(:root) {
+ overflow: hidden;
+ }
+
+ /* Forms
+ ========================================================================== */
+
+ /**
+ * 1. Change the font styles in all browsers (opinionated).
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+ button,
+ input,
+ optgroup,
+ select,
+ textarea {
+ border: none;
+ outline: none;
+ font-family: sans-serif; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+ }
+
+ /**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+ button,
+ input { /* 1 */
+ overflow: visible;
+ }
+
+ /**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+ button,
+ select { /* 1 */
+ text-transform: none;
+ }
+
+ /**
+ * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+ * controls in Android 4.
+ * 2. Correct the inability to style clickable types in iOS and Safari.
+ */
+
+ button,
+ html [type="button"], /* 1 */
+ [type="reset"],
+ [type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ }
+
+ /**
+ * Remove the inner border and padding in Firefox.
+ */
+
+ button::-moz-focus-inner,
+ [type="button"]::-moz-focus-inner,
+ [type="reset"]::-moz-focus-inner,
+ [type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+ }
+
+ /**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+ button:-moz-focusring,
+ [type="button"]:-moz-focusring,
+ [type="reset"]:-moz-focusring,
+ [type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+ }
+
+ /**
+ * Change the border, margin, and padding in all browsers (opinionated).
+ */
+
+ fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+ }
+
+ /**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+ legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+ }
+
+ /**
+ * 1. Add the correct display in IE 9-.
+ * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+ progress {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+ }
+
+ /**
+ * Remove the default vertical scrollbar in IE.
+ */
+
+ textarea {
+ overflow: auto;
+ resize: vertical;
+ }
+
+ /**
+ * 1. Add the correct box sizing in IE 10-.
+ * 2. Remove the padding in IE 10-.
+ */
+
+ [type="checkbox"],
+ [type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ }
+
+ /**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+ [type="number"]::-webkit-inner-spin-button,
+ [type="number"]::-webkit-outer-spin-button {
+ height: auto;
+ }
+
+ /**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+ [type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+ }
+
+ /**
+ * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+ */
+
+ [type="search"]::-webkit-search-cancel-button,
+ [type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+
+ /**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+ ::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+ }
+
+ /* Interactive
+ ========================================================================== */
+
+ /*
+ * Add the correct display in IE 9-.
+ * 1. Add the correct display in Edge, IE, and Firefox.
+ */
+
+ details, /* 1 */
+ menu {
+ display: block;
+ }
+
+ /*
+ * Add the correct display in all browsers.
+ */
+
+ summary {
+ display: list-item;
+ }
+
+ /* Scripting
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 9-.
+ */
+
+ canvas {
+ display: inline-block;
+ }
+
+ /**
+ * Add the correct display in IE.
+ */
+
+ template {
+ display: none;
+ }
+
+ /* Hidden
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 10-.
+ */
+
+ [hidden] {
+ display: none;
+ }
\ No newline at end of file
diff --git a/css/tool/color.css b/css/tool/color.css
new file mode 100644
index 0000000..82bdfa8
--- /dev/null
+++ b/css/tool/color.css
@@ -0,0 +1,9 @@
+/* 存在项目中用到的很多颜色 */
+
+:root {
+ --swiper-theme-color: var(--themeColor) !important;
+ --themeColor: #fb7299;
+ --whiteColor: #fff;
+ --textColor: #050505;
+ --tipsTextColor: #929292;
+}
\ No newline at end of file
diff --git a/css/tool/public.css b/css/tool/public.css
new file mode 100644
index 0000000..a491852
--- /dev/null
+++ b/css/tool/public.css
@@ -0,0 +1,165 @@
+/* 页面公用的css样式 */
+@import "./color.css";
+@import "./size.css";
+@import "./utils.css";
+
+.header {
+ width: 100%;
+ left: 0;
+ top: 0;
+ background-color: var(--whiteColor);
+ height: .96rem;
+ z-index: 999;
+ padding-top: .08rem;
+
+ .icon-fanhui {
+ font-size: .44rem !important;
+ }
+}
+
+
+.content {
+ margin-top: .96rem;
+ margin-bottom: 1rem;
+}
+
+
+
+.footer {
+ width: 100%;
+ left: 0;
+ bottom: 0;
+ height: 1rem;
+ background: var(--whiteColor);
+ z-index: 999;
+
+ .active {
+ a {
+ color: var(--themeColor);
+ }
+ }
+
+ li {
+ a {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ color: var(--blackColor);
+
+ p {
+ font-size: 0.22rem;
+ margin-top: 0.1rem;
+ }
+
+ i {
+ font-size: .38rem;
+ }
+ }
+
+ }
+}
+
+/* 这是 theme = 1 的默认布局(垂直)样式
+ 1:可以横向滑动
+ 2:一行两个 default-model
+*/
+.recommend-model {
+ .title {
+ height: 45px;
+ font-size: var(--f19);
+ font-weight: bolder;
+ }
+
+ .list {
+ margin-top: .3rem;
+ overflow-x: scroll;
+
+ }
+
+ li {
+ width: 3rem;
+ margin-right: .2rem;
+
+ &:last-child {
+ margin-right: 0;
+ }
+
+ a {
+ img {
+ width: 100%;
+ height: 225px;
+ margin-bottom: .18rem;
+ border-radius: .14rem;
+ object-fit: cover;
+ }
+
+ .text {
+ font-size: var(--f17);
+ color: var(--textColor);
+
+ margin-bottom: .12rem;
+ }
+
+ .desc {
+ font-size: var(--f10);
+ color: var(--tipsTextColor);
+
+ .time {}
+
+ .view {
+ .icon-yanjing {
+ margin-right: .06rem;
+ }
+
+ span {}
+ }
+ }
+ }
+ }
+}
+
+.default-model {
+ margin-top: .8rem;
+ .list {
+ flex-wrap: wrap;
+ overflow-x: auto;
+
+ li {
+ width: 3.32rem;
+ margin-bottom: .4rem;
+ &:nth-child(2n) {
+ margin-right: 0;
+ }
+ }
+ }
+}
+
+/* 这是 theme = 2 的布局样式代码
+ 图片和文字左右布局
+*/
+.item-theme-horizontally {
+ width: 100% !important;
+
+ a {
+ display: flex;
+
+ img {
+ width: 1.8rem !important;
+ height: 1.26rem !important;
+ flex-shrink: 0;
+ }
+
+ .r {
+ width: calc(100% - 96px);
+ margin-left: .1rem;
+ }
+
+ .text {
+ overflow: visible;
+ white-space: revert;
+ font-size: var(--f14) !important;
+ line-height: 1.4;
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/css/tool/size.css b/css/tool/size.css
new file mode 100644
index 0000000..9cbea91
--- /dev/null
+++ b/css/tool/size.css
@@ -0,0 +1,20 @@
+/* 网页的字体 */
+:root {
+ --f10: .2rem;
+ --f11: .22rem;
+ --f12: .24rem;
+ --f13: .26rem;
+ --f14: .28rem;
+ --f15: .3rem;
+ --f16: .32rem;
+ --f17: .34rem;
+ --f18: .36rem;
+ --f19: .38rem;
+ --f20: .4rem;
+ --f21: .42rem;
+ --f22: .44rem;
+ --f23: .46rem;
+ --f24: .48rem;
+ --f25: .5rem;
+ --f26: .52rem;
+}
\ No newline at end of file
diff --git a/css/tool/utils.css b/css/tool/utils.css
new file mode 100644
index 0000000..257c7fd
--- /dev/null
+++ b/css/tool/utils.css
@@ -0,0 +1,63 @@
+/* 公共的css方法 */
+.flex {
+ display: flex;
+}
+
+.ais {
+ align-items: center;
+}
+
+.jc {
+ justify-content: center;
+}
+
+.js {
+ justify-content: space-between;
+}
+
+.ja {
+ justify-content: space-around
+}
+
+.wrap {
+ flex-wrap: wrap;
+}
+
+.flex1 {
+ flex: 1
+}
+
+.column {
+ flex-direction: column;
+}
+
+.fixed {
+ position: fixed;
+}
+
+.relative {
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+
+.border-box {
+ box-sizing: border-box;
+}
+
+.p15{
+ padding: 0 var(--f15);
+}
+
+.p25{
+ padding: 0 var(--f25);
+}
+
+.ellipsis {
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+}
\ No newline at end of file
diff --git a/js/config/index.js b/js/config/index.js
new file mode 100644
index 0000000..6109f2e
--- /dev/null
+++ b/js/config/index.js
@@ -0,0 +1,42 @@
+// var let
+// 定义的新方式 let
+let config = {
+ stage: "dev", // dev test prod
+
+ // http://127.0.0.1:8090/app/user/UserInfo
+
+ // 基地址 http://127.0.0.1:8090/app
+ // 短地址 /user/UserInfo
+
+ // 基地址都被 ajax封装调用
+ devUrl: 'https://pc.buyusdt.xyz/v1/api',
+ testUrl: 'http://192.168.31.101:3030/test/api',
+ prodUrl: 'http://abc.com/v1/api',
+
+ // 帮助ajax判断应该用哪一个基地址
+ checkUrl: function () {
+ switch (this.stage) {
+ case "dev":
+ return this.devUrl
+ break;
+ case "test":
+ return this.testUrl
+ break;
+ case "prod":
+ return this.prodUrl
+ break;
+ }
+ },
+
+ // 短地址 都被 serve 调用
+ urlList: {
+ homeHot: '/home/hot',
+ homeList: '/home/list',
+ homeBanner: '/home/banner',
+ infoList: '/info/list',
+ tagList: '/tag/list',
+ tagRecommend: '/tag/recommend',
+ searchHot: '/search/hot',
+ searchKey: '/search/key',
+ }
+}
\ No newline at end of file
diff --git a/js/http/index.js b/js/http/index.js
new file mode 100644
index 0000000..a376205
--- /dev/null
+++ b/js/http/index.js
@@ -0,0 +1,57 @@
+class Ajax {
+
+ xhr = new XMLHttpRequest()
+
+ get(option) {
+ return new Promise((success, error) => {
+ var params = ""
+ for (const key in option.data) {
+ params += `&${key}=${option.data[key]}`
+ }
+ params = params.replace("&", "?")
+
+ // option.url == /home/hot?id=1
+ this.xhr.open("GET", `${config.checkUrl()}${option.url}${params}`)
+
+ this.xhr.send()
+ this.stateChange(success, error)
+ })
+ }
+
+ post(option) {
+ return new Promise((success, error) => {
+ this.xhr.open("POST", option.url)
+ this.xhr.setRequestHeader("Content-Type", "application/json")
+ // post 参数在请求体(body)中发送
+ this.xhr.send(JSON.stringify(option.data))
+ this.stateChange(success, error)
+ })
+ }
+
+ stateChange(suc, err) {
+ this.xhr.onreadystatechange = () => {
+ if (this.xhr.readyState == 4) {
+ if (this.xhr.status == 200) {
+ let res = JSON.parse(this.xhr.response)
+ switch (res.status) {
+ case 200:
+ suc(res.data)
+ break;
+
+ case 404:
+ alert(res.message)
+ err(this.xhr)
+ break;
+
+ default:
+ break;
+ }
+ suc()
+ } else {
+ err(this.xhr)
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/js/page/domestic.js b/js/page/domestic.js
new file mode 100644
index 0000000..26914c4
--- /dev/null
+++ b/js/page/domestic.js
@@ -0,0 +1,7 @@
+class Domestic {
+ constructor() {
+ util.footer()
+ }
+}
+
+new Domestic
\ No newline at end of file
diff --git a/js/page/hot.js b/js/page/hot.js
new file mode 100644
index 0000000..f340051
--- /dev/null
+++ b/js/page/hot.js
@@ -0,0 +1,7 @@
+class Hot {
+ constructor() {
+ util.footer()
+ }
+}
+
+new Hot
\ No newline at end of file
diff --git a/js/page/index.js b/js/page/index.js
new file mode 100644
index 0000000..0c3a1b5
--- /dev/null
+++ b/js/page/index.js
@@ -0,0 +1,80 @@
+class Index {
+ constructor() {
+ util.header(
+ `
+
+ `,
+ "",
+ ""
+ )
+
+ util.footer()
+
+ this.getHomeBanner()
+ this.getTagRecommend()
+ this.getHomeHotData()
+ this.getHomeListData()
+ this.initSwiper()
+ this.event()
+ }
+
+
+ async getHomeListData() {
+ let res = await homeServe.homeList()
+ item(".default-model ul", res)
+ }
+
+ // 获取热门推荐的写真
+ async getHomeHotData() {
+ let res = await homeServe.homeHot()
+ item(".recommend-model ul", res)
+ }
+
+ // 请求热门分类
+ async getTagRecommend() {
+ let res = await tagServe.tagRecommend()
+ $(".recommend-tag").innerHTML = res.maps(v => {
+ return `
+
+ ${v.title.substr(0,1)}
+ ${v.title}
+
+ `
+ })
+ }
+
+ // 请求banner图
+ async getHomeBanner() {
+ let res = await homeServe.homeBanner()
+ $(".swiper-wrapper").innerHTML = res.maps(v => {
+ return `
+
+

+
+ `
+ })
+ }
+
+
+ initSwiper() {
+ var mySwiper = new Swiper('.banner', {
+ loop: true, // 循环模式选项
+
+ // 如果需要分页器
+ pagination: {
+ el: '.swiper-pagination',
+ },
+ })
+ }
+
+ event() {
+ $(".search").onclick = () => {
+ location.href = "./search.html"
+ }
+ }
+}
+
+new Index
\ No newline at end of file
diff --git a/js/page/info.js b/js/page/info.js
new file mode 100644
index 0000000..04fa1b7
--- /dev/null
+++ b/js/page/info.js
@@ -0,0 +1,102 @@
+class Info {
+ title = ""
+ defaultArr = []
+ allArr = []
+
+ // 收藏的数据,本地有收藏就读取本地之前的收藏数据,没有就给默认值
+ // likeArr = JSON.parse(localStorage.getItem("like")) || []
+
+ likeArr = getItem("like")
+
+ constructor() {
+ this.getInfoListData()
+ .then(() => {
+
+ util.header(
+ `${this.title}
`,
+ `
+
+
+
+
+ `
+ )
+
+ this.event()
+ })
+ }
+
+
+ async getInfoListData() {
+ let { title, src_list, recommend } = await infoServe.infoList({ id: query("id") })
+
+ this.title = title
+ // 手动实现 懒加载
+ this.allArr = src_list
+ this.defaultArr = [ this.allArr[0], this.allArr[1] ]
+
+ $(".info_img_list .img_list").innerHTML = this.defaultArr.maps(v => `
`)
+
+ item(".recommend-model ul", recommend)
+ }
+
+
+ event() {
+ $(".view_all").onclick = () => {
+ $(".img_list").style.height = "auto"
+ $(".view_all").style.display = "none"
+
+ $(".info_img_list .img_list").innerHTML = this.allArr.maps(v => `
`)
+
+ }
+
+
+ // TODO 找一个合适分享
+ $(".icon-fenxiang").onclick = async () => {
+ await navShare({
+ title: this.title,
+ text: `我这有个好看的,快来看看 ${this.title}`,
+ url: location.href
+ })
+ }
+
+ let sc = $(".icon-wujiaoxing")
+
+ console.log("this.likeArr: ", this.likeArr);
+
+ let isHave = this.likeArr.filter(v => v.id == query("id"))
+ if (isHave.length != 0) {
+ sc.classList.add("icon-wujiaoxing1")
+ }
+
+ $(".icon-wujiaoxing").onclick = async () => {
+ // 已收藏,应该变成未收藏
+ if (sc.classList.contains("icon-wujiaoxing1")) {
+ sc.classList.remove("icon-wujiaoxing1")
+ this.likeArr = this.likeArr.filter(v => v.id != query("id"))
+ setItem("like", this.likeArr)
+
+ // 未收藏,应该变成已收藏
+ } else {
+ this.likeArr.push({
+ id: query("id"),
+ thumbnail: this.allArr[0],
+ title: this.title,
+ time: query("time"),
+ // TODO 这个浏览量需要后端提供
+ view: "42"
+ })
+ setItem("like", this.likeArr)
+ sc.classList.add("icon-wujiaoxing1")
+ }
+ // await navShare({
+ // title: this.title,
+ // text: `我这有个好看的,快来看看 ${this.title}`,
+ // url: location.href
+ // })
+ }
+
+ }
+}
+
+new Info
\ No newline at end of file
diff --git a/js/page/me.js b/js/page/me.js
new file mode 100644
index 0000000..6b277d4
--- /dev/null
+++ b/js/page/me.js
@@ -0,0 +1,7 @@
+class Me {
+ constructor() {
+ util.footer()
+ }
+}
+
+new Me
\ No newline at end of file
diff --git a/js/page/search.js b/js/page/search.js
new file mode 100644
index 0000000..cd1b7dc
--- /dev/null
+++ b/js/page/search.js
@@ -0,0 +1,97 @@
+class Search {
+
+ page = 1;
+ totalPage = 0;
+ keyword = "";
+ totalArr = [];
+
+ constructor() {
+ util.header(
+ ``,
+ `搜索
`,
+ ``
+ )
+ this.getSearchHotData()
+ this.event()
+ }
+
+
+ async getSearchHotData() {
+ let { hotKeyword, recommend } = await searchServe.searchHot()
+
+ $(".search_list ul").innerHTML = hotKeyword.maps(v => {
+ return `
+
+ ${v}
+
+ `
+ });
+
+ item(".search_recommend", recommend, 2)
+
+ $(".search_recommend ul li").forEach(v => {
+ v.onclick = () => {
+ // 把你点击的文字放到搜索框里面
+ $(".header input").value = v.innerText
+ $(".header .button").onclick()
+ }
+ })
+ }
+
+ event() {
+
+ let input = $(".header input")
+
+ $(".header .button").onclick = async () => {
+ if (input.value.length != 0) {
+ this.keyword = input.value
+ this.totalArr = []
+ await this.getSearchKeyData()
+ if (this.totalArr.length != 0) {
+ util.hidden(".no-search")
+ item(".have-search ul", this.totalArr)
+ util.show(".have-search")
+ this.onscroll()
+ }
+
+ }
+ }
+
+ input.oninput = () => {
+ if (input.value.length == 0) {
+ util.show(".no-search")
+ util.hidden(".have-search")
+ }
+ }
+
+ }
+
+ // 用来发送搜索请求的
+ async getSearchKeyData() {
+ let { totalPage, list } = await searchServe.searchKey({
+ keyword: this.keyword,
+ page: this.page
+ })
+ this.totalPage = totalPage
+ list.forEach(v => this.totalArr.push(v));
+ }
+
+ // 滚动到底部实现自动加载下一页数据
+ onscroll() {
+ window.onscroll = async () => {
+ var scrollHeight = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);
+ var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
+ var clientHeight = window.innerHeight || Math.min(document.documentElement.clientHeight, document.body.clientHeight);
+
+ if (clientHeight + Math.ceil(scrollTop) >= scrollHeight) {
+ this.page += 1
+ if (this.page <= this.totalPage) {
+ await this.getSearchKeyData()
+ item(".have-search ul", this.totalArr)
+ }
+ }
+ }
+ }
+}
+
+new Search
\ No newline at end of file
diff --git a/js/serve/home.js b/js/serve/home.js
new file mode 100644
index 0000000..6b3819e
--- /dev/null
+++ b/js/serve/home.js
@@ -0,0 +1,35 @@
+class HomeServe {
+ // data 是接口请求的参数,默认为空对象,表示这个接口不需要参数
+ async homeHot (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.homeHot,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+
+ async homeBanner (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.homeBanner,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+
+ async homeList (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.homeList,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+
+}
+
+let homeServe = new HomeServe
\ No newline at end of file
diff --git a/js/serve/info.js b/js/serve/info.js
new file mode 100644
index 0000000..8f5d7f8
--- /dev/null
+++ b/js/serve/info.js
@@ -0,0 +1,14 @@
+class InfoServe {
+ // data 是接口请求的参数,默认为空对象,表示这个接口不需要参数
+ async infoList (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.infoList,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+}
+
+let infoServe = new InfoServe
\ No newline at end of file
diff --git a/js/serve/search.js b/js/serve/search.js
new file mode 100644
index 0000000..4074a63
--- /dev/null
+++ b/js/serve/search.js
@@ -0,0 +1,28 @@
+class SearchServe {
+ // data 是接口请求的参数,默认为空对象,表示这个接口不需要参数
+ async searchHot (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.searchHot,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+
+
+
+ async searchKey (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.searchKey,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+
+
+}
+
+let searchServe = new SearchServe
\ No newline at end of file
diff --git a/js/serve/tag.js b/js/serve/tag.js
new file mode 100644
index 0000000..218aed5
--- /dev/null
+++ b/js/serve/tag.js
@@ -0,0 +1,25 @@
+class TagServe {
+ // data 是接口请求的参数,默认为空对象,表示这个接口不需要参数
+ async tagList (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.tagList,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+
+
+ async tagRecommend (data = {}) {
+ let http = new Ajax()
+ // suc的返回值(ajax请求到的,后端给我们的数据)
+ return await http.get({
+ url: config.urlList.tagRecommend,
+ // data: data key 和 value 名字一样的时候,可以直接只写一个
+ data
+ })
+ }
+}
+
+let tagServe = new TagServe
\ No newline at end of file
diff --git a/js/utils/index.js b/js/utils/index.js
new file mode 100644
index 0000000..f4e6bb6
--- /dev/null
+++ b/js/utils/index.js
@@ -0,0 +1,161 @@
+class Utils {
+
+ // 类被初始化的时候,构造函数就会自己运行了
+ constructor() {
+ this.newMap()
+ }
+
+ newMap() {
+ Array.prototype.maps = function (callback) {
+ // var callback = e => `${e}`
+ var res = []
+ for (let i = 0; i < this.length; i++) {
+ var ddd = callback(this[i], i, this)
+ res.push(ddd)
+ }
+ return res.toString().replaceAll(",", "")
+ }
+ }
+
+ $(className) {
+ var classNameArr = className.split(" ");
+ if (classNameArr.length == 1) {
+ var isAll = document.querySelectorAll(classNameArr[0])
+ return isAll.length == 1 ? isAll[0] : isAll
+ } else {
+ var lastChild = classNameArr[classNameArr.length - 1];
+ var lastChildFather = classNameArr[classNameArr.length - 2];
+
+ var lastChildFatherDOM = document.querySelector(lastChildFather);
+
+ var key = "";
+ lastChild.includes(".")
+ ? (key = "className")
+ : lastChild.includes("#")
+ ? (key = "id")
+ : (key = "localName");
+
+ var res = Array.from(lastChildFatherDOM.children).filter(
+ (e) => e[key] == lastChild.replace(".", "")
+ );
+ }
+
+ return res.length <= 1 ? res[0] : res;
+ }
+
+ footer() {
+ // ajax 接口返回的底部导航数据
+ let arr = [
+ { icon: 'icon-shouye', title: '首页', href: 'index.html' },
+ { icon: 'icon-changchenglogo', title: '分类', href: 'domestic.html' },
+ { icon: 'icon-hot', title: '热门', href: 'hot.html' },
+ { icon: 'icon-wo', title: '我的', href: 'me.html' },
+ ]
+ let body = this.$("body")
+
+ // TODO innerHTML 会导致事件丢失
+ body.innerHTML += `
+
+ `
+ }
+
+ item(dom, data, theme = 1) {
+ $(dom).innerHTML = data.maps(v => {
+ return `
+
+
+
+
+
${v.title}
+
+
${v.time}
+
+
+ ${v.view}
+
+
+
+
+
+ `
+ })
+ }
+
+
+ query(name) {
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+ var r = window.location.search.substr(1).match(reg);
+ if (r != null) return decodeURIComponent(r[2]); return null;
+ }
+
+
+
+
+ header(content, action, back = ``) {
+ this.$("body").insertAdjacentHTML('afterbegin', `
+
+ `);
+
+ this.$(".icon-fanhui").onclick = () => {
+ history.back()
+ }
+ }
+
+
+ async navShare(title = "", text = "", url = "") {
+ console.log(navigator.share && navigator.canShare);
+ if (navigator.share && navigator.canShare) {
+ await navigator.share({
+ title, text, url
+ });
+ } else {
+ alert(`当前浏览器版本不支持分享此功能`);
+ }
+ }
+
+
+ show(className) {
+ this.$(className).style.display = "block"
+ }
+
+ hidden(className) {
+ this.$(className).style.display = "none"
+ }
+
+
+ setItem(key, value) {
+ localStorage.setItem(key, JSON.stringify(value))
+ }
+
+ getItem(key) {
+ let local = localStorage.getItem(key)
+ return local ? JSON.parse(local) : []
+ }
+}
+
+let u = new Utils
+let util = u, { $, item, query, navShare, getItem, setItem } = u
+
+// let util = new Utils
+// let $ = (new Utils).$
+
+// util.$
+// $
+// footer
\ No newline at end of file
diff --git a/js/utils/rem.js b/js/utils/rem.js
new file mode 100644
index 0000000..31ddf3b
--- /dev/null
+++ b/js/utils/rem.js
@@ -0,0 +1,10 @@
+(function (w, d) {
+ function setSize() {
+ var screenWidth = d.documentElement.clientWidth;
+ var currentFontSize = (screenWidth * 100) / 750;
+ d.documentElement.style.fontSize = currentFontSize + "px";
+ }
+ w.addEventListener("resize", setSize);
+ w.addEventListener("pageShow", setSize);
+ w.addEventListener("DOMContentLoaded", setSize);
+})(window, document);
\ No newline at end of file
diff --git a/page/domestic.html b/page/domestic.html
new file mode 100644
index 0000000..fd32702
--- /dev/null
+++ b/page/domestic.html
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+ 国产
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 国产
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/page/hot.html b/page/hot.html
new file mode 100644
index 0000000..01f811d
--- /dev/null
+++ b/page/hot.html
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 热门
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/page/index.html b/page/index.html
new file mode 100644
index 0000000..b19b941
--- /dev/null
+++ b/page/index.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/page/info.html b/page/info.html
new file mode 100644
index 0000000..9c09723
--- /dev/null
+++ b/page/info.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/page/me.html b/page/me.html
new file mode 100644
index 0000000..75f19a1
--- /dev/null
+++ b/page/me.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/page/search.html b/page/search.html
new file mode 100644
index 0000000..efa2142
--- /dev/null
+++ b/page/search.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui参考/10.jpg b/ui参考/10.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ab0cc512ea9b490bd76a22ccd7368e46fd4f6533
GIT binary patch
literal 246186
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