first commit

This commit is contained in:
编码猿
2024-09-27 02:06:13 +08:00
commit 852d94fbb9
36760 changed files with 3274413 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
class Ajax {
constructor() {
this.ajax = new XMLHttpRequest
}
//Promise方法
get(params) {
return new Promise((success, error) => {
var str = ""
for (const key in params.data) {
//console.log("key: ", key);
str += `&${key}=${params.data[key]}`
}
str = str.replace("&", "?")
//console.log(`${params.url}${str}`);
this.ajax.open("GET", `${config.checkUrl()}${params.url}${str}`);
this.ajax.send();
this.readystatechange(success, error)
})
}
post() { }
readystatechange(success, error) {
this.ajax.onreadystatechange = () => {
// 4:ajax状态码
if (this.ajax.readyState == 4) {
// 200:http状态码
if (this.ajax.status == 200) {
var data = JSON.parse(this.ajax.responseText)
//console.log(data);
success(this.checkStatus(data))
} else {
error(this.ajax)
}
}
}
}
checkStatus(data) {
switch (data.status) {
case 200://是num类型200 写200 是字符串"200" 写"200"
return data.result
break;
// 200、400 是后端状态码(status)可以随便定义数字
case 404:
alert(data.msg);
// throw是让浏览器抛出一个错误
// new Error是新建一个错误信息
// 抛出一个新的错误信息 会把浏览器运行打断 不会再运行
throw new Error(data.msg)
break;
default:
break;
}
}
}

View File

@@ -0,0 +1,40 @@
var config = {
// 基地址
devBaseUrl: 'http://127.0.0.1:3000/api/json/', // 开发阶段
testBaseUrl: 'http://127.0.0.1:3000/api/test', // 测试阶段
prodBaseUrl: 'http://172.20.10.4:3000/api/json', // 上线阶段
stage: 'dev', //dev test prod
apiList: {//把接口短地址放在这里
index: '/index',
info: '/info',
ClassList: '/class',
ClassListDetails: '/classList',
},
// 底部导航条数据 可以增加删除
footerList: [
{ title: '首页', icon: 'icon-home', url: 'index.html' },
{ title: '机构', icon: 'icon-jigou', url: 'mechanism.html' },
{ title: '模特', icon: 'icon-me', url: 'model.html' },
{ title: '我的', icon: 'icon-wo', url: 'my.html' },
],
checkUrl: function () {
switch (this.stage) {
case "dev":
return this.devBaseUrl
break;
case "test":
return this.testBaseUrl
break;
case "prod":
return this.prodBaseUrl
break;
default:
break;
}
}
}

View File

@@ -0,0 +1,9 @@
class Collect {
constructor() {
header("我的收藏")
}
like() {
localStorage.setItem("like", "")
}
}
new Collect()

View File

@@ -0,0 +1,74 @@
class Edit {
constructor() {
header("分类编辑")
// 从本地取出数据
this.principal = JSON.parse(localStorage.getItem("principal"))
this.additional = JSON.parse(localStorage.getItem("additional"))
this.renderPrincipal()
this.renderAdditional()
}
// 渲染已选菜单
renderPrincipal() {
// 把title渲染到已选菜单
this.principal.forEach(v => {
$(".principal").html(`
<li>${v.title}</li>
`)
});
this.principalClick()
}
// 已选菜单点击事件
principalClick() {
var self = this
click(_(".principal li"), function () {
if (this.index != 0) {
// 向未选标签追加一个数据
self.additional.push(self.principal[this.index])
// 删除一个已选标签
var deleteAItem = self.principal.splice(this.index, 1)
// 提取数据转化为字符串
localStorage.setItem("principal", JSON.stringify(self.principal))
localStorage.setItem("additional", JSON.stringify(self.additional))
$(".additional").html(`
<li>${deleteAItem[0].title}</li>
`)
self.additionalClick()
$(".principal").removeChild(this)
self.principalClick()
}
})
}
// 渲染未选菜单
renderAdditional() {
this.additional.forEach(v => {
$(".additional").html(`
<li>${v.title}</li>
`)
});
this.additionalClick()
}
additionalClick() {
var self = this
click(_(".additional li"), function () {
self.principal.push(self.additional[this.index])
var deleteAItem = self.additional.splice(this.index, 1)
localStorage.setItem("principal", JSON.stringify(self.principal))
localStorage.setItem("additional", JSON.stringify(self.additional))
$(".principal").html(`
<li>${deleteAItem[0].title}</li>
`)
self.principalClick();
$(".additional").removeChild(this)
self.additionalClick()
})
}
}
new Edit()

View File

@@ -0,0 +1,143 @@
class Index {
constructor() {
this.index = 0
// 全局变量
this.principal = []
footer()//每个页面都要调用
this.getClassList()
}
async getClassList() {
var self = this;
if (localStorage.getItem("principal") == null) {
// 调用sever里的indexsever中的ClassList方法
var res = await indexSever.ClassList()
console.log(res);
this.principal = res.principal
localStorage.setItem("principal", JSON.stringify(this.principal))
localStorage.setItem("additional", JSON.stringify(res.additional))
} else {
this.principal = JSON.parse(localStorage.getItem("principal"))
}
// 把数据principal循环放在首页上 渲染页面
this.principal.forEach((v, i) => {
$(".header_menu ul").html(`
// 默认首页激活
<li class="${i == 0 ? 'active' : ''}">${v.title}</li>`)
$(".page_wrapper").html(`
<div class="swiper-slide">//这个div相当于li
<div class="list">
</div>
</div>`)
_(".swiper-wrapper .swiper-slide").forEach(v => {
v.onscroll = () => {
const { clientHeight, scrollHeight, scrollTop } = v;
// console.log(clientHeight, scrollHeight, scrollTop);
const distance = scrollHeight - scrollTop - clientHeight;
if (distance <= 1) {
console.log("到底部了");
// 首页
if (this.index == 0) {
this.getIndex()
} else {
this.principal[this.index].page += 1
if (this.principal[this.index].page <= this.principal[this.index].total_page) {
this.GetClassListDetails("more")
} else {
console.log("已经没有数据了!!!");
}
}
}
}
})
});
click($('.header_menu a'), function () {
console.log(this);
})
click(_(".header_menu ul li"), function () {
self.changeActive(this.index)
})
// _(".header_menu ul li").forEach()
this.getIndex()
this.initPage()
}
//除首页外的分类接口
async GetClassListDetails(type = "click") {
var getData = async () => {
var res = await indexSever.ClassListDetails({
page: this.principal[this.index].page,
id: this.principal[this.index].id,
})
this.principal[this.index].total_page = res.total_page
this.principal[this.index].content = [
...this.principal[this.index].content,
...res.data
];
item(_(".swiper-slide .list")[this.index], res.data)
console.log(res);
}
if (type == "click") {
if (this.principal[this.index].id != -1) {
if (this.principal[this.index].content.length == 0) {
getData()
}
}
} else {
getData()
}
}
changeActive(index) {
this.index = index
_(".header_menu ul li").forEach(v => v.remove("active"))
_(".header_menu ul li")[index].add("active")
// 轮播图滑动
this.mySwiper.slideTo(index)
}
// 请求的首页数据
async getIndex() {
// 调用sever里的indexsever中的index方法
var res = await indexSever.index();//sever数据回返回到这里
console.log(res);
// 首页总的数据(把里面的所有对象取出来变成一个新数组)
this.principal[this.index].content = [
// 把最开始20条变成对象
...this.principal[this.index].content,
// 追加数据也变成对象
...res.list//list是存数据的地方
]
console.log(this.principal[this.index].content);
item(_(".swiper-slide .list")[this.index], res.list)
}
//轮播图
initPage() {
var self = this;
this.mySwiper = new Swiper('.swiper-container', {
direction: 'horizontal',
on: {
slideNextTransitionEnd: function () {
self.changeActive(this.activeIndex)
self.GetClassListDetails()
console.log(this.activeIndex);
}
}
})
}
}
new Index()

View File

@@ -0,0 +1,94 @@
class Info {
constructor() {
header("详情", `<i id="collection" class="iconfont icon-xin"></i>`)
this.getInfo();
this.Like()
}
/**
* 对收藏数组的localStorage中进行操作
*/
// 存数据
setLike(id) {
const like = this.getLike()
if (!!like && Array.isArray(like)) {
like.push(id)
localStorage.setItem("like", JSON.stringify(like))
} else {
localStorage.setItem("like", JSON.stringify([id]))
}
}
// 读取数据
getLike() {
const like = JSON.parse(localStorage.getItem("like"))
if (!!like && Array.isArray(like)) {
return like
}
return []
}
// 删除数据
removeLinke(id) {
let like = this.getLike()
like = like.filter(v => v !== id)
localStorage.setItem("like", JSON.stringify(like))
}
/**
* 根据本地存储的数据判断当前详情是否已被收藏
* 如果已经收藏则改变样式
*/
changeLikeStyle() {
const collectionDom = $("#collection")
// 读取id参数
const id = query("id")
const like = this.getLike()
// 如果id=-1 那么为空 没有收藏 否则已收藏
if (like.indexOf(id) === -1) {
collectionDom.remove("icon-aixin")
collectionDom.add("icon-xin")
} else {
collectionDom.remove("icon-xin")
collectionDom.add("icon-aixin")
}
}
/**
* 根据本地存储的数据判断当前详情
* 如果已有数据则删除数据 对应效果 取消收藏
* 如果没有数据则添加 添加收藏
*/
onLinke() {
const id = query("id")
const like = this.getLike()
// 如果id=-1 那么为空 没有数据存数据 否则删除数据
if (like.indexOf(id) === -1) {
this.setLike(id)
this.changeLikeStyle()
} else {
this.removeLinke(id)
this.changeLikeStyle()
}
}
Like() {
const collectionDom = $("#collection")
this.changeLikeStyle()
click(collectionDom, () => {
this.onLinke()
})
}
async getInfo() {
var res = await indexSever.info({
id: query("id"),
quantity: query("total")
});
res.forEach(v => {
$(".content").html(`<img src="${v}" alt="">`)
});
}
}
new Info();

View File

@@ -0,0 +1,6 @@
class Mechanism {
constructor() {
footer()
}
}
new Mechanism()

View File

@@ -0,0 +1,6 @@
class Model {
constructor() {
footer()
}
}
new Model()

View File

@@ -0,0 +1,6 @@
class My {
constructor() {
footer()
}
}
new My()

View File

@@ -0,0 +1,26 @@
class Model {
constructor() {
this.page = 1
header("分类")
this.tag = []
this.getTagList()
}
async getTagList() {
var res = await indexSever.ClassListDetails({
page: this.page,
id: query("id")
})
item($(".tag"), res.data)
this.tag.content = [
...this.tag,
...res.data
];
}
}
new Model()

View File

@@ -0,0 +1,65 @@
// 首页接口
class IndexSever {
// index接口封装
async index(data = {}) {
var ajax = new Ajax()
var res = await ajax.get({
url: config.apiList.index,
// data是由页面传过来的 当没有data时,data可以默认为空
data: data
})
ajax = null;
return res
}
// class接口封装
async ClassList(data = {}) {
// 定义一个变量 先对数据进行保存
var res = await (new Ajax()).get({
url: config.apiList.ClassList,
data: data
})
// 中间可以对数据进行处理
res.principal.unshift({//增加一个首页
//unshift往数组前面追加 push往数组后面追加
id: -1,
page: 1,
title: "首页",
})
// 给每个li增加一个content 把各自的数据存到content里面
res.principal.forEach(v => {
v.content = []
v.page = 1
v.total_page = 0
});
res.additional.forEach(v => {
v.content = []
v.page = 1
v.total_page = 0
});
// 最后返回数据
return res
}
// classlist接口封装
async ClassListDetails(data = {}) {
return await (new Ajax()).get({
url: config.apiList.ClassListDetails,
data: data
})
}
// info接口封装
async info(data = {}) {
return await (new Ajax()).get({
url: config.apiList.info,
data: data,
});
}
}
// 定义一个变量保存new
var indexSever = new IndexSever()

View File

@@ -0,0 +1,137 @@
class Util {
inject() {
Element.prototype.remove = function (removeClassName) {
this.classList.remove(removeClassName);
}
Element.prototype.add = function (addClassName) {
this.classList.add(addClassName);
}
HTMLElement.prototype.text = function (text) {
this.innerText = text
}
HTMLElement.prototype.html = function (text) {
this.innerHTML += text;
}
}
header(title = " ", icon) {
$("body").html(`
<div class="pub-header">
<i class="iconfont icon-back1"></i>
<div class="text">${title}</div>
//${icon}
</div>
`)
click($(".icon-back1"), function () {
history.back()
})
}
item(father, data) {
data.forEach(v => {
father.html(`
<div class="item">
<a href="./info.html?id=${v.id}&total=${v.total || v.shuliang}">
<div class="item_top">
<img src="${v.img_src || v.preview}"
alt="">
<span>${v.shuliang || v.total}</span>
</div>
<div class="item_text">
<div class="title ellipsis">${v.title}</div>
<div class="model ellipsis">模特:${v.user || v.renwulist[0].name}</div>
<div class="source ellipsis">${v.source || v.jigoulist[0].name}</div>
</div>
</a>
<div class="item_tag">
${(v.tags || v.biaoqianlist).map(a => {
return ` <a class="tag_item" href="./tag.html?id=${v.id}">${a.name || a.title}</a>`
}).toString().replaceAll(",", "")
}
</div>
</div>
`)
})
}
//
// getQueryVariable(variable) {
// var query = window.location.search.substring(1);
// var vars = query.split("&");
// for (var i = 0; i < vars.length; i++) {
// var pair = vars[i].split("=");
// if (pair[0] == variable) { return pair[1]; }
// }
// return (false);
// }
// 底部导航条
footer() {
var ul = `
<ul class="footer">
${config.footerList.map((v, i) => {
// 判断地址是否包括url的短地址 包括为(true)class加active 不包括为(false)空
return `<li class="${location.href.includes(v.url) ? 'active' : ''}">
<a href="${v.url}">
<i class="iconfont ${v.icon}"></i>
<p>${v.title}</p>
</a>
</li>`
}).toString().replaceAll(",", "")
}
</ul>
`;
//console.log(ul);
// body里面插入ul
$("body").html(ul)
}
// 获取url参数中的key
query(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
// click(className, callback) {
// $(className).onclick = () => {
// callback()
// }
// }
click(className, callback) {
var domArr = Array.from(className);
if (domArr.length != 0) {
className.forEach((v, i) => {
v.onclick = function (e) {
v.index = i;
v.e = e;
callback.call(this)
}
})
} else {
className.onclick = function (e) {
className.e = e;
callback.call(this)
}
}
}
$(className) {
return document.querySelector(className)
}
_(className) {
return document.querySelectorAll(className)
}
}
var { $, _, click, inject, query, footer, item, header, //getQueryVariable
} = new Util()
inject()

View File

@@ -0,0 +1,12 @@
; (function (doc, win, undefined) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in win ? 'orientationchange' : 'resize',
recalc = function () {
var clientWidth = docEl.clientWidth;
if (clientWidth === undefined) return;
docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
};
if (doc.addEventListener === undefined) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false)
})(document, window);