mirror of
https://github.com/LingChair/LingChair-V0.git
synced 2025-12-08 10:05:49 +08:00
Compare commits
3 Commits
v0.6.1
...
v0.7.0-rc2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
541f043531 | ||
|
|
7253f0a4ec | ||
|
|
f19c3c793a |
@@ -43,3 +43,12 @@ body {
|
|||||||
margin-top: 60px;
|
margin-top: 60px;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[n-id=pageChatSeesion]::after {
|
||||||
|
content: "";
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
|
display: block;
|
||||||
|
height: var(--pseudo-height); /* 设置伪元素的高度 */
|
||||||
|
z-index: -1; /* 防止遮挡实际内容 */
|
||||||
|
}
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
<!-- 代替私人 fixed 并提供更好的兼容性 -->
|
<!-- 代替私人 fixed 并提供更好的兼容性 -->
|
||||||
<script src="https://cdn.jsdelivr.net/gh/wilddeer/stickyfill@2.1.0/dist/stickyfill.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/gh/wilddeer/stickyfill@2.1.0/dist/stickyfill.min.js"></script>
|
||||||
<script src="https://unpkg.com/jquery@3.7.1/dist/jquery.min.js"></script>
|
<script src="https://unpkg.com/jquery@3.7.1/dist/jquery.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js"></script>
|
||||||
<link rel="icon" href="icon.ico" />
|
<link rel="icon" href="icon.ico" />
|
||||||
<title>铃之椅</title>
|
<title>铃之椅</title>
|
||||||
</head>
|
</head>
|
||||||
@@ -49,23 +50,48 @@
|
|||||||
class="mdui-theme-primary-teal mdui-theme-accent-teal mdui-drawer-body-left mdui-appbar-with-toolbar mdui-theme-layout-auto"
|
class="mdui-theme-primary-teal mdui-theme-accent-teal mdui-drawer-body-left mdui-appbar-with-toolbar mdui-theme-layout-auto"
|
||||||
id="app">
|
id="app">
|
||||||
|
|
||||||
<input n-id="textCopier" class="mdui-hidden" />
|
<input n-id="textCopierBtn" class="mdui-hidden" />
|
||||||
|
|
||||||
<div id="lingchair-app" style="height: 100%;">
|
<div id="lingchair-app" style="height: 100%;">
|
||||||
<!-- 侧滑栏 -->
|
<!-- 侧滑栏 -->
|
||||||
<div class="mdui-drawer" id="main-drawer">
|
<div class="mdui-drawer" id="main-drawer">
|
||||||
<ul class="mdui-list">
|
<ul class="mdui-list" mdui-collapse="{accordion: true}">
|
||||||
<li class="mdui-list-item mdui-ripple">
|
<li class="mdui-list-item mdui-ripple">
|
||||||
<div class="mdui-list-item-avatar">
|
<div class="mdui-list-item-avatar">
|
||||||
<img src="default_head.png" n-id="userHead" onerror="this.src='default_head.png'" />
|
<img src="default_head.png" n-id="userHead" onerror="this.src='default_head.png'" />
|
||||||
</div>
|
</div>
|
||||||
<div class="mdui-list-item-content"><a n-id="helloText">早安</a>, <a n-id="userNick">Unknown</a></div>
|
<div class="mdui-list-item-content"><a n-id="helloText">早安</a>, <a n-id="userNick">Unknown</a></div>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogSettings.get(0)).open()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">settings</i>
|
||||||
|
<div class="mdui-list-item-content">设置</div>
|
||||||
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" n-id="drawerSignOut">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">exit_to_app</i>
|
||||||
|
<div class="mdui-list-item-content">登出</div>
|
||||||
|
</li>
|
||||||
|
<div class="mdui-subheader">聊天</div>
|
||||||
|
<li class="mdui-collapse-item">
|
||||||
|
<div class="mdui-collapse-item-header mdui-list-item mdui-ripple"><i class="mdui-list-item-icon mdui-icon material-icons">contacts</i>
|
||||||
|
<div class="mdui-list-item-content">联系人</div><i
|
||||||
|
class="mdui-collapse-item-arrow mdui-icon material-icons">keyboard_arrow_down</i>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-collapse-item-body mdui-list" n-id="contactsList">
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul class="mdui-list mdui-hidden">
|
||||||
|
|
||||||
<li class="mdui-subheader">个人</li>
|
<li class="mdui-subheader">个人</li>
|
||||||
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">
|
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
||||||
<div class="mdui-list-item-content">资料</div>
|
<div class="mdui-list-item-content">资料</div>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">person_add</i>
|
||||||
|
<div class="mdui-list-item-content">新的好友</div>
|
||||||
|
</li>
|
||||||
<li class="mdui-subheader">客户端</li>
|
<li class="mdui-subheader">客户端</li>
|
||||||
<li class="mdui-list-item mdui-ripple">
|
<li class="mdui-list-item mdui-ripple">
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">settings</i>
|
<i class="mdui-list-item-icon mdui-icon material-icons">settings</i>
|
||||||
@@ -75,10 +101,6 @@
|
|||||||
<i class="mdui-list-item-icon mdui-icon material-icons">cloud_circle</i>
|
<i class="mdui-list-item-icon mdui-icon material-icons">cloud_circle</i>
|
||||||
<div class="mdui-list-item-content">更换服务器</div>
|
<div class="mdui-list-item-content">更换服务器</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="mdui-list-item mdui-ripple" n-id="drawerSignOut">
|
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">exit_to_app</i>
|
|
||||||
<div class="mdui-list-item-content">退出登录</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -91,10 +113,13 @@
|
|||||||
</a>
|
</a>
|
||||||
<a class="mdui-typo-title" n-id="appTitle"></a>
|
<a class="mdui-typo-title" n-id="appTitle"></a>
|
||||||
<div class="mdui-toolbar-spacer"></div>
|
<div class="mdui-toolbar-spacer"></div>
|
||||||
<a onclick="ContactsList.reloadList()" n-id="contactsRefresh" class="mdui-btn mdui-btn-icon mdui-ripple">
|
<a onclick="refreshAll()" n-id="contactsRefresh" class="mdui-btn mdui-btn-icon mdui-ripple">
|
||||||
<i class="mdui-icon material-icons">refresh</i>
|
<i class="mdui-icon material-icons">refresh</i>
|
||||||
</a>
|
</a>
|
||||||
<a class="mdui-btn mdui-btn-icon mdui-ripple" n-id="switchNotifications" mdui-tooltip="{content:'开/关通知'}">
|
<a onclick="ContactsList.openAddDialog()" n-id="contactsAdd" class="mdui-btn mdui-btn-icon mdui-ripple">
|
||||||
|
<i class="mdui-icon material-icons">add</i>
|
||||||
|
</a>
|
||||||
|
<a class="mdui-btn mdui-btn-icon mdui-ripple" n-id="switchNotifications">
|
||||||
<i class="mdui-icon material-icons" n-id="switchNotificationsIcon">notifications_off</i>
|
<i class="mdui-icon material-icons" n-id="switchNotificationsIcon">notifications_off</i>
|
||||||
</a>
|
</a>
|
||||||
<a mdui-menu="{target: '#appbar-menu'}" class="mdui-btn mdui-btn-icon mdui-ripple">
|
<a mdui-menu="{target: '#appbar-menu'}" class="mdui-btn mdui-btn-icon mdui-ripple">
|
||||||
@@ -110,38 +135,26 @@
|
|||||||
|
|
||||||
<!-- Tab 栏 -->
|
<!-- Tab 栏 -->
|
||||||
<div class="mdui-tab mdui-accent-theme mdui-theme-color-auto" style="position: fixed; z-index: 114;width: 100%;"
|
<div class="mdui-tab mdui-accent-theme mdui-theme-color-auto" style="position: fixed; z-index: 114;width: 100%;"
|
||||||
mdui-tab>
|
mdui-tab n-id="chatTab">
|
||||||
<!-- 侧滑栏的 z-index 是2000, 在移动端会直接覆盖 -->
|
<!-- 侧滑栏的 z-index 是2000, 在移动端会直接覆盖 -->
|
||||||
<a href="#page-chat-list" n-id="tabChatList" class="mdui-ripple">常用</a>
|
|
||||||
<a href="#page-contacts" n-id="tabContacts" class="mdui-ripple">通讯录</a>
|
|
||||||
<a href="#page-chat-seesion" n-id="tabChatSeesion" class="mdui-ripple" style="text-transform: none;"></a>
|
<a href="#page-chat-seesion" n-id="tabChatSeesion" class="mdui-ripple" style="text-transform: none;"></a>
|
||||||
</div>
|
</div>
|
||||||
<div id="page-chat-list" class="mdui-p-a-2 container">
|
|
||||||
<div class="mdui-valign content" style="margin-top: 40px;">
|
|
||||||
<span class="mdui-center">欢迎回来! (^▽^。)</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="page-contacts" class="mdui-p-a-2">
|
|
||||||
<ul class="mdui-list" style="margin-top: 30px;">
|
|
||||||
<li class="mdui-subheader">好友</li>
|
|
||||||
<div n-id="contactsList">
|
|
||||||
</div>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<!-- 滚动到底部咋这么难写... -->
|
<!-- 滚动到底部咋这么难写... -->
|
||||||
<div id="page-chat-seesion" class="mdui-p-a-2" style="display: flex;flex-direction: column;">
|
<div class="mdui-p-a-2" style="display: flex;flex-direction: column;">
|
||||||
<!-- 写时间居中写到吐了 这样式表不能要了 -->
|
<!-- 写时间居中写到吐了 这样式表不能要了 -->
|
||||||
<div
|
<div
|
||||||
style="margin-top: 30px;overflow: auto;width: 100%;max-width: 100%;height: 100%;max-height: 100%;min-height: 0;margin-bottom: 40px;flex: 1 1 auto;display: flex;flex-direction: column;">
|
style="margin-top: 30px;overflow: auto;width: 100%;max-width: 100%;height: 100%;max-height: 100%;min-height: 0;flex: 1 1 auto;display: flex;flex-direction: column;"
|
||||||
|
n-id="chatPager">
|
||||||
<div class="mdui-center" style="margin: 15px;"><a href="javascript:;" onclick="ChatMsgAdapter.loadMore()"
|
<div class="mdui-center" style="margin: 15px;"><a href="javascript:;" onclick="ChatMsgAdapter.loadMore()"
|
||||||
class="mdui-text-color-theme">点我</a>继续加载前面的聊天记录, 或者<a href="javascript:;"
|
class="mdui-text-color-theme">加载更多</a> | <a href="javascript:;"
|
||||||
onclick="ChatMsgAdapter.scrollToBottom()" class="mdui-text-color-theme">回到底部</a></div>
|
onclick="ChatMsgAdapter.scrollToBottom()" class="mdui-text-color-theme">回到底部</a></div>
|
||||||
<div n-id="pageChatSeesion" style="flex: 1 1 auto;display: flex;flex-direction: column;"></div>
|
<div n-id="pageChatSeesion" style="flex: 1 1 auto;display: flex;flex-direction: column;position: relative;">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 妈的黑化了 私人玩意这么难整 早知道 z-index 弄死它得了 浪费我时间 我就没试过这么离谱的样式表 第三方库真难写CSS 就应该先写后端的 啊啊啊啊啊啊 -->
|
<!-- 妈的黑化了 私人玩意这么难整 早知道 z-index 弄死它得了 浪费我时间 我就没试过这么离谱的样式表 第三方库真难写CSS 就应该先写后端的 啊啊啊啊啊啊 -->
|
||||||
<!-- 不黑化了 因为 stickyfill -->
|
<!-- 不黑化了 因为 stickyfill -->
|
||||||
<div class="mdui-toolbar mdui-theme-color-auto"
|
<div class="mdui-toolbar mdui-theme-color-auto"
|
||||||
style="position: sticky;max-width: 100%;margin-bottom: -30px;bottom: 0;z-index: 101;">
|
style="position: sticky;max-width: 100%;margin-bottom: -30px;bottom: 0;z-index: 101;" n-id="inputToolbar">
|
||||||
<ul class="mdui-menu" id="msg-input-more">
|
<ul class="mdui-menu" id="msg-input-more">
|
||||||
<li class="mdui-menu-item">
|
<li class="mdui-menu-item">
|
||||||
<a class="mdui-ripple">插入图片</a>
|
<a class="mdui-ripple">插入图片</a>
|
||||||
@@ -209,28 +222,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 资料编辑对话框 -->
|
<!--
|
||||||
<div class="mdui-dialog" n-id="dialogMyProfile">
|
<div class="mdui-dialog" n-id="dialogMyProfile">
|
||||||
<div class="mdui-dialog-title">
|
<div class="mdui-dialog-title">
|
||||||
资料
|
资料
|
||||||
</div>
|
</div>
|
||||||
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
||||||
<ul class="mdui-list">
|
<ul class="mdui-list">
|
||||||
<li class="mdui-list-item mdui-ripple" mdui-dialog-close
|
|
||||||
onclick="(async () => {viewBinding.dialogEditNickNick.val(await NickCache.getNick(localStorage.userName));new mdui.Dialog(viewBinding.dialogEditNick.get(0)).open()})()">
|
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">edit</i>
|
|
||||||
<div class="mdui-list-item-content">修改昵称</div>
|
|
||||||
</li>
|
|
||||||
<li class="mdui-list-item mdui-ripple" onclick="User.uploadHeadImage()">
|
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
|
||||||
<div class="mdui-list-item-content">上传头像</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="mdui-dialog-actions">
|
<div class="mdui-dialog-actions">
|
||||||
<button class="mdui-btn mdui-ripple" mdui-dialog-close>关闭</button>
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close>关闭</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
|
|
||||||
<!-- 编辑昵称对话框 -->
|
<!-- 编辑昵称对话框 -->
|
||||||
<div class="mdui-dialog" n-id="dialogEditNick">
|
<div class="mdui-dialog" n-id="dialogEditNick">
|
||||||
@@ -245,11 +250,73 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mdui-dialog-actions">
|
<div class="mdui-dialog-actions">
|
||||||
<button class="mdui-btn mdui-ripple" n-id="dialogEditNickClose" mdui-dialog-close
|
<button class="mdui-btn mdui-ripple" n-id="dialogEditNickClose" mdui-dialog-close
|
||||||
onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">关闭</button>
|
onclick="new mdui.Dialog(viewBinding.dialogSettings.get(0)).open()">关闭</button>
|
||||||
<button class="mdui-btn mdui-ripple"
|
<button class="mdui-btn mdui-ripple"
|
||||||
onclick="User.setNick(viewBinding.dialogEditNickNick.val(), () => {mdui.snackbar('已保存, 刷新页面生效');viewBinding.dialogEditNickClose.click()})">保存</button>
|
onclick="User.setNick(viewBinding.dialogEditNickNick.val(), () => {mdui.snackbar('已保存, 刷新页面生效');viewBinding.dialogEditNickClose.click()})">保存</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 懂得都懂 -->
|
||||||
|
<div class="mdui-dialog" n-id="dialogNewFriendRequest">
|
||||||
|
<div class="mdui-dialog-title">
|
||||||
|
新的好友请求
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
||||||
|
<div class="mdui-textfield">
|
||||||
|
<label class="mdui-textfield-label">昵称</label>
|
||||||
|
<input n-id="dialogEditNickNick" class="mdui-textfield-input" maxlength="30" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-actions">
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close>关闭</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 懂得都懂 -->
|
||||||
|
<div class="mdui-dialog" n-id="dialogNewContact">
|
||||||
|
<div class="mdui-dialog-title">
|
||||||
|
添加好友/群
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
||||||
|
<div class="mdui-textfield">
|
||||||
|
<label class="mdui-textfield-label">好友/群的ID (不是名称)</label>
|
||||||
|
<input n-id="dialogNewContactID" class="mdui-textfield-input" maxlength="30" type="text" />
|
||||||
|
</div>
|
||||||
|
<select class="mdui-select" mdui-select="{position: 'top'}" n-id="dialogNewContactType">
|
||||||
|
<option value="single">好友</option>
|
||||||
|
<option value="group">群聊</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-actions">
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close
|
||||||
|
onclick="ContactsList.add(viewBinding.dialogNewContactID.val(), viewBinding.dialogNewContactType.val())">确认并关闭</button>
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close>取消</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 懂得都懂 -->
|
||||||
|
<div class="mdui-dialog" n-id="dialogSettings">
|
||||||
|
<div class="mdui-dialog-title">
|
||||||
|
设置
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
||||||
|
<ul class="mdui-list">
|
||||||
|
<div class="mdui-subheader">我的资料</div>
|
||||||
|
<li class="mdui-list-item mdui-ripple" mdui-dialog-close
|
||||||
|
onclick="(async () => {viewBinding.dialogEditNickNick.val(await NickCache.getNick(localStorage.userName));new mdui.Dialog(viewBinding.dialogEditNick.get(0)).open()})()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">edit</i>
|
||||||
|
<div class="mdui-list-item-content">修改昵称</div>
|
||||||
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" onclick="User.uploadHeadImage()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
||||||
|
<div class="mdui-list-item-content">上传头像</div>
|
||||||
|
</li>
|
||||||
|
<div class="mdui-subheader">客户端</div>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-actions">
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close>关闭</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mdui-hidden">
|
<div class="mdui-hidden">
|
||||||
|
|||||||
@@ -123,22 +123,26 @@ $.ajax({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// Toolbar 快捷按钮绑定
|
/* // Toolbar 快捷按钮绑定
|
||||||
viewBinding.contactsRefresh.hide()
|
viewBinding.contactsRefresh.hide()
|
||||||
|
viewBinding.contactsAdd.hide()
|
||||||
viewBinding.tabChatList.on("show.mdui.tab", () => {
|
viewBinding.tabChatList.on("show.mdui.tab", () => {
|
||||||
viewBinding.contactsRefresh.hide()
|
viewBinding.contactsRefresh.hide()
|
||||||
|
viewBinding.contactsAdd.hide()
|
||||||
})
|
})
|
||||||
viewBinding.tabContacts.on("show.mdui.tab", () => {
|
viewBinding.tabContacts.on("show.mdui.tab", () => {
|
||||||
viewBinding.contactsRefresh.show()
|
viewBinding.contactsRefresh.show()
|
||||||
|
viewBinding.contactsAdd.show()
|
||||||
})
|
})
|
||||||
viewBinding.tabChatSeesion.on("show.mdui.tab", () => {
|
viewBinding.tabChatSeesion.on("show.mdui.tab", () => {
|
||||||
viewBinding.contactsRefresh.hide()
|
viewBinding.contactsRefresh.hide()
|
||||||
})
|
viewBinding.contactsAdd.hide()
|
||||||
|
}) */
|
||||||
|
|
||||||
viewBinding.tabChatSeesion.hide()
|
/* viewBinding.tabChatSeesion.hide() */
|
||||||
|
|
||||||
// 关于页面
|
// 关于页面
|
||||||
viewBinding.menuAbout.click(() => mdui.alert('GitHub: MoonLeeeaf<br/><br/>欢迎各位大佬访问我们的<a class="mdui-text-color-theme-accent" href="https://github.com/LingChair/LingChair">项目主页</a>', '关于 铃之椅', () => { }, { confirmText: "关闭" }))
|
viewBinding.menuAbout.click(() => mdui.alert('这是一个开源项目<br/>作者: MoonLeeeaf<br/>欢迎访问我们的<a class="mdui-text-color-theme-accent" href="https://github.com/LingChair/LingChair">项目主页</a>', '关于 铃之椅', () => { }, { confirmText: "关闭" }))
|
||||||
|
|
||||||
viewBinding.drawerChangeServer.click(() => {
|
viewBinding.drawerChangeServer.click(() => {
|
||||||
mdui.prompt('输入服务器地址...(为空则使用当前页面地址)', (value) => {
|
mdui.prompt('输入服务器地址...(为空则使用当前页面地址)', (value) => {
|
||||||
@@ -189,11 +193,12 @@ if (localStorage.useNotifications == "true")
|
|||||||
|
|
||||||
// https://www.runoob.com/w3cnote/javascript-copy-clipboard.html
|
// https://www.runoob.com/w3cnote/javascript-copy-clipboard.html
|
||||||
function copyText(t) {
|
function copyText(t) {
|
||||||
let cp = viewBinding.textCopier.get(0)
|
let btn = viewBinding.textCopierBtn
|
||||||
cp.value = t
|
btn.attr("data-clipboard-text", t)
|
||||||
cp.select()
|
new ClipboardJS(btn.get(0)).on('success', (e) => {
|
||||||
cp.setSelectionRange(0, 99999)
|
e.clearSelection()
|
||||||
navigator.clipboard.writeText(cp.value)
|
})
|
||||||
|
btn.click()
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://zhuanlan.zhihu.com/p/162910462
|
// https://zhuanlan.zhihu.com/p/162910462
|
||||||
@@ -318,10 +323,31 @@ class ContactsList {
|
|||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
static add(name, type) {
|
||||||
|
if (type == "single") {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static openAddDialog() {
|
||||||
|
new mdui.Dialog(viewBinding.dialogNewContact.get(0)).open()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第一次写前端的消息加载, 代码很乱, 还请原谅~
|
// 第一次写前端的消息加载, 代码很乱, 还请原谅~
|
||||||
|
|
||||||
|
// v0.7.0 大改UI 畏惧了 太庞大了
|
||||||
|
|
||||||
|
class ChatPage {
|
||||||
|
static cached = {}
|
||||||
|
constructor(name, type) {
|
||||||
|
|
||||||
|
}
|
||||||
|
static switchTo(name, type) {
|
||||||
|
if (!this.cached[name])
|
||||||
|
this.cached[name] = new ChatPage(name, type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ChatMsgAdapter {
|
class ChatMsgAdapter {
|
||||||
static type
|
static type
|
||||||
static target
|
static target
|
||||||
@@ -407,8 +433,10 @@ class ChatMsgAdapter {
|
|||||||
static addSystemMsg(m, re) {
|
static addSystemMsg(m, re) {
|
||||||
let e
|
let e
|
||||||
if (re)
|
if (re)
|
||||||
|
// 加到头部
|
||||||
e = $($.parseHTML(m)).prependTo(viewBinding.pageChatSeesion)
|
e = $($.parseHTML(m)).prependTo(viewBinding.pageChatSeesion)
|
||||||
else
|
else
|
||||||
|
// 加到尾部
|
||||||
e = $($.parseHTML(m)).appendTo(viewBinding.pageChatSeesion)
|
e = $($.parseHTML(m)).appendTo(viewBinding.pageChatSeesion)
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@@ -416,7 +444,8 @@ class ChatMsgAdapter {
|
|||||||
let elementRect = viewBinding.pageChatSeesion.get(0).getBoundingClientRect()
|
let elementRect = viewBinding.pageChatSeesion.get(0).getBoundingClientRect()
|
||||||
return (elementRect.bottom <= window.innerHeight)
|
return (elementRect.bottom <= window.innerHeight)
|
||||||
}
|
}
|
||||||
// 不会压栈 只添加消息 返回消息的JQ对象
|
// 添加消息 返回消息的JQ对象
|
||||||
|
// name: 用户id m: 消息 t: 时间戳 re: 默认加到尾部 msgid: 消息id
|
||||||
static async addMsg(name, m, t, re, msgid) {
|
static async addMsg(name, m, t, re, msgid) {
|
||||||
|
|
||||||
let nick = await NickCache.getNick(name) // re.data == null ? name : re.data.nick
|
let nick = await NickCache.getNick(name) // re.data == null ? name : re.data.nick
|
||||||
@@ -488,10 +517,10 @@ class ChatMsgAdapter {
|
|||||||
} */
|
} */
|
||||||
static scrollToBottom() {
|
static scrollToBottom() {
|
||||||
// 吐了啊 原来这样就行了 我何必在子element去整啊
|
// 吐了啊 原来这样就行了 我何必在子element去整啊
|
||||||
window.scrollBy({
|
viewBinding.chatPager.get(0).scrollBy({
|
||||||
top: 1145141919810,
|
top: 1145141919810,
|
||||||
behavior: 'smooth'
|
behavior: 'smooth'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
// 从本地加载
|
// 从本地加载
|
||||||
/*static loadMsgsFromLocal(target) {
|
/*static loadMsgsFromLocal(target) {
|
||||||
@@ -505,6 +534,12 @@ class ChatMsgAdapter {
|
|||||||
static saveToLocal() {
|
static saveToLocal() {
|
||||||
localStorage["chat_msg_" + this.target] = JSON.stringify(this.msgList)
|
localStorage["chat_msg_" + this.target] = JSON.stringify(this.msgList)
|
||||||
}*/
|
}*/
|
||||||
|
// 自动调整使输入框置底 CSS真tm靠不住啊
|
||||||
|
static initInputResizer() {
|
||||||
|
let resize = () => viewBinding.pageChatSeesion.height(window.innerHeight - viewBinding.inputToolbar.height() - $("header.mdui-appbar").height() - viewBinding.chatTab.height() - 50)
|
||||||
|
window.addEventListener("resize", resize)
|
||||||
|
resize()
|
||||||
|
}
|
||||||
// 为消息设置长按/右键事件
|
// 为消息设置长按/右键事件
|
||||||
static initMsgElementEvents() {
|
static initMsgElementEvents() {
|
||||||
let listeners = {}
|
let listeners = {}
|
||||||
@@ -716,7 +751,7 @@ else
|
|||||||
// 登录到账号
|
// 登录到账号
|
||||||
let dialogSignIn
|
let dialogSignIn
|
||||||
// 谨防 localStorage 字符串数据大坑
|
// 谨防 localStorage 字符串数据大坑
|
||||||
if (localStorage.isSignIn === "false")
|
if (localStorage.isSignIn == "false")
|
||||||
dialogSignIn = new mdui.Dialog(viewBinding.dialogSignIn.get(0), {
|
dialogSignIn = new mdui.Dialog(viewBinding.dialogSignIn.get(0), {
|
||||||
modal: true,
|
modal: true,
|
||||||
closeOnEsc: false,
|
closeOnEsc: false,
|
||||||
@@ -744,3 +779,11 @@ else {
|
|||||||
Stickyfill.add($("*").filter((a, b) => $(b).css('position') === 'sticky'))
|
Stickyfill.add($("*").filter((a, b) => $(b).css('position') === 'sticky'))
|
||||||
|
|
||||||
ChatMsgAdapter.initMsgElementEvents()
|
ChatMsgAdapter.initMsgElementEvents()
|
||||||
|
|
||||||
|
ChatMsgAdapter.initInputResizer()
|
||||||
|
|
||||||
|
function refreshAll() {
|
||||||
|
ContactsList.reloadList()
|
||||||
|
delete NickCache.data
|
||||||
|
NickCache.data = {}
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ body {
|
|||||||
height: 40px;
|
height: 40px;
|
||||||
border-radius: 40px;
|
border-radius: 40px;
|
||||||
}
|
}
|
||||||
|
.mdui-select-open {
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
/* 配色方案 */
|
/* 配色方案 */
|
||||||
|
|
||||||
|
|||||||
12
readme.md
12
readme.md
@@ -3,7 +3,7 @@
|
|||||||
欢迎来到铃之椅! 这是一个即时通讯项目, 为通讯提供更多的选择, 为人民服务
|
欢迎来到铃之椅! 这是一个即时通讯项目, 为通讯提供更多的选择, 为人民服务
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 本项目仍在实验阶段, 为防止源代码丢失, 先留存代码...
|
> 本项目仍在实验阶段, [点我](final.md)可查看进展
|
||||||
>
|
>
|
||||||
> 如果发现有任何疑问, 欢迎提问
|
> 如果发现有任何疑问, 欢迎提问
|
||||||
>
|
>
|
||||||
@@ -23,10 +23,18 @@
|
|||||||
|
|
||||||
* 克隆本仓库到本地并运行本地 HTTP 服务端
|
* 克隆本仓库到本地并运行本地 HTTP 服务端
|
||||||
|
|
||||||
* 使用本仓库提供的网页 (不推荐, 有跨域问题)
|
* 静态网页 (不推荐, 有跨域问题)
|
||||||
|
|
||||||
### 鸣谢
|
### 鸣谢
|
||||||
|
|
||||||
WIP
|
WIP
|
||||||
|
|
||||||
### [你知道吗](.github/do_you_know.md)
|
### [你知道吗](.github/do_you_know.md)
|
||||||
|
|
||||||
|
### 温馨提示
|
||||||
|
|
||||||
|
不建议,不推荐,不赞同用于商业用途, 本项目的设计初衷是为了个人和团队使用, 而非用于圈钱, 因此如果确实需要商业化, 请考虑其他项目
|
||||||
|
|
||||||
|
为什么? 因为这个项目还在初级阶段, 还有很多地方不够完善, 甚至有可能被一些 Hacker 抓到漏洞, 造成不必要的损失
|
||||||
|
|
||||||
|
因此我更建议个人及团队内部使用, 亦或者加密后放在公网使用
|
||||||
|
|||||||
@@ -148,6 +148,21 @@ let api = {
|
|||||||
cb({ msg: msg, code: 0, data: { friends: friends } })
|
cb({ msg: msg, code: 0, data: { friends: friends } })
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 添加好友
|
||||||
|
// {name: 账号, accessToken: 访问令牌} 返回 {friends: []}
|
||||||
|
// WIP
|
||||||
|
"user.addFriend": (a, cb) => {
|
||||||
|
if (checkEmpty([a.name, a.accessToken]))
|
||||||
|
return cb({ msg: "参数缺失", code: -1 })
|
||||||
|
|
||||||
|
let { msg, code, friends } = users.getFriends(a.name, a.accessToken)
|
||||||
|
|
||||||
|
if (code !== 0)
|
||||||
|
return cb({ msg: msg, code: code })
|
||||||
|
|
||||||
|
cb({ msg: msg, code: 0, data: { friends: friends } })
|
||||||
|
},
|
||||||
|
|
||||||
"user.getNick": (a, cb) => {
|
"user.getNick": (a, cb) => {
|
||||||
if (checkEmpty([a.name]))
|
if (checkEmpty([a.name]))
|
||||||
return cb({ msg: "参数缺失", code: -1 })
|
return cb({ msg: "参数缺失", code: -1 })
|
||||||
|
|||||||
Reference in New Issue
Block a user