header.blade.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <?php
  2. $uri = \Illuminate\Support\Facades\Route::getCurrentRoute()->uri();
  3. ?>
  4. <div class="container">
  5. <nav class="navbar navbar-expand-lg navbar-light">
  6. <div class="container-fluid">
  7. <div style="display: inline">
  8. <img src="/static/logo.png" class="logo">
  9. <p class="logo-title noselect">助友办公软件</p>
  10. </div>
  11. <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
  12. data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
  13. aria-expanded="false" aria-label="Toggle navigation">
  14. <span class="navbar-toggler-icon"></span>
  15. </button>
  16. <div class="collapse navbar-collapse" id="navbarSupportedContent">
  17. <ul class="navbar-nav mb-2 mb-lg-0">
  18. <li class="nav-item {{ in_array($uri,['/','']) ? 'active' : '' }}">
  19. <a class="nav-link" aria-current="page" href="{{ toRoute('') }}">首页</a>
  20. </li>
  21. <li class="nav-item">
  22. <a class="nav-link" href="{{ toRoute('buy') }}">帮助中心</a>
  23. </li>
  24. <li class="nav-item {{ in_array($uri,['help','']) ? 'active' : '' }}">
  25. <a class="nav-link" href="{{ toRoute('help') }}">帮助中心</a>
  26. </li>
  27. <li class="nav-item {{ in_array($uri,['about','']) ? 'active' : '' }}">
  28. <a class="nav-link" href="{{ toRoute('about') }}">关于我们</a>
  29. </li>
  30. </ul>
  31. <div id="loginDiv">
  32. <button type="button" class="btn btn-danger" style="width: 120px;height: 40px;"
  33. onclick="showModal()">登录
  34. </button>
  35. </div>
  36. <div class="dropdown" id="userDiv" style="display: none">
  37. <a class="btn dropdown-toggle" href="#" role="button" id="dropdownMenuLink"
  38. data-bs-toggle="dropdown"
  39. aria-expanded="false">
  40. <span id="username"></span>
  41. </a>
  42. <ul class="dropdown-menu" aria-labelledby="dropdownMenuLink">
  43. <li><a class="dropdown-item" href="#">升级会员</a></li>
  44. <li><a class="dropdown-item" href="#" onclick="loginOut()">退出登录</a></li>
  45. </ul>
  46. </div>
  47. </div>
  48. </div>
  49. </nav>
  50. </div>
  51. <!-- Modal -->
  52. <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  53. <div class="modal-dialog">
  54. <div class="modal-content">
  55. <div class="modal-header">
  56. <h5 class="modal-title" id="exampleModalLabel">登录</h5>
  57. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  58. </div>
  59. <div class="modal-body">
  60. <div class="login-model">
  61. <div class="wei-login">
  62. <p>扫码关注助友办公公众号进行登录</p>
  63. <div class="login-border">
  64. <img src="" class="login-code" style="width: 100%;display: none" id="loginImg"/>
  65. <div class="spinner-border m-5" role="status" id="spinnerShow">
  66. <span class="visually-hidden">Loading...</span>
  67. </div>
  68. <div class="no-code" onclick="refreshCode()" id="refreshBtn" style="display: none">
  69. 点击刷新
  70. </div>
  71. <div class="no-code" onclick="refreshCode()" id="isScan" style="display: none">
  72. 请在微信【助友办公软件】内点击授权
  73. </div>
  74. </div>
  75. <p class="expire-time" id="loginExpire" style="display: none">300秒后二维码将过期</p>
  76. <p class="expire-time" id="guoqi" style="display: none">二维码已过期,点击刷新获取新二维码</p>
  77. </div>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. <script>
  84. let target = '{{ $target }}';
  85. // 设置允许跨域
  86. axios.defaults.withCredentials = false;
  87. function setCookie(cName, value, expireDate) {
  88. const domain = 'zhuyou360.com';
  89. const exDate = new Date();
  90. exDate.setDate(exDate.getDate() + expireDate * 24 * 60 * 60 * 1000);
  91. document.cookie = cName + "=" + decodeURIComponent(value) + (expireDate == null ? "" : ";expires=" + exDate.toUTCString()) + ";path=/;domain=" + domain;
  92. }
  93. function getCookie(key) {
  94. return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[-.+*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
  95. }
  96. function randomStr() {
  97. function S4() {
  98. return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
  99. }
  100. return S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4()
  101. }
  102. function getSession() {
  103. let value = window.localStorage.getItem('tty_session');
  104. // 解决跨域问题
  105. if (!value) {
  106. return getCookie('tty_session');
  107. } else {
  108. return value;
  109. }
  110. }
  111. function setSession() {
  112. if (getSession()) {
  113. } else {
  114. // 解决跨域问题
  115. let value = 'web:' + randomStr();
  116. setCookie('tty_session', value, 7);
  117. window.localStorage.setItem('tty_session', value);
  118. }
  119. }
  120. setSession();
  121. function getLoginToken() {
  122. let value = window.localStorage.getItem('officialToken');
  123. if (!value) {
  124. return getCookie('officialToken');
  125. } else {
  126. return value;
  127. }
  128. }
  129. function setLoginToken(value) {
  130. setCookie('officialToken', value, 7);
  131. window.localStorage.setItem('officialToken', value);
  132. }
  133. function clearLoginToken() {
  134. setCookie('officialToken', '', 0);
  135. window.localStorage.setItem('officialToken', "");
  136. }
  137. let loginInterval = null;
  138. let checkScanInterval = null;
  139. let checkLoginInterval = null;
  140. let loginExpire = 0;
  141. let loginImg = '';
  142. let myModal = '';
  143. // 判断是否存在下载参数,存在则下载
  144. if (getPar('download')) {
  145. // 获取下载地址
  146. axios.post(target + '/download').then(function (response) {
  147. window.location.href = response.data.result
  148. })
  149. }
  150. // jiance
  151. checkLogin();
  152. function showModal() {
  153. refreshCode();
  154. myModal = new bootstrap.Modal(document.getElementById('exampleModal'), {
  155. keyboard: false
  156. })
  157. myModal.show();
  158. }
  159. // 刷新登录二维码
  160. function refreshCode() {
  161. clearLoginInterval();
  162. document.getElementById('spinnerShow').style.display = ''
  163. let data = {
  164. scene_str: getSession()
  165. }
  166. axios.post(target + '/api/wechat/createQrcode', data).then(function (response) {
  167. if (!response.data.error) {
  168. loginImg = response.data.result.url;
  169. document.getElementById('loginImg').style.display = ''
  170. document.getElementById('loginImg').src = loginImg
  171. document.getElementById('spinnerShow').style.display = 'none'
  172. document.getElementById('loginExpire').style.display = ''
  173. loginExpire = response.data.result.expire_seconds;
  174. document.getElementById('loginExpire').innerHTML = loginExpire + '秒后二维码将过期'
  175. loginInterval = setInterval(() => {
  176. loginExpire--;
  177. document.getElementById('loginExpire').innerHTML = loginExpire + '秒后二维码将过期'
  178. if (loginExpire <= 0) {
  179. clearLoginInterval();
  180. document.getElementById('guoqi').style.display = ''
  181. document.getElementById('loginImg').style.display = 'none'
  182. document.getElementById('refreshBtn').style.display = ''
  183. }
  184. }, 1000)
  185. checkScanInterval = setInterval(() => {
  186. checkScan();
  187. }, 2000)
  188. }
  189. }).catch(function (error) {
  190. console.log(error);
  191. });
  192. }
  193. // 检查是否扫描
  194. function checkScan() {
  195. let data = {scene_str: getSession()}
  196. axios.post(target + '/api/wechat/checkScan', data).then(function (response) {
  197. if (!response.data.error) {
  198. //
  199. document.getElementById('isScan').style.display = ''
  200. document.getElementById('loginImg').style.display = 'none'
  201. checkLoginInterval = setInterval(() => {
  202. checkLogin();
  203. }, 1000)
  204. // 清除扫描监听
  205. clearInterval(checkScanInterval);
  206. }
  207. }).catch(function (error) {
  208. console.log(error);
  209. });
  210. }
  211. // 检查是否登录
  212. function checkLogin() {
  213. let data = {scene_str: getSession()};
  214. axios.post(target + '/api/wechat/checkLogin', data)
  215. .then(function (response) {
  216. if (!response.data.error) {
  217. clearLoginInterval();
  218. setLoginToken(response.data.result);
  219. getUserInfo();
  220. myModal.hide();
  221. } else {
  222. document.getElementById('loginDiv').style.display = '';
  223. document.getElementById('userDiv').style.display = 'none';
  224. }
  225. })
  226. .catch(function (error) {
  227. console.log(error);
  228. });
  229. }
  230. // 清空登录有关定时器
  231. function clearLoginInterval() {
  232. clearInterval(loginInterval);
  233. clearInterval(checkLoginInterval);
  234. }
  235. // 获取用户信息
  236. function getUserInfo() {
  237. let token = getLoginToken();
  238. axios.post(target + '/api/login/getUserInfo', {}, {headers: {Authorization: token}}).then(function (response) {
  239. if (response.data.result) {
  240. let userInfo = response.data.result;
  241. document.getElementById('loginDiv').style.display = 'none'
  242. document.getElementById('userDiv').style.display = ''
  243. document.getElementById('username').innerHTML = '<img style="width:20px;margin-right:5px" src="' + userInfo.avatar + '"/>' + userInfo.username;
  244. }
  245. }).catch(function (error) {
  246. console.log(error);
  247. });
  248. }
  249. function loginOut() {
  250. if (confirm("你确认要退出登录吗?")) {
  251. let token = getLoginToken();
  252. axios.post(target + '/api/login/loginOut', {}, {headers: {Authorization: token}}).then(function (response) {
  253. if (!response.data.error) {
  254. clearLoginToken();
  255. window.location.reload();
  256. }
  257. }).catch(function (error) {
  258. console.log(error);
  259. });
  260. }
  261. }
  262. function getPar(par) {
  263. //获取当前URL
  264. let local_url = document.location.href;
  265. //获取要取得的get参数位置
  266. let get = local_url.indexOf(par + "=");
  267. if (get === -1) {
  268. return false;
  269. }
  270. //截取字符串
  271. let get_par = local_url.slice(par.length + get + 1);
  272. //判断截取后的字符串是否还有其他get参数
  273. let nextPar = get_par.indexOf("&");
  274. if (nextPar !== -1) {
  275. get_par = get_par.slice(0, nextPar);
  276. }
  277. return get_par;
  278. }
  279. /**
  280. * todo 测试登录 后期删除
  281. */
  282. // axios.post(target + '/api/login/testLogin', {})
  283. // .then(function (response) {
  284. // if (response.data.result) {
  285. // clearLoginInterval();
  286. //
  287. // setLoginToken(response.data.result);
  288. // getUserInfo();
  289. //
  290. // myModal.hide();
  291. // } else {
  292. // document.getElementById('loginDiv').style.display = '';
  293. // document.getElementById('userDiv').style.display = 'none';
  294. // }
  295. // })
  296. // .catch(function (error) {
  297. // console.log(error);
  298. // });
  299. </script>