common.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. let settings = JSON.parse(localStorage.getItem('settings')) || {};
  2. const Cfg = {
  3. designW: settings.designW || 1920, //设计图宽度
  4. designH: settings.designH || 1080, //设计图高度
  5. zoomMode: settings.zoomMode || (innerWidth < 768 ? 'cover' : 'contain'),
  6. notebookOptim: [undefined, true].includes(settings.notebookOptim),
  7. getWeatherPeriod: settings.getWeatherPeriod || 5, //天气预报更新周期(分)
  8. chartRefreshPeriod: settings.chartRefreshPeriod || 10, // 图表刷新周期(秒)
  9. colors: settings.colors || 'default',
  10. colorData: {
  11. default: ['lightskyblue', 'orange', 'greenyellow', 'limegreen',
  12. 'mediumturquoise', 'mediumpurple'],
  13. spring: ['#BEDC6E', '#FA8C8C', '#FAAAC8', '#FAC8C8',
  14. '#FFFFE6', '#6E6464'],
  15. summer: ['#FFAE00', '#FF5200', '#007AFF', '#00BF05',
  16. '#DCFFFF', '#505064'],
  17. autumn: ['#c1ad2f',/*'#A5912D',*/ '#782323', '#783723', '#A05027',
  18. '#FAE6DC', '#283C14'],
  19. winter: ['#F5F5FA', '#96822D', '#6E5A19', '#BECDEB',
  20. '#E1E1F0', '#281E1E'],
  21. },
  22. hideGesture: settings.hideGesture
  23. };
  24. let hasGetWeather = false;
  25. let scale = 1;
  26. let notebookOptim = true;
  27. let colonShow = true;
  28. let [pageH, pageW] = [$(window).height(), $(window).width()];
  29. const weather2Code = {
  30. "晴": 100,
  31. "多云": 101,
  32. "少云": 102,
  33. "晴间多云": 103,
  34. "阴": 104,
  35. "有风": 200,
  36. "平静": 201,
  37. "微风": 202,
  38. "和风": 203,
  39. "清风": 204,
  40. "强风/劲风": 205,
  41. "疾风": 206,
  42. "大风": 207,
  43. "烈风": 208,
  44. "风暴": 209,
  45. "狂爆风": 210,
  46. "飓风": 211,
  47. "龙卷风": 212,
  48. "热带风暴": 213,
  49. "阵雨": 300,
  50. "强阵雨": 301,
  51. "雷阵雨": 302,
  52. "强雷阵雨": 303,
  53. "雷阵雨伴有冰雹": 304,
  54. "小雨": 305,
  55. "中雨": 306,
  56. "大雨": 307,
  57. "极端降雨": 308,
  58. "毛毛雨/细雨": 309,
  59. "暴雨": 310,
  60. "大暴雨": 311,
  61. "特大暴雨": 312,
  62. "冻雨": 313,
  63. "小到中雨": 314,
  64. "中到大雨": 315,
  65. "大到暴雨": 316,
  66. "暴雨到大暴雨": 317,
  67. "大暴雨到特大暴雨": 318,
  68. "雨": 399,
  69. "小雪": 400,
  70. "中雪": 401,
  71. "大雪": 402,
  72. "暴雪": 403,
  73. "雨夹雪": 404,
  74. "雨雪天气": 405,
  75. "阵雨夹雪": 406,
  76. "阵雪": 407,
  77. "小到中雪": 408,
  78. "中到大雪": 409,
  79. "大到暴雪": 410,
  80. "雪": 499,
  81. "薄雾": 500,
  82. "雾": 501,
  83. "霾": 502,
  84. "扬沙": 503,
  85. "浮尘": 504,
  86. "沙尘暴": 507,
  87. "强沙尘暴": 508,
  88. "浓雾": 509,
  89. "强浓雾": 510,
  90. "中度霾": 511,
  91. "重度霾": 512,
  92. "严重霾": 513,
  93. "大雾": 514,
  94. "特强浓雾": 515,
  95. "热": 900,
  96. "冷": 901,
  97. "未知": 999,
  98. };
  99. const Public = {
  100. hasVal(val) {
  101. if (val === null) {
  102. return '-';
  103. }
  104. return val;
  105. },
  106. // 页面顶部时间
  107. setHeaderTime() {
  108. setTimeout(function () {
  109. let t = new Date();
  110. let [year, mon, date, hour, min, sec, milliSec] = [
  111. t.getFullYear(),
  112. t.getMonth() + 1,
  113. t.getDate(),
  114. t.getHours(),
  115. t.getMinutes(),
  116. t.getSeconds(),
  117. t.getMilliseconds()
  118. ];
  119. let timeHtml = `
  120. <span class="date"> ${year}-${mon}-${date}</span>
  121. <span class="digital-num">
  122. ${hour}
  123. <span class="colon" style="">${colonShow ? ' :' : '&nbsp;'}</span>
  124. ${(min + "").padStart(2, '0')}
  125. </span>`;
  126. colonShow = !colonShow;
  127. $("#headerTime").html(timeHtml);
  128. if (!hasGetWeather) {
  129. Public.getWeather(t);
  130. hasGetWeather = true;
  131. } else {
  132. if (min % Cfg.getWeatherPeriod === 0 && sec === 0 && milliSec < 500) {
  133. Public.getWeather(t);
  134. }
  135. }
  136. Public.setHeaderTime();
  137. }, 500)
  138. },
  139. // 获取天气情况
  140. getWeather(currTime) {
  141. // 获取地理位置
  142. $.get({
  143. //这里的url不能写到data对象的外面
  144. url: 'https://api.asilu.com/weather_v2/',
  145. dataType: 'jsonp', // 请求方式为jsonp
  146. success: function (data) {
  147. const city = data.forecasts[0].city;
  148. let temperatureTxt = '';
  149. let daily_forecast = data.forecasts[0].casts[0];
  150. let [code, txt] = ['', ''];
  151. if ((currTime.getHours() >= 6) && (currTime.getHours() < 18)) {
  152. txt = daily_forecast.dayweather;
  153. temperatureTxt = daily_forecast.nighttemp + "℃~" + daily_forecast.daytemp + "℃";
  154. } else {
  155. txt = daily_forecast.nightweather;
  156. temperatureTxt = daily_forecast.daytemp + "℃~" + daily_forecast.nighttemp + "℃";
  157. }
  158. $("#weather").html(txt + '&emsp;' + city);
  159. $("#temperature").text(temperatureTxt);
  160. $("#weatherIcon").css('background-image', `url("https://cdn.heweather.com/cond_icon/${weather2Code[txt]}.png")`);
  161. }
  162. })
  163. },
  164. //页面缩放
  165. pageResize() {
  166. [pageH, pageW] = [$(window).height(), $(window).width()];
  167. let isWider = pageW / pageH > Cfg.designW / Cfg.designH;
  168. let [scaleW, scaleH] = [pageW / Cfg.designW, pageH / Cfg.designH];
  169. let $container = $("#container");
  170. switch (Cfg.zoomMode) {
  171. case "contain":
  172. if (isWider) {
  173. $container.css({width: pageH * Cfg.designW / Cfg.designH, height: '100%'});
  174. } else {
  175. $container.css({height: pageW * Cfg.designH / Cfg.designW, width: '100%'});
  176. }
  177. scale = isWider ? scaleH : scaleW;
  178. break;
  179. case 'cover':
  180. $("html,body").css('overflow', 'initial');
  181. if (isWider) {
  182. $container.css({height: pageW * Cfg.designH / Cfg.designW, width: '100%'});
  183. } else {
  184. $container.css({width: pageH * Cfg.designW / Cfg.designH, height: '100%'});
  185. }
  186. scale = isWider ? scaleW : scaleH;
  187. break;
  188. case 'stretch':
  189. scale = isWider ? scaleH : scaleW;
  190. $container.css({width: '100%'}, {height: '100%'});
  191. break;
  192. }
  193. $("html").css("font-size", scale * 16 + "px").css("opacity", 1);
  194. notebookOptim = !(Cfg.notebookOptim === false || scale > .75);
  195. },
  196. //图表缩放
  197. chartsResize(charts, param) {
  198. $(window).resize(() => {
  199. Object.keys(charts).forEach(id => {
  200. if (param && param.notResize.includes(id)) {
  201. return
  202. }
  203. charts[id].resize();
  204. })
  205. });
  206. },
  207. chartsReDraw(charts, t = Cfg.chartRefreshPeriod, noRefresh, someRefresh) {
  208. let counter = setInterval(() => {
  209. Object.keys(charts).forEach(item => {
  210. if (noRefresh && noRefresh.includes(item) && !(someRefresh && someRefresh.includes(item))) return;
  211. let chart = charts[item];
  212. let opt = chart.getOption();
  213. chart.clear();
  214. chart.setOption(opt);
  215. })
  216. }, (t || Cfg.chartRefreshPeriod) * 1000)
  217. },
  218. // 自定义方法
  219. initTools() {
  220. $.fn.extend({
  221. str2NumFixed: function (n, power, str = '') {
  222. $.each($(this), function () {
  223. $(this).text(Public.hasVal(parseFloat($(this).text() + 'e' + power).toFixed(n) + str));
  224. })
  225. }
  226. })
  227. }
  228. };
  229. //jsonP
  230. function onBack(data) {
  231. }
  232. Public.pageResize();
  233. let init = () => {
  234. Public.initTools(); // 自定义方法
  235. };
  236. $(window).resize(() => {
  237. Public.pageResize();
  238. });
  239. $(function () {
  240. $('#container>header').load('common.html header>*', function () {
  241. if ($('body').attr('id') === 'pb_studyPlan') {
  242. $('header>h1').text('可视化动态数据展示')
  243. }
  244. Public.setHeaderTime(); // 页面顶部时间
  245. if (Cfg.zoomMode === 'cover' && !Cfg.hideGesture) {
  246. $('header').addClass('showGesture')
  247. }
  248. });
  249. // 加载设置面板
  250. $('body>aside').load('common.html aside >*', function () {
  251. $("#getWeatherPeriod").val(settings.getWeatherPeriod || 5);
  252. $("#chartRefreshPeriod").val(settings.chartRefreshPeriod || 10);
  253. $("#notebookOptim").attr('checked', [undefined, true].includes(settings.notebookOptim));
  254. $("#designW").val(settings.designW || 1920);
  255. $("#designH").val(settings.designH || 1080);
  256. $("#" + Cfg.zoomMode).prop('checked', true);
  257. let $colors = $("body>aside .colors");
  258. Object.keys(Cfg.colorData).forEach(item => {
  259. $colors.append(`
  260. <label for="colors_${item}">
  261. <input type="radio" id="colors_${item}" name="colors" ${Cfg.colors === item ? 'checked' : ''}><span>${item}</span>
  262. </label>
  263. `)
  264. });
  265. });
  266. // 保存设置
  267. $("body").on('click', '#saveSetting', function () {
  268. settings = {
  269. getWeatherPeriod: $("#getWeatherPeriod").val(),
  270. chartRefreshPeriod: $("#chartRefreshPeriod").val(),
  271. notebookOptim: $("#notebookOptim").is(":checked"),
  272. designW: $("#designW").val(),
  273. designH: $("#designH").val(),
  274. colors: $("body>aside input[type=radio][name=colors]:checked").next().text(),
  275. zoomMode: $("body>aside input[type=radio][name=zoomMode]:checked").next().text(),
  276. };
  277. localStorage.setItem('settings', JSON.stringify(settings));
  278. window.location.reload();
  279. }).on('click', '#container>header', function () {
  280. if (!Cfg.hideGesture) {
  281. $(this).removeClass('showGesture');
  282. settings.hideGesture = true;
  283. localStorage.setItem('settings', JSON.stringify(settings))
  284. }
  285. });
  286. const sessionData = JSON.parse(sessionStorage.getItem('sessionData'));
  287. if (!(sessionData && sessionData.settingTip) && !$('body').attr('id').startsWith('pb_')) {
  288. alert('请把鼠标移动到屏幕左侧边靠下的位置,可以滑出设置面板。' +
  289. '\n。');
  290. sessionStorage.setItem('sessionData', JSON.stringify({settingTip: true}))
  291. }
  292. });
  293. /*
  294. 配置表和天气 温度 时间情况的整体文件
  295. * */