整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          高顏值網頁首屏:采用黃色系,如何不刺眼

          色是最為明亮的顏色,如果使用不當,就會出現刺眼和廉價的感覺,看看高手是如何處理的。

          設計高顏值的網站首屏頁面采用黃色系需要注意以下幾點:

          1. 調和色彩:

          黃色作為主色調時,需要搭配其他顏色來平衡整體色彩,可以選擇深灰色、白色、深藍色等作為輔助色,以減輕黃色的刺眼感。


          2. 色彩搭配:

          可以采用黃色作為主色調,輔以其他色彩進行搭配,比如黃色搭配灰色或者白色,可以營造出明快、清新的感覺。



          3. 色彩運用:

          在網站首屏頁面中,可以運用黃色系的漸變色塊、背景圖案或者按鈕等元素,使頁面看起來更加生動和吸引人。



          4. 圖標和按鈕設計:

          在設計圖標和按鈕時,可以采用黃色作為主色調,突出重點內容,同時要注意保持整體的簡潔和清晰。



          5. 文字搭配:

          在文字的搭配上,可以選擇深色的字體以增加對比度,使文字更加清晰易讀。



          黃色系的設計需要注意色彩的搭配和運用,以及整體的平衡感,同時要考慮用戶的視覺體驗,確保頁面設計既能吸引用戶,又能保持舒適的視覺感受。


          大千UI工場→10年UI設計老和前端開發老司機,持續為大家分享有價值、有見地的觀點、作品、干活,歡迎評論、關注、點贊、幫助的老鐵,可私信。

          作上有個業務,.Net Core WebAPI作為服務端,需要將運行過程中產生的日志分類,并實時推送到各種終端進行報警,終端有桌面(WPF)、移動(Xamarin.Forms)、網站(Angular.JS)等,使用SignalR進行警報日志推送。

          微信公眾號:Dotnet9,網站:Dotnet9,問題或建議:請網站留言, 如果對您有所幫助:歡迎贊賞。

          閱讀導航

          1. 本文背景
          2. 代碼實現
          3. 本文參考

          1.本文背景

          工作上有個業務,.Net Core WebAPI作為服務端,需要將運行過程中產生的日志分類,并實時推送到各種終端進行報警,終端有桌面(WPF)、移動(Xamarin.Forms)、網站(Angular.JS)等,使用SignalR進行警報日志推送。

          下面是桌面端的測試效果:

          2.代碼實現

          整個系統由服務端、桌面端、網站、移動端組成,結構如下:

          2.1 服務端與客戶端都使用的日志實體類

          簡單的日志定義,服務端會主動將最新日志通過AlarmLogItem實例推送到各個終端:

          /// <summary>
          /// 報警日志
          /// </summary>
          public class AlarmLogItem
          {
              public string Id { get; set; }
              /// <summary>
              /// 日志類型
              /// </summary>
              public AlarmLogType Type { get; set; }
              /// <summary>
              /// 日志名稱
              /// </summary>
              public string Text { get; set; }
              /// <summary>
              /// 日志詳細信息
              /// </summary>
              public string Description { get; set; }
              /// <summary>
              /// 日志更新時間
              /// </summary>
              public string UpdateTime { get; set; }
          }
          
          public enum AlarmLogType
          {
              Info,
              Warn,
              Error
          }

          2.2 服務端

          使用 .Net Core 2.2 搭建的Web API項目

          2.2.1 集線器類AlarmLogHub.cs

          定義集線器Hub類AlarmLogHub,繼承自Hub,用于SignalR通信,看下面的代碼,沒加任何方法,您沒看錯:

          public class AlarmLogHub : Hub
          {}

          2.2.2 Startup.cs

          需要在此類中注冊SignalR管道及服務,在下面兩個關鍵方法中用到,B/S后端的朋友非常熟悉了。

          1. ConfigureServices方法

          添加SignalR管道(是這個說法吧?):

          services.AddSignalR(options => { options.EnableDetailedErrors = true; });
          1. Configure方法注冊SignalR服務地址

          端口用的8022,客戶端訪問地址是:http://localhost:8022/alarmlog

          app.UseSignalR(routes =>
          {
              routes.MapHub<AlarmLogHub>("/alarmlog");
          });

          2.2.3 SignalRTimedHostedService.cs

          這是個關鍵類,用于服務端主動推送日志使用,Baidu、Google好久才找到,站長技術棧以C/S為主,B/S做的不多,沒人指點,心酸,參考網址:How do I push data from hub to client every second using SignalR 。

          該類繼承自IHostedService,作為服務自啟動(亂說的),通過SignalRTimedHostedService 的構造函數依賴注入得到IHubContext<AlarmLogHub>的實例,用于服務端向各客戶端推送日志使用(在StartAsync方法中開啟定時器,模擬服務端主動推送警報日志,見 DoWork 方法):

          internal class SignalRTimedHostedService : IHostedService, IDisposable
          {
              private readonly IHubContext<AlarmLogHub> _hub;
              private Timer _timer;
          
              //模擬發送報警日志            
              List<AlarmLogItem> lstLogs = new List<AlarmLogItem> {
                      new AlarmLogItem{ Type=AlarmLogType.Error,Text="OK WebSocket斷連",Description="嘗試連接50次,未成功重連!"},
                      new AlarmLogItem{ Type=AlarmLogType.Warn,Text="OK WebSocket斷開重連",Description="嘗試連接5次,成功重連!"},
                      new AlarmLogItem{ Type=AlarmLogType.Warn,Text="OK Restfull斷連",Description="嘗試連接30次,成功重連!"},
                      new AlarmLogItem{ Type=AlarmLogType.Error,Text="OK WebSocket斷連",Description="第一次斷開鏈接!"},
                      new AlarmLogItem{ Type=AlarmLogType.Info,Text="OK WebSocket連接成功",Description="首次成功連接!"},
                      new AlarmLogItem{ Type=AlarmLogType.Error,Text="OK WebSocket斷連",Description="嘗試連接第7次,未成功重連!"}
                  };
          
              Random rd = new Random(DateTime.Now.Millisecond);
          
              public SignalRTimedHostedService(IHubContext<AlarmLogHub> hub)
              {
                  _hub = hub;
              }
          
              public Task StartAsync(CancellationToken cancellationToken)
              {
          
                  _timer = new Timer(DoWork, null, TimeSpan.Zero,
                      TimeSpan.FromSeconds(1));
          
                  return Task.CompletedTask;
              }
          
              private void DoWork(object state)
              {
                  if (DateTime.Now.Second % rd.Next(1, 3) == 0)
                  {
                      AlarmLogItem log = lstLogs[rd.Next(lstLogs.Count)];
                      log.UpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                      _hub.Clients.All.SendAsync("ReceiveAlarmLog", log);
                  }
              }
          
              public Task StopAsync(CancellationToken cancellationToken)
              {
          
                  _timer?.Change(Timeout.Infinite, 0);
          
                  return Task.CompletedTask;
              }
          
              public void Dispose()
              {
                  _timer?.Dispose();
              }
          }

          SignalRTimedHostedService 類作為Host服務(繼承自 IHostedService),需要在Startup.cs的ConfigureServices方法中注冊管道(是吧?各位有沒有B/S比較好的書籍推薦,站長打算有空好好學學):

          services.AddHostedService<SignalRTimedHostedService>();

          服務端關鍵代碼已經全部奉上,下面主要說說桌面端和移動端代碼,其實兩者代碼類似。

          2.3 網站

          參考 index.html

          2.4 桌面端(WPF)

          使用 .Net Core 3.0創建的WFP工程,需要引入Nuget包:Microsoft.AspNetCore.SignalR.Client

          界面用一個ListView展示收到的日志:

          <Grid>
              <ListBox x:Name="messagesList"  RenderTransformOrigin="-0.304,0.109" BorderThickness="1" BorderBrush="Gainsboro"/>
          </Grid>

          后臺寫的簡陋,直接在窗體構造函數中連接服務端SignalR地址:http://localhost:8022/alarmlog, 監聽服務端警報日志推送:ReceiveAlarmLog。

          using AppClient.Models;
          using Microsoft.AspNetCore.SignalR.Client;
          using System;
          using System.Threading.Tasks;
          using System.Windows;
          
          namespace SignalRChatClientCore
          {
              /// <summary>
              /// Interaction logic for MainWindow.xaml
              /// </summary>
              public partial class MainWindow : Window
              {
                  HubConnection connection;
                  public MainWindow()
                  {
                      InitializeComponent();
          
                      connection = new HubConnectionBuilder()
                          .WithUrl("http://localhost:8022/alarmlog")
                          .Build();
          
                      connection.Closed += async (error) =>
                      {
                          await Task.Delay(new Random().Next(0, 5) * 1000);
                          await connection.StartAsync();
                      };
                      connection.On<AlarmLogItem>("ReceiveAlarmLog", (message) =>
                      {
                          this.Dispatcher.Invoke(() =>
                          {
                              messagesList.Items.Add(message.Description);
                          });
                      });
          
                      try
                      {
                          connection.StartAsync();
                          messagesList.Items.Add("Connection started");
                      }
                      catch (Exception ex)
                      {
                          messagesList.Items.Add(ex.Message);
                      }
                  }
              }
          }

          2.4 移動端

          移動端其實和桌面端類似,因為桌面端使用的 .Net Core 3.0,移動端使用的 .NET Standard 2.0,都需要引入Nuget包:Microsoft.AspNetCore.SignalR.Client。

          界面使用ListView展示日志,這就不貼代碼了,使用的MVVM方式,直接貼ViewModel代碼吧,大家只看個大概,不要糾結具體代碼,參照桌面.cs代碼,是不是一樣的?

          using AppClient.Models;
          using AppClient.Views;
          using Microsoft.AspNetCore.SignalR.Client;
          using System;
          using System.Collections.ObjectModel;
          using System.Diagnostics;
          using System.Threading.Tasks;
          using Xamarin.Forms;
          using System.Linq;
          
          namespace AppClient.ViewModels
          {
              /// <summary>
              /// 報警日志VM
              /// </summary>
              public class AlarmItemsViewModel : BaseViewModel
              {
                  private ViewState _state = ViewState.Disconnected;
          
                  /// <summary>
                  /// 報警日志列表
                  /// </summary>
                  public ObservableCollection<AlarmLogItem> AlarmItems { get; set; }
                  public Command LoadItemsCommand { get; set; }
          
                  //連接報警服務端
                  private HubConnection _connection;
          
                  public AlarmItemsViewModel()
                  {
                      Title = "報警日志";
                      AlarmItems = new ObservableCollection<AlarmLogItem>();
                      LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());
          
                      //收到登錄成功通知
                      MessagingCenter.Subscribe<LoginViewModel, LoginUser>(this, "LoginSuccess", async (sender, userInfo) =>
                       {
                           //DisplayAlert("登錄成功", userInfo.UserName, "確定");
                       });
                      MessagingCenter.Subscribe<NewItemPage, AlarmLogItem>(this, "添加項", async (obj, item) =>
                      {
                          var newItem = item as AlarmLogItem;
                          AlarmItems.Add(newItem);
                          await DataStore.AddItemAsync(newItem);
                      });
          
                      ConnectAlarmServer();
                  }
          
                  async Task ExecuteLoadItemsCommand()
                  {
                      if (IsBusy)
                          return;
          
                      IsBusy = true;
          
                      try
                      {
                          AlarmItems.Clear();
                          var items = await DataStore.GetItemsAsync(true);
                          foreach (var item in items)
                          {
                              AlarmItems.Add(item);
                          }
                      }
                      catch (Exception ex)
                      {
                          Debug.WriteLine(ex);
                      }
                      finally
                      {
                          IsBusy = false;
                      }
                  }
          
                  private async Task ConnectAlarmServer()
                  {
                      if (_state == ViewState.Connected)
                      {
                          try
                          {
                              await _connection.StopAsync();
                          }
                          catch (Exception ex)
                          {
                              return;
                          }
                          _state = ViewState.Disconnected;
                      }
                      else
                      {
                          try
                          {
                              _connection = new HubConnectionBuilder()
                                .WithUrl(App.Setting.AlarmHost)
                                .Build();
                              _connection.On<AlarmLogItem>("ReceiveAlarmLog", async (newItem) =>
                              {
                                  AlarmItems.Add(newItem);
                                  await DataStore.AddItemAsync(newItem);
                              });
                              _connection.Closed += async (error) =>
                              {
                                  await Task.Delay(new Random().Next(0, 5) * 1000);
                                  await _connection.StartAsync();
                              };
                              await _connection.StartAsync();
                          }
                          catch (Exception ex)
                          {
                              return;
                          }
                          _state = ViewState.Connected;
                      }
                  }
          
                  private enum ViewState
                  {
                      Disconnected,
                      Connecting,
                      Connected,
                      Disconnecting
                  }
              }
          }

          關鍵代碼已經貼完了,希望對大家能有所幫助。

          3.參考

          1. .NET 客戶端 SignalR ASP.NET Core
          2. SignalR-samples
          3. How do I push data from hub to client every second using SignalR


          除非注明,文章均由 Dotnet9 整理發布,歡迎轉載。

          轉載請注明本文地址:https://dotnet9.com/6913.html

          套錄屏教程,是為初學者準備的,確保非計算機專業的也能跟著一步一步玩轉python,既培養出興趣,又玩出點東西。

          上一講介紹了我們如何用python發布一個靜態頁面,但是好玩的網站都是動態的,今天我們試試看邁出第一步,搭建第一個動態頁面。

          實現動態頁面的方法很多,CGI是一種有很有歷史的方法了,之所以選這個來實現是因為這種方式結構外露,比較適合初學者研究原理,并且也足以滿足這種小網站的需求了。現在理解了動態網頁原理,以后再改用第三方框架是很容易的。

          一、今天的任務

          我們今天是第一次寫CGI,所以不要搞復雜化。只要能實現將用戶數據從瀏覽器傳遞到后臺,后臺python接收到數據并返回結果。能完成這樣一次循環即可。

          今天的任務

          二、今天的操作教程

          簡單講,就是建立自己的add.py,注意要放在指定目錄下

          然后服務器啟動主要多加一個--cgi參數

          動畫教程,用簡單的教程,讓初學者玩轉python

          三、 今天的代碼

          add.py的代碼,html的代碼請查閱前文。

          請注意,add.py這個文件名和html代碼中表單的action內容要一致

          add.py代碼中getvalue函數去取的變量名要和html代碼中表單內輸入元素的name一致。

          操作上不清楚的可以點擊頂部頭像回顧查詢歷史文章,有難點歡迎私信交流。

          下一期我們在本期代碼基礎上,加入將報名數據存入數據庫的代碼。

          感謝繼續關注“有只狗狗叫多多”,不要錯過哦。。。


          主站蜘蛛池模板: 久久精品无码一区二区三区| 亚洲.国产.欧美一区二区三区| 国产激情一区二区三区四区| 中文精品一区二区三区四区| 一区二区不卡在线| 国产一区二区久久久| 国产乱码精品一区二区三区四川人| 精品久久久久久无码中文字幕一区| 中文字幕一区日韩精品| 亚洲av无码一区二区三区在线播放| 日本视频一区在线观看免费| 大帝AV在线一区二区三区| 免费无码AV一区二区| 精品福利一区二区三| 亚洲精品伦理熟女国产一区二区| 国产精品美女一区二区三区 | 一区二区三区视频网站| 黄桃AV无码免费一区二区三区| 无码国产精品一区二区免费vr| 亚洲一区二区无码偷拍| 国产99精品一区二区三区免费| 免费一区二区三区| 韩国资源视频一区二区三区| 久久久国产一区二区三区| 亚洲第一区二区快射影院| 四虎一区二区成人免费影院网址| 国精产品一区一区三区| 人妻少妇精品视频三区二区一区| 精品国产毛片一区二区无码| 伊人久久精品无码麻豆一区| 精品一区二区三区在线观看l | 国产拳头交一区二区| 国产视频一区二区在线播放| 精品国产一区二区三区AV| 一区二区三区在线观看中文字幕| 色久综合网精品一区二区| 国产一区二区影院| 人妻体体内射精一区二区| 欧洲精品码一区二区三区| 日韩精品人妻一区二区中文八零| 国产精品一区二区久久|