no message

This commit is contained in:
DESKTOP-RQ919RC\Pc
2025-10-09 19:03:57 +08:00
commit 452d486573
7 changed files with 18834 additions and 0 deletions

255
css/index.css Normal file
View File

@@ -0,0 +1,255 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
}
.one-line-display {
word-break: keep-all;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 公共的 css 样式 */
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
.flexcolumn {
display: flex;
flex-direction: column;
}
view,
swiper,
swiper-item,
scroll-view,
textarea,
editor {
box-sizing: border-box;
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
font-weight: 400;
font-style: normal;
}
.container {
min-height: 100vh;
background-color: #f5f5f5;
padding-bottom: 3.2rem;
padding-top: 0.4rem;
}
.container .title-box {
width: 9.4rem;
margin: 0 auto 0.4rem;
background-color: #ffffff;
border: 0.0133rem solid #f2f2f2;
border-radius: 0.4rem;
padding: 0.4rem;
}
.container .title-box .input {
width: 100%;
min-height: 1rem;
word-break: break-all;
line-height: 0.56rem;
outline: none;
border: none;
}
.container .editor-box {
width: 9.4rem;
margin: 0 auto 0.4rem;
background-color: #ffffff;
border: 0.0133rem solid #f2f2f2;
border-radius: 0.4rem;
}
.container .editor-box .editor {
margin: 0.4rem;
width: 8.6rem;
min-height: 10rem;
border: none;
outline: none;
overflow: auto;
}
.container .editor-box .editor img {
width: 8.6rem;
display: block;
}
.container .editor-box .label {
white-space: nowrap;
width: 100vw;
height: 0.64rem;
margin-bottom: 0.4rem;
width: 9.4rem;
overflow: auto;
}
.container .editor-box .label .item {
width: fit-content;
height: 0.64rem;
line-height: 0.64rem;
background-color: #f6f6f6;
border-radius: 1.46rem;
font-size: 0.28rem;
color: #606060;
padding: 0 0.24rem;
display: inline-flex;
}
.container .editor-box .label .item:not(:last-of-type) {
margin-right: 0.2rem;
}
.container .editor-box .label .item:first-of-type {
margin-left: 0.4rem;
}
.container .editor-box .label .item:last-of-type {
margin-right: 0.4rem;
}
.container .editor-box .btn-list {
margin: 0 0.4rem 0.4rem;
}
.container .editor-box .btn-list .item {
width: fit-content;
height: 0.72rem;
line-height: 0.72rem;
background-color: #f6f6f6;
border: 0.0133rem solid #ebebeb;
border-radius: 1.46rem;
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
font-size: 0.32rem;
color: #555555;
padding: 0 0.24rem;
margin-right: 0.2rem;
}
.container .editor-box .btn-list .item.pitch {
background-color: #f6f6bd;
}
.container .editor-box .btn-list .item .icon {
width: 0.4rem;
height: 0.4rem;
margin-right: 0.14rem;
}
.container .editor-box .btn-list .unfold {
width: 0.72rem;
height: 0.72rem;
background-color: #f6f6f6;
border: 0.0133rem solid #ebebeb;
border-radius: 1.4667rem;
}
.container .editor-box .btn-list .unfold .icon {
width: 0.32rem;
height: 0.32rem;
}
.container .anonymity {
margin-left: 0.4rem;
}
.container .anonymity .icon {
width: 0.32rem;
height: 0.32rem;
border: 0.0133rem solid #797979;
}
.container .anonymity .icon-pitch {
width: 0.32rem;
height: 0.32rem;
}
.container .anonymity .text {
color: #000000;
margin-left: 0.16rem;
font-size: 0.32rem;
}
.container .new-footer-btn {
width: 10rem;
height: 2.4rem;
background-color: #ffffff;
border: 0.0133rem solid #ebebeb;
position: fixed;
bottom: 0;
left: 0;
z-index: 10;
padding: 0.34rem 0.3rem 0;
box-sizing: border-box;
display: flex;
}
.container .new-footer-btn .save-draft-btn {
flex-direction: column;
margin-right: 0.4rem;
color: #7f7f7f;
font-size: 0.32rem;
}
.container .new-footer-btn .save-draft-btn .save-draft-icon-box {
width: 0.84rem;
height: 0.84rem;
background-color: rgba(242, 242, 242, 0.69803922);
border-radius: 0.2rem;
margin-bottom: 0.12rem;
}
.container .new-footer-btn .save-draft-btn .save-draft-icon-box .save-draft-icon {
width: 0.48rem;
height: 0.48rem;
}
.container .new-footer-btn .new-footer-submit {
height: 1.4rem;
line-height: 1.4rem;
text-align: center;
background-color: #cff7ff;
border: 0.0133rem solid #badee6;
border-radius: 0.2rem;
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-size: 0.5067rem;
color: #026277;
}
.container .pop {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 101;
align-items: flex-end;
}
.container .pop .emoji-system-list {
width: 100vw;
background-color: #ececec;
overflow: auto;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
position: relative;
padding: 0.4rem 0.4rem 0;
font-size: 0.8rem;
box-sizing: border-box;
height: 0;
animation: growHeight 0.5s ease forwards;
}
@keyframes growHeight {
0% {
height: 0;
}
100% {
height: 8.6667rem;
}
}
.container .pop .emoji-system-list .item {
margin-bottom: 0.1333rem;
display: inline-block;
min-width: 1.15rem;
min-height: 0.9333rem;
text-align: center;
}
.container .pop .emoji-system-list .item:nth-child(8n-1) {
margin-right: 0;
}
.container .pop .emoji-system-list .fill {
width: 100%;
height: 2.2667rem;
}

297
css/index.less Normal file
View File

@@ -0,0 +1,297 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
}
.one-line-display {
word-break: keep-all;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 公共的 css 样式 */
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
.flexcolumn {
display: flex;
flex-direction: column;
}
view,
swiper,
swiper-item,
scroll-view,
textarea,
editor {
box-sizing: border-box;
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
font-weight: 400;
font-style: normal;
}
.container {
min-height: 100vh;
background-color: rgba(245, 245, 245, 1);
padding-bottom: 3.2rem;
padding-top: 0.4rem;
.title-box {
width: 9.4rem;
margin: 0 auto 0.4rem;
background-color: rgba(255, 255, 255, 1);
border: 0.0133rem solid rgba(242, 242, 242, 1);
border-radius: 0.4rem;
padding: 0.4rem;
.input {
width: 100%;
min-height: 1rem;
word-break: break-all;
line-height: 0.56rem;
outline: none;
border: none;
}
}
.editor-box {
width: 9.4rem;
margin: 0 auto 0.4rem;
background-color: rgba(255, 255, 255, 1);
border: 0.0133rem solid rgba(242, 242, 242, 1);
border-radius: 0.4rem;
.editor {
margin: 0.4rem;
width: 8.6rem;
min-height: 10rem;
border: none;
outline: none;
overflow: auto;
img {
width: 8.6rem;
display: block;
}
}
.label {
white-space: nowrap;
width: 100vw;
height: 0.64rem;
margin-bottom: 0.4rem;
width: 9.4rem;
overflow: auto;
.item {
width: fit-content;
height: 0.64rem;
line-height: 0.64rem;
background-color: rgba(246, 246, 246, 1);
border-radius: 1.46rem;
font-size: 0.28rem;
color: #606060;
padding: 0 0.24rem;
display: inline-flex;
&:not(:last-of-type) {
margin-right: 0.2rem;
}
&:first-of-type {
margin-left: 0.4rem;
}
&:last-of-type {
margin-right: 0.4rem;
}
}
}
.btn-list {
margin: 0 0.4rem 0.4rem;
.item {
width: fit-content;
height: 0.72rem;
line-height: 0.72rem;
background-color: rgba(246, 246, 246, 1);
border: 0.0133rem solid rgba(235, 235, 235, 1);
border-radius: 1.46rem;
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
font-size: 0.32rem;
color: #555555;
padding: 0 0.24rem;
margin-right: 0.2rem;
&.pitch {
background-color: rgba(246, 246, 189, 1);
}
.icon {
width: 0.4rem;
height: 0.4rem;
margin-right: 0.14rem;
}
}
.unfold {
width: 0.72rem;
height: 0.72rem;
background-color: rgba(246, 246, 246, 1);
border: 0.0133rem solid rgba(235, 235, 235, 1);
border-radius: 1.4667rem;
.icon {
width: 0.32rem;
height: 0.32rem;
}
}
}
}
.anonymity {
margin-left: 0.4rem;
.icon {
width: 0.32rem;
height: 0.32rem;
border: 0.0133rem solid #797979;
}
.icon-pitch {
width: 0.32rem;
height: 0.32rem;
}
.text {
color: rgb(0, 0, 0);
margin-left: 0.16rem;
font-size: 0.32rem;
}
}
.new-footer-btn {
width: 10rem;
height: 2.4rem;
background-color: rgba(255, 255, 255, 1);
border: 0.0133rem solid rgba(235, 235, 235, 1);
position: fixed;
bottom: 0;
left: 0;
z-index: 10;
padding: 0.34rem 0.3rem 0;
box-sizing: border-box;
display: flex;
.save-draft-btn {
flex-direction: column;
margin-right: 0.4rem;
color: #7f7f7f;
font-size: 0.32rem;
.save-draft-icon-box {
width: 0.84rem;
height: 0.84rem;
background-color: rgba(242, 242, 242, 0.698039215686274);
border-radius: 0.2rem;
margin-bottom: 0.12rem;
.save-draft-icon {
width: 0.48rem;
height: 0.48rem;
}
}
}
.new-footer-submit {
height: 1.4rem;
line-height: 1.4rem;
text-align: center;
background-color: rgba(207, 247, 255, 1);
border: 0.0133rem solid rgba(186, 222, 230, 1);
border-radius: 0.2rem;
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
font-size: 0.5067rem;
color: #026277;
}
}
.pop {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
// background-color: rgba(0, 0, 0, 0.5);
z-index: 101;
align-items: flex-end;
.emoji-system-list {
width: 100vw;
background-color: rgba(236, 236, 236, 1);
overflow: auto;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
position: relative;
padding: 0.4rem 0.4rem 0;
font-size: 0.8rem;
box-sizing: border-box;
height: 0;
animation: growHeight 0.5s ease forwards;
@keyframes growHeight {
0% {
height: 0;
}
100% {
height: 8.6667rem;
}
}
.item {
margin-bottom: 0.1333rem;
display: inline-block;
min-width: 1.15rem;
min-height: 0.9333rem;
text-align: center;
&:nth-child(8n-1) {
margin-right: 0;
}
}
.fill {
width: 100%;
height: 2.2667rem;
}
}
}
}

70
index.html Normal file
View File

@@ -0,0 +1,70 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>发布帖子</title>
<link rel="stylesheet" href="./css/index.css" />
<script src="./js/vue.global.js"></script>
</head>
<body>
<div class="container" id="appIndex">
<div class="title-box">
<textarea class="input" placeholder="输入标题(非必填)" :maxlength="titleLength" v-model="title" ref="titleTextarea" @input="adjustTextareaHeight"></textarea>
</div>
<div class="editor-box">
<div class="editor" ref="editorRef" id="editor" placeholder="输入正文" contenteditable="true" @input="onEditorInput"></div>
<div class="label flexflex" scroll-x>
<div class="item" v-for="index in 8" :key="index" @click="insertLabel">#推荐标签</div>
</div>
<div class="btn-list flexacenter">
<div class="item flexacenter" :class="{ 'pitch': isPTitle }" @click="paragraphTitle">
<img class="icon" src="https://app.gter.net/image/miniApp/offer/T-icon.png" />
<div class="text">段落标题</div>
</div>
<div class="item flexacenter" @click="insertImage">
<img class="icon" src="https://app.gter.net/image/miniApp/offer/img-icon.png" />
<div class="text">图片</div>
</div>
<div class="item flexacenter" bind:tap="openEmoji">
<img class="icon" src="https://app.gter.net/image/miniApp/offer/smiling-face-round-black.png" />
<div class="text">表情</div>
</div>
<div class="flex1"></div>
<div class="unfold flexcenter">
<!-- https://app.gter.net/image/miniApp/offer/fold-icon.png -->
<img class="icon" src="https://app.gter.net/image/miniApp/offer/unfold-icon.png" />
</div>
</div>
</div>
<div class="anonymity flexacenter" bind:tap="cutAnonymity">
<img v-if="info.anonymity == 1" class="icon-pitch" src="https://app.gter.net/image/miniApp/offer/tick-box.svg" />
<div v-else class="icon"></div>
<div class="text">匿名发布</div>
</div>
<!-- <cover-view class="new-footer-btn">
<cover-view view class="flexacenter save-draft-btn" bindtap="handleLastPublish" data-state="0">
<cover-view class="flexcenter save-draft-icon-box">
<cover-image class="save-draft-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/draft-icon.png"></cover-image>
</cover-view>
<cover-view>存草稿</cover-view>
</cover-view>
<cover-view class="new-footer-submit flex1 flexcenter" bindtap="authenticationSubmit">发布</cover-view>
</cover-view> -->
<!-- <view class="pop flexflex" wx:if="{{ emojiState }}" bind:tap="closeEmoji">
<scroll-view class="emoji-system-list" scroll-y="{{ true }}" show-scrollbar="{{ false }}" enhanced="{{ true }}" style="font-size: {{ isIos ? '60rpx' : '50rpx' }};">
<view class="item" wx:for="{{ optionEmoji }}" wx:key="index" catch:tap="selectEmoji" data-item="{{ item }}">{{ item }}</view>
<view class="fill"></view>
</scroll-view>
</view> -->
</div>
<script src="./js/fontSize.js"></script>
<script src="./js/index.js"></script>
</body>
</html>

2
js/axios.min.js vendored Normal file

File diff suppressed because one or more lines are too long

40
js/fontSize.js Normal file
View File

@@ -0,0 +1,40 @@
(function (window, document) {
var sizeUI = 750; // 定义设计图尺寸
var remBase = 75; // 定义基准值
var docEl = document.documentElement;
var bodyEl = document.querySelector("body");
setRemUnit();
window.addEventListener("resize", setRemUnit);
window.addEventListener("pageshow", function (e) {
if (e.persisted) setRemUnit();
});
function setRemUnit() {
var docFontSize = (docEl.clientWidth / sizeUI) * remBase;
console.log("bodyEl", bodyEl);
docEl.style.fontSize = docFontSize + "px";
bodyEl.style.fontSize = 16 / docFontSize + "rem";
handleRemAdapt();
}
function handleRemAdapt() {
var currentFontSize = parseInt(docEl.style.fontSize);
var temp = currentFontSize;
for (var i = 0; i < 100; i++) {
var realFontSize = parseInt(window.getComputedStyle(docEl).fontSize);
var differ = realFontSize - currentFontSize;
if (Math.abs(differ) >= 1) {
if (differ > 0) {
temp--;
} else {
temp++;
}
docEl.style.fontSize = temp + "px";
} else {
break;
}
}
}
})(window, document);

131
js/index.js Normal file
View File

@@ -0,0 +1,131 @@
const { createApp, ref, onMounted, nextTick, onUnmounted, computed, watch } = Vue;
createApp({
setup() {
let titleLength = ref(200);
let title = ref("发");
let info = ref({
anonymity: 0,
});
const titleTextarea = ref(null);
const adjustTextareaHeight = () => {
nextTick(() => {
const textarea = titleTextarea.value;
if (textarea) {
textarea.style.height = "auto";
textarea.style.height = textarea.scrollHeight + "px";
}
});
};
watch(title, () => {
adjustTextareaHeight();
});
const editorRef = ref(null);
onMounted(() => {
document.addEventListener("selectionchange", getFocusedNodeName);
});
// 获取当前焦点所在的节点名称(仅在.editor内
const getFocusedNodeName = () => {
const selection = window.getSelection();
if (!selection.rangeCount) return null;
lastSelection = selection.getRangeAt(0);
// 获取焦点所在的节点
let focusedNode = selection.focusNode;
// 如果是文本节点,取其父元素
if (focusedNode.nodeType === Node.TEXT_NODE) {
focusedNode = focusedNode.parentNode;
}
// 检查节点是否在.editor容器内
const isInEditor = editorRef.value.contains(focusedNode);
if (!isInEditor) return null;
if (focusedNode.tagName?.toLowerCase() == "h2") isPTitle.value = true;
else isPTitle.value = false;
};
const isPTitle = ref(false);
let lastSelection = null;
const onEditorInput = () => {
const selection = window.getSelection();
if (selection.rangeCount > 0) {
lastSelection = selection.getRangeAt(0);
updatePTitleStatus();
}
};
const paragraphTitle = () => {
editorRef.value.focus();
if (!lastSelection) return;
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(lastSelection);
const focusNode = lastSelection.startContainer;
document.execCommand("formatBlock", false, focusNode?.parentNode?.tagName == "H2" ? "P" : "H2");
};
const updatePTitleStatus = () => {
if (lastSelection) {
const node = lastSelection.commonAncestorContainer;
isPTitle.value = node.nodeName === "H2" || (node.nodeType === Node.TEXT_NODE && node.parentNode?.nodeName === "H2");
}
};
const insertImage = () => {
const input = document.createElement("input");
input.type = "file";
input.accept = "image/*";
input.onchange = (e) => {
const file = e.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
// 创建图片元素
const img = document.createElement("img");
img.src = e.target.result;
img.alt = "用户上传图片";
// 确保编辑器获得焦点
editorRef.value.focus();
// 获取选择对象
const selection = window.getSelection();
// 如果有选择范围,在选择范围插入图片
console.log("rangeCount", selection.rangeCount);
if (selection.rangeCount > 0) {
const range = selection.getRangeAt(0);
range.deleteContents(); // 清除当前选择内容
range.insertNode(img); // 插入图片
// 将光标移动到图片后面
range.setStartAfter(img);
range.setEndAfter(img);
selection.removeAllRanges();
selection.addRange(range);
} else {
// 如果没有选择范围,直接追加到编辑器末尾
editorRef.value.appendChild(img);
}
};
reader.readAsDataURL(file);
};
input.click();
};
return { editorRef, info, title, titleLength, titleTextarea, adjustTextareaHeight, isPTitle, paragraphTitle, insertImage, onEditorInput };
},
}).mount("#appIndex");

18039
js/vue.global.js Normal file

File diff suppressed because it is too large Load Diff