整合營銷服務商

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

          免費咨詢熱線:

          用DevExpress實現基于HTML&am

          用DevExpress實現基于HTML&CSS的桌面應用程序的UI(一)

          evExpress WinForm擁有180+組件和UI庫,能為Windows Forms平臺創建具有影響力的業務解決方案。DevExpress WinForm能完美構建流暢、美觀且易于使用的應用程序,無論是Office風格的界面,還是分析處理大批量的業務數據,它都能輕松勝任!

          注意:目前基于HTML & CSS的控件正在積極研發中,可以作為技術預覽提供,如果需要使用請下載最新版組件體驗哦~

          DevExpress WinForms Subscription官方最新版免費下載試用,歷史版本下載,在線文檔和幫助文件下載-慧都網

          一組控件和組件允許開發人員構建HTML格式的UI,并使用CSS樣式自定義UI元素的外觀設置、大小、填充和布局選項,不再需要處理自定義繪制事件或更改大量屬性來修改控件以匹配UI規范,可以使用HTML和CSS標記的知識為桌面應用程序構建布局。

          主要功能包括:

          • 在HTML標記中指定數據綁定表達式,以顯示來自底層數據源的值。
          • 使用CSS創建響應式UI——當用戶鼠標指針懸停在或單擊特定元素上時添加效果。
          • 向UI添加外部控件(例如,文本框)。
          • 處理控件事件來響應UI元素鼠標動作。
          • 啟用DirectX硬件加速來獲得更好的性能。

          HTML-CSS標記

          支持HTML和CSS的控件和組件從模板呈現它們的UI,控件模板的HTML標記指定控件的內容(UI元素),而模板的CSS代碼指定應用于UI元素的樣式、顯示和布局設置。

          使用控件的HtmlTemplate屬性來指定模板,在設計時,開發人員可以在HTML Template Editor(HTML模板編輯器)中創建模板。

          該編輯器支持語法高亮顯示、智能感知(一種代碼完成輔助工具)和預覽面板,預覽面板允許開發人員檢查可視元素——將鼠標懸停在元素上時定位的HTML標記。

          示例

          下面的示例演示了一個HtmlContentControl從指定的HTML-CSS模板呈現一個UI,該控件被綁定到Employee對象的列表。模板的HTML代碼包含數據綁定表達式,用于顯示來自數據源的值。

          C#

          public class Employee {
          public string DisplayName { get; set; }
          public string FullName { get; set; }
          public SvgImage Photo { get; set; }
          }
          //...
          Employee emp=new Employee();
          emp.DisplayName="Leah Test Coordinator";
          emp.FullName="Leah Simpson";
          SvgImageCollection imageCollection=new SvgImageCollection();
          imageCollection.Add("photo", "image://svgimages/icon builder/business_businesswoman.svg");
          emp.Photo=imageCollection["photo"];
          List<Employee> list=new List<Employee>();
          list.Add(emp);
          htmlContentControl1.DataContext=list;
          //...
          void OnButtonClick(object sender, DxHtmlElementMouseEventArgs args) {
          if(args.ElementId=="uploadBtn") {
          //...
          }
          if (args.ElementId=="removeBtn") {
          //...
          }
          XtraMessageBox.Show("Button " + args.ElementId + " clicked");
          }

          VB.NET

          Public Class Employee
          Public Property DisplayName() As String
          Public Property FullName() As String
          Public Property Photo() As SvgImage
          End Class
          '...
          Dim emp As Employee=New Employee()
          emp.DisplayName="Leah Test Coordinator"
          emp.FullName="Leah Simpson"
          Dim imageCollection As SvgImageCollection=New SvgImageCollection()
          imageCollection.Add("photo", "image://svgimages/icon builder/business_businesswoman.svg")
          emp.Photo=imageCollection("photo")
          Dim list As New List(Of Employee)()
          list.Add(emp)
          htmlContentControl1.DataContext=list
          '...
          Private Sub OnButtonClick(ByVal sender As Object, ByVal args As DxHtmlElementMouseEventArgs)
          If args.ElementId="uploadBtn" Then
          '...
          End If
          If args.ElementId="removeBtn" Then
          '...
          End If
          XtraMessageBox.Show("Button " & args.ElementId & " clicked")
          End Sub

          HTML

          <div class="container" id="container">
          <div class="avatarContainer">
          <img src="${Photo}" class="avatar">
          <div id="uploadBtn" onclick="OnButtonClick" class="centered button">Upload</div>
          <div id="removeBtn" onclick="OnButtonClick" class="centered button">Remove</div>
          </div>
          <div class="separator"></div>
          <div class="avatarContainer ">
          <div class="field-container">
          <div class="field-header">
          <b>Display name</b><b class="hint">Visible to other members</b>
          </div>
          <p>${DisplayName}</p>
          </div>
          <div class="field-container with-left-margin">
          <div class="field-header">
          <b>Full name</b><b class="hint">Not visible to other members</b>
          </div>
          <p>${FullName}</p>
          </div>
          </div>
          </div>

          CSS

          言:

          之前的文章《從博弈論思考如何給大語言模型生成智能 UI 界面》里只是簡單介紹了思路,知行合一,除了思路還需要通過實踐來檢驗。這周的閑暇,我使用 DQN 進行了反復的實驗,但是,訓練出的模型,預測結果卻差強人意。


          事實證明,僅用簡單的環境、行為和 Reward 定義,是無法讓模型真正學會如何優化布局的。因此,我將這件事情分成兩個步驟進一步探索:步驟一是重建一個更加完善的環境,強化學習依賴于環境的反饋,環境的設計非常重要;步驟二是重建 DQN 的算法,優化 Reward、Q 的計算規則來促使模型學習到真正有效的策略。


          構建實驗環境


          如何使用 Python、Gradio 和 Tailwind CSS 實現一個動態內容布局系統,特別是為文本和圖文混合內容塊在一個 800x600 的布局容器中合理分布。我逐步解決了從隨機生成內容塊到確保每一行都被完全填滿的問題。以下是的詳細步驟和思路。

          1. 初始需求

          最初,目標是將任意矩形切割成指定數量的矩形塊,并考慮如何用最少的橫向切割實現。這需要一個有效的算法來確定每個內容塊的大小和位置,使得布局均勻且美觀。

          2. 使用 Gradio 生成隨機內容

          我選擇了 Gradio 作為主要工具,因其易于集成和展示。在 Gradio 里我編寫了一個函數,隨機生成 3 到 5 個內容塊,類型為純文本或圖文混合。

          def generate_random_text(length):
              words="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vehicula quam id lorem ullamcorper, ut scelerisque mauris fermentum.".split()
              return ' '.join(random.choices(words, k=length))

          3. 計算和布局

          為了使內容塊在 800x600 的容器中均勻分布,先簡單預設為兩列布局,并計算每個內容塊的寬度和高度。使用 CSS Grid 布局,可以輕松地控制每個內容塊的列跨度。

          4. 動態調整列跨度

          根據內容長度動態調整列跨度是關鍵一步,先設定內容長度的閾值:長度超過600字符的內容塊跨越兩列,而較短的內容塊盡量占用一列。這樣可以確保每行都能被完全填滿,避免出現空列。

          5. 確保每行填滿

          在布局過程中,使用一個計數器來跟蹤當前行已占據的列數。對于最后一個內容塊,需要進行特別處理,確保其占滿當前行的所有剩余列數,避免留下空白區域。

          6. 代碼實現

          最終的代碼如下:

          import gradio as gr
          import random
          import math
          
          def generate_random_text(length):
              words="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vehicula quam id lorem ullamcorper, ut scelerisque mauris fermentum.".split()
              return ' '.join(random.choices(words, k=length))
          
          def generate_content_blocks():
              num_blocks=random.randint(3, 5)
              content_types=['text', 'image-text']
              
              cols=2
              block_width=800 // cols
              block_height=600 // math.ceil(num_blocks / cols)
              
              html_content=f'<div class="container mx-auto p-6" style="width: 800px; height: 600px;">'
              html_content +=f'<div class="grid gap-2" style="grid-template-columns: repeat({cols}, 1fr); height: 100%;">'
              
              col_count=0
              
              for i in range(num_blocks):
                  content_type=random.choice(content_types)
                  content_length=random.randint(300, 800)
                  content=generate_random_text(content_length // 5)
                  
                  remaining_cols=cols - col_count
                  if content_length > 600:
                      colspan=min(remaining_cols, 2)
                  else:
                      colspan=min(remaining_cols, 1)
                  
                  col_count +=colspan
                  
                  if i==num_blocks - 1 and col_count < cols:
                      colspan=remaining_cols
                      col_count=cols
                  
                  if col_count >=cols:
                      col_count=0
                  
                  colspan_style=f'grid-column: span {colspan};'
                  
                  if content_type=='text':
                      html_content +=f'''
                          <div class="content-block p-4 bg-white shadow rounded-lg flex flex-col justify-center items-center" style="{colspan_style} height: {block_height}px;">
                              <h2 class="text-xl font-bold mb-2">Text Block {i + 1}</h2>
                              <p>{content}</p>
                          </div>
                      '''
                  else:
                      html_content +=f'''
                          <div class="content-block p-4 bg-white shadow rounded-lg flex flex-col justify-center items-center" style="{colspan_style} height: {block_height}px;">
                              <h2 class="text-xl font-bold mb-2">Image-Text Block {i + 1}</h2>
                              <div class="flex items-center">
                                  <img src="https://via.placeholder.com/100" alt="Placeholder Image" class="w-24 h-24 mr-4 rounded-lg">
                                  <p>{content}</p>
                              </div>
                          </div>
                      '''
              
              html_content +='</div></div>'
              
              tailwind_cdn='<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">'
              return tailwind_cdn + html_content
          
          iface=gr.Interface(
              fn=generate_content_blocks,
              inputs=[],
              outputs="html",
              live=True
          )
          
          iface.launch(debug=True)


          總結一下這次實驗的部分:

          1. 算法控制的部分:

          ? 隨機內容生成 (generate_random_text(length)):

          ? 功能: 生成指定長度的隨機文本,模擬Lorem Ipsum文本。

          ? 實現: 使用隨機選擇單詞來構造文本,單詞列表存儲在固定的字符串中。長度參數length用于控制生成文本的長度。

          ? 生成內容塊 (generate_content_blocks()):

          ? 隨機數生成: 使用random.randint()函數生成隨機的內容塊數量和列數,從而決定布局的動態性。

          ? 柵格布局: 根據隨機生成的列數和內容塊數量,動態計算每個內容塊在網格中的位置(跨列數)。

          ? 文本長度控制: 根據隨機數確定文本塊的長度,以確保每個內容塊都有合適的長度。

          ? 布局的動態性: 使用條件語句和循環來確保網格布局的正確性,如最后一個內容塊填充剩余的列數。

          2. 實驗背后的數學模型:

          ? 柵格布局計算:

          ? 列數計算: 使用random.randint()來生成2至4之間的列數,決定網格布局的列數。

          ? 塊的寬高計算: 根據列數和內容塊數量動態計算每個內容塊的寬度和高度,確保均勻分布和適當的間距。

          ? 內容長度分配:

          ? 文本長度隨機化: 使用random.randint()來生成每個文本塊的長度,以模擬不同長度的內容塊。

          ? 跨列分配: 根據內容的長度和剩余的列數,決定文本塊跨越的列數,以避免過多或過少的空白空間。

          3. 代碼的實現策略:

          ? HTML字符串構建:

          ? Tailwind CSS集成: 在生成的HTML字符串中直接嵌入Tailwind CSS類,實現快速和一致的樣式。

          ? 容器和布局: 使用container, grid, colspan等類來管理布局和樣式,確保內容塊具有適當的樣式和布局。

          這次嘗試只能生成兩列的簡單布局算法,當做 DQN 的實驗環境肯定不理想,我這里針對上述總結的內容進一步優化,結合柵格化布局,使用 Tailwind CSS 和 Gradio 實現智能布局。

          隨機內容生成

          首先,需要生成隨機長度的文本,在實驗環境里模擬不同的內容展示場景。這里使用 Python 的隨機模塊,構造了一段仿“Lorem Ipsum”的文本。優化函數 generate_random_text(length),通過隨機選擇單詞,生成指定長度的文本。

          import random
          
          def generate_random_text(length):
              words="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vehicula quam id lorem ullamcorper, ut scelerisque mauris fermentum.".split()
              return ' '.join(random.choices(words, k=length))

          動態生成內容塊

          接下來,需要生成包含文本和圖像的內容塊。每個內容塊可以是純文本或圖文混合,并隨機分布在柵格系統中。為了方便后期設計師標注,這里使用了Gradio來展示生成的HTML內容。

          import math
          import gradio as gr
          
          def generate_content_blocks():
              num_blocks=random.randint(4, 8)
              cols=random.randint(2, 4)
              block_width=800 // cols
              block_height=600 // math.ceil(num_blocks / cols)
              
              html_content=f'<div class="container mx-auto p-6" style="width: 800px;">'
              html_content +=f'<div class="grid gap-1" style="grid-template-columns: repeat({cols}, 1fr); height: 100%;">'
              
              col_count=0
              for i in range(num_blocks):
                  content_type=random.choice(['text', 'image-text'])
                  content_length=random.randint(300, 800)
                  content=generate_random_text(content_length // 5)
                  
                  remaining_cols=cols - col_count
                  colspan=min(remaining_cols, 2) if content_length > 600 else min(remaining_cols, 1)
                  col_count +=colspan
                  if i==num_blocks - 1 and col_count < cols:
                      colspan=remaining_cols
                      col_count=cols
                  if col_count >=cols:
                      col_count=0
                  
                  colspan_style=f'grid-column: span {colspan};'
                  
                  if content_type=='text':
                      html_content +=f'''
                          <div class="content-block p-4 bg-gray-800 shadow rounded-lg flex flex-col justify-top items-center overflow-auto" style="{colspan_style} height: {block_height}px;">
                              <h2 class="text-xl font-bold mb-2">Text Block {i + 1}</h2>
                              <p>{content}</p>
                          </div>
                      '''
                  else:
                      html_content +=f'''
                          <div class="content-block p-4 bg-gray-800 shadow rounded-lg flex flex-col justify-top items-center overflow-auto" style="{colspan_style} height: {block_height}px;">
                              <h2 class="text-xl font-bold mb-2">Image-Text Block {i + 1}</h2>
                              <div class="flex items-center">
                                  <img src="https://via.placeholder.com/100" alt="Placeholder Image" class="w-100 h-60 mr-4 rounded-lg">
                                  <p class="text-gray-800 leading-relaxed p-2">{content}</p>
                              </div>
                          </div>
                      '''
              
              html_content +='</div></div>'
              tailwind_cdn='<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">'
              return tailwind_cdn + html_content
          
          iface=gr.Interface(fn=generate_content_blocks, inputs=[], outputs="html", live=True)
          iface.launch(debug=True)

          數學模型背后的魔法

          為了確保布局不僅美觀且高效,使用了一些簡單的數學模型來動態計算內容塊的寬度和位置。

          1. 網格布局: 采用了常見的12列柵格系統,以確保布局的靈活性和響應性。

          2. 動態寬高計算: 根據生成的內容塊數量和列數,動態計算每個內容塊的寬度和高度,確保所有內容塊均勻分布。

          3. 跨列計算: 內容塊可以跨越多個列,根據內容長度和剩余列數,決定每個內容塊跨越的列數,以優化布局。

          響應式設計與Tailwind CSS

          最后,為了讓布局在各種情況下都能完美展示,使用了Tailwind CSS。通過簡單的類名,實現了復雜的布局和樣式。由于未來要引入模型算法對樣式進行生成,所以這里使用 Tailwind CSS,采用 DesignToken 替換 CSS3 樣式屬性更方便模型對樣式進行語義化理解,而不必在浩如煙海的 CSS3 樣式屬性定義里迷失。

          <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">

          引入 DQN 進行強化學習

          這段時間,我研究了如何使用強化學習技術優化網頁布局,尤其是通過 DQN(深度 Q 網絡)和 DDQN(雙重深度 Q 網絡)實現自適應布局,做了很多的實驗,等這些工作完成后,我會把代碼也分享出來。接下來,一步步回顧一下整個實驗過程。

          1. 問題定義

          網頁布局對用戶體驗至關重要。無論是文字塊還是圖文混排塊,如何在有限的頁面空間內合理安排這些內容塊,直接影響到頁面的美觀度和可讀性。通過強化學習,我希望訓練一個智能體,能在不同的布局需求下,自主學習如何分配空間,使得頁面布局既美觀又實用。

          2. 環境搭建

          首先,我定義了一個模擬布局的環境 LayoutEnv。這個環境需要考慮:

          ? 當前布局塊的數量。

          ? 剩余的列數和行數。

          ? 滾動高度(Scroll Height),這是衡量頁面滾動體驗的重要指標。

          環境的狀態通過這幾個變量表示,并在每一步行動后返回新的狀態和獎勵。尤其是滾動高度,合理布局應該盡量減少滾動高度,避免用戶為了閱讀內容頻繁滾動。

          class LayoutEnv:
              def __init__(self, num_blocks, max_cols, max_rows):
                  self.num_blocks=num_blocks
                  self.max_cols=max_cols
                  self.max_rows=max_rows
                  self.reset()
              
              def reset(self):
                  # 重置環境狀態
                  pass
              
              def step(self, action):
                  # 執行動作,返回新狀態、獎勵和是否結束
                  pass
              
              def _get_state(self):
                  # 獲取當前狀態
                  pass

          3. 深度 Q 網絡

          接下來,構建了一個基礎的 DQN 模型,用于評估不同狀態下的動作價值。模型由幾層全連接神經網絡組成,用于預測每個動作的 Q 值。

          class DQN(nn.Module):
              def __init__(self, state_size, action_size):
                  super(DQN, self).__init__()
                  self.fc1=nn.Linear(state_size, 24)
                  self.fc2=nn.Linear(24, 24)
                  self.fc3=nn.Linear(24, action_size)
              
              def forward(self, x):
                  x=torch.relu(self.fc1(x))
                  x=torch.relu(self.fc2(x))
                  return self.fc3(x)

          4. 雙重深度 Q 網絡

          為了提升模型的穩定性和性能,引入了 DDQN。DDQN 通過將目標 Q 網絡與在線 Q 網絡分離,解決了 DQN 中的過度估計問題。

          class DDQNAgent:
              def __init__(self, state_size, action_size):
                  # 初始化各種參數和網絡
                  pass
              
              def remember(self, state, action, reward, next_state, done):
                  # 記憶經驗
                  pass
              
              def act(self, state):
                  # 選擇動作
                  pass
              
              def replay(self, batch_size):
                  # 訓練網絡
                  pass
              
              def update_target_network(self):
                  # 更新目標網絡
                  pass

          5. 訓練循環

          在訓練過程中,讓智能體不斷與環境互動,從中學習如何優化布局。在每個回合中,智能體根據當前狀態選擇動作,并根據動作反饋調整策略。

          for e in range(num_episodes):
              state=env.reset()
              state=np.reshape(state, [1, state_size])
              for time in range(500):
                  action=agent.act(state)
                  next_state, reward, done, _=env.step(action)
                  agent.remember(state, action, reward, next_state, done)
                  state=next_state
                  if done:
                      break
                  if len(agent.memory) > batch_size:
                      agent.replay(batch_size)
              agent.update_target_network()
              save_model(agent, model_path)

          6. 預測與展示

          最后,使用 Streamlit 構建了一個簡單的用戶界面,允許輸入狀態參數并預測布局動作,通過動態渲染模型預測的布局動作調整后的布局,可以直觀地看到模型的預測效果。

          import streamlit as st
          
          st.title('DQN Layout Prediction')
          
          # 輸入狀態參數
          current_block=st.number_input('Current Block', min_value=0, max_value=5, value=0)
          remaining_cols=st.number_input('Remaining Columns', min_value=1, max_value=4, value=4)
          remaining_rows=st.number_input('Remaining Rows', min_value=1, max_value=4, value=4)
          scroll_height=st.number_input('Scroll Height', min_value=0, max_value=1000, value=0)
          
          state=np.array([current_block, remaining_cols, remaining_rows, scroll_height], dtype=np.float32)
          state=np.reshape(state, [1, state_size])
          
          if st.button('Predict'):
              action=agent.act(state)
              st.write(f'Predicted Action: {action}')

          總結

          過去的一周里查閱了強化學習和 GNN 的一些資料,GNN 部分主要是希望找到 UI 元素的合理分布,讓 GNN 模型學習元素之間的關系。我剛訓練完 DQN 還需要測試,后續除了給 DQN 添加更多的策略空間、環境反饋外,還想引入更多 Action 選擇策略,比如用 GNN 判斷元素關系、用 NLP 判斷內容塊和整體內容的關系等。


          前一段時間,小編也收集了推薦36種免費React模板和主題「干貨」,這次又收集了22種Vue的。希望小伙們喜歡。收集不易,希望點贊+關注。

          在Internet上搜索模板和主題時,很難找到免費的Vue資源。

          即使您不在乎質量,它們似乎也很難被發現,并出于好奇而感動,我花了數小時在Google和Github上四處挖掘,結果得到了收集22種開源Vue模板和主題框架集合。我不會對此打賭,但是它們也是高質量的資源。

          Bootstrap Vue



          現場演示:https://bootstrap-vue.org/

          githubhttps://github.com/bootstrap-vue/bootstrap-vue

          BootstrapVue 擁有85個以上的組件,45個以上的可用插件,多個指令和670+個圖標, 它提供了可用于Vue.js v2.6的Bootstrap v4.5組件和網格系統的最全面的實現之一 ,并具有廣泛的功能和自動 WAI-ARIA 可訪問性標記。

          vue & nuxt 博客網站

          現場演示:https://surmon.me/
          Github: https://github.com/surmon-china/surmon.me

          使用vue & nuxt 搭建建立的非常有風味獨特的博客網站

          Vue后臺UI框架 - Buefy


          現場演示:https://buefy.org/

          Github: https://github.com/buefy/buefy/

          Buefy 是基于Bulma框架和設計的Vue.js響應式UI組件的輕量級庫

          特征

          • 輕松保留當前的布爾瑪主題/變量
          • 支持Material Design圖標和FontAwesome
          • 非常輕巧,除了Vue&Bulma之外沒有任何內部依賴性
          • 大約88KB min + gzip(包括布爾瑪)
          • 語義代碼輸出
          • 遵循布爾瑪設計和一些Material Design UX
          • 專注于可用性和性能,而無需過度動畫的東西

          vue后臺UI框架 - ant-design-vue



          現場演示:https://vue.ant.design
          Github: https://github.com/vueComponent/ant-design-vue

          這里是 Ant Design 的 Vue 實現,開發和服務于企業級后臺產品。

          特性

          • 提煉自企業級中后臺產品的交互語言和視覺風格。
          • 開箱即用的高質量 Vue 組件。
          • 共享Ant Design of React設計工具體系。

          Vue后臺UI框架 - vuetifyjs

          現場演示:官網:vuetifyjs.com
          Github:https://github.com/vuetifyjs/vuetify

          Vuetify 是一個 Vue UI 庫,包含手工制作的精美材料組件。不需要設計技能 - 創建令人驚嘆的應用程序所需的一切都觸手可及。

          vue后臺UI框架 - iview



          iview官網:https://www.iviewui.com/
          Github:https://github.com/iview/iview
          官方后臺示例:iview-admin:https://github.com/iview/iview-admin

          iView Admin是一個前端管理后臺集成解決方案。它基于Vue.js并使用UI Toolkit iView。

          餓了么出品的UI框架 - element-ui

          Vue:http://element-cn.eleme.io/2.0/#/zh-CN/component/quickstart
          React:https://eleme.github.io/element-react/#/zh-CN/quick-start
          Angular:https://element-angular.faas.ele.me/guide/start

          基于Vue2.0和bulma0.2的后臺管理框架 - vue-admin


          Github:https://github.com/vue-bulma/vue-admin

          cd vue-admin
          npm install
          npm run dev

          人人開源 / renren-fast-vue

          現場演示:http://demo.open.renren.io/renren-fast (賬號密碼:admin/admin)

          Gitee:https://gitee.com/renrenio/renren-fast-vue

          renren-fast-vue基于vue、element-ui構建開發,實現renren-fast后臺管理前端功能,提供一套更優的前端解決方案

        1. 前后端分離,通過token進行數據交互,可獨立部署
        2. 主題定制,通過scss變量統一一站式定制
        3. 動態菜單,通過菜單管理統一管理訪問路由
        4. 數據切換,通過mock配置對接口數據/mock模擬數據進行切換
        5. 發布時,可動態配置CDN靜態資源/切換新舊版本
        6. 若依 / RuoYi-Vue


          演示地址:http://vue.ruoyi.vip
          文檔地址:http://doc.ruoyi.vip

          RuoYi-Vue 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分離權限管理系統

        7. 前端采用Vue、Element UI。
        8. 后端采用Spring Boot、Spring Security、Redis & Jwt。
        9. 權限認證使用Jwt,支持多終端認證系統。
        10. 支持加載動態權限菜單,多方式輕松權限控制。
        11. 高效率開發,使用代碼生成器可以一鍵生成前后端代碼。
        12. 提供了一個Oracle版本RuoYi-Vue-Oracle,保持同步更新。
        13. 感謝Vue-Element-Admin,eladmin-web。
        14. 不分離版本,請移步RuoYi,微服務版本,請移步RuoYi-Cloud
        15. Vue White Dashboard


          現場演示:https://demos.creative-tim.com/vue-white-dashboard/?ref=devto

          地址:https://www.creative-tim.com/product/vue-white-dashboard?ref=devto

          Vue White Dashboard 是一個免費的開源Bootstrap 4和Vue.js Admin儀表板,其中包含大量的組件,這些組件可以組合在一起并看起來非常漂亮。Vue White儀表板具有16個以上的獨立組件,可讓您自由選擇和組合。這意味著有成千上萬種可能的組合。所有組件的顏色都可能不同,您可以使用SASS文件輕松進行修改。

          Vue QRcode Reader


          現場演示:https://gruhn.github.io/vue-qrcode-reader/?rel=nofollow

          github:https://github.com/gruhn/vue-qrcode-reader?rel=nofollow

          Vue QRcode Reader是一組用于檢測和解碼QR碼的VueJS組件。它使您無需離開瀏覽器即可檢測和解碼QR碼。所有組件都具有響應能力。除此之外,它接近零樣式,因此您可以使它們適合您的布局。使用方法簡單明了。

          VueJS Expo



          現場演示:https://vuejsexpo.com/?ref=devto

          VueJS Expo 使用Vue.js框架收集了許多精美的網站,應用程序和實驗。如果您是VueJS框架的粉絲,那么這里可能是受到啟發的地方。展示包括基于VueJS的主題,元素,儀表板等。

          Vue Paper Dashboard PRO


          現場演示:https://demos.creative-tim.com/bs3/vue-paper-dashboard-pro/#/admin/overview?ref=devto

          地址:https://www.creative-tim.com/product/vue-material-dashboard-pro?ref=devto

          Vue Paper Dashboard PRO 是建立在Bootstrap和Vue之上的漂亮資源。它將幫助您立即開始開發儀表板。Vue Paper Dashboard Pro是 Original Paper Dashboard Pro的VueJS移植版本。使用儀表板非常簡單,但是需要具備Javascript,Vue和Vue-Router的基礎知識。

          Vue-Color


          現場演示:http://vue-color.surge.sh/?rel=nofollow

          Github:https://github.com/xiaokaike/vue-color?rel=nofollow

          Vue-Color 是來自Sketch,Photoshop,Chrome,Github,Twitter,Material Design等眾多酷炫色彩選擇器的集合。

          Vue-Koel


          現場演示:https://koel.dev/?rel=nofollow

          Github:https://github.com/koel/koel?rel=nofollow

          Koel 是一種簡單的基于Web的個人音頻流服務,在客戶端用Vue編寫,在服務器端用Laravel編寫。針對Web開發人員,Koel采用了一些更現代的Web技術-CSS網格,音頻和拖放API等來完成其工作。

          Vue Argon Dashboard


          現場演示:https://demos.creative-tim.com/vue-argon-dashboard/?ref=devto

          地址:https://www.creative-tim.com/product/vue-argon-dashboard?ref=devto

          Vue Argon Dashboard 是Bootstrap 4和Vue.js的儀表板。它是開源的,免費的,并且具有許多組件,可以幫助您創建出色的網站。Vue Argon儀表板內置了100多個單獨的組件,因此您可以選擇和組合。由于實現了所有元素,因此從原型制作到功能齊全的代碼,您將節省大量時間。該儀表板附帶了預先構建的示例,因此開發過程是無縫的,從我們的頁面切換到真實的網站非常容易。

          Pagekit

          現場演示:https://pagekit.com/?rel=nofollow

          github:https://github.com/pagekit/pagekit?rel=nofollow

          Pagekit 是使用Symfony組件和VueJS構建的模塊化,輕量級CMS。不管是個人博客還是公司網站,使用Pagekit都可以為Web創建功能強大的內容,使其在每種設備上都能完美運行。它具有干凈直觀的界面。它也有一個很棒的內置市場。

          Vue Material Dashboard PRO


          現場演示:https://demos.creative-tim.com/vue-material-dashboard-pro/?ref=devto#/dashboard

          地址:https://www.creative-tim.com/product/vue-material-dashboard-pro?ref=devto

          Vue Material Dashboard PRO 是基于Vue Material和VueJS構建的超棒高級管理模板。它是通過考慮您在儀表板中實際需要的東西而創建的。Vue Material Dashboard PRO包含精選和優化的VueJS插件。一切都旨在相互配合。使用儀表板非常簡單,但是需要具備Javascript,VueJS和Vue Router的基礎知識。

          Vue Material Kit


          現場演示:https://demos.creative-tim.com/vue-material-kit/?ref=devto#/

          地址:https://www.creative-tim.com/product/vue-material-kit?ref=devto

          Vue Material Kit 是基于Vue Material和VueJS構建的驚人的免費開源資源。這將幫助您立即開始開發UI Kit。Vue材料工具包是原始材料工具包的官方VueJS版本。使用UI Kit非常簡單,但是需要Javascript,VueJS和Vue Router的基礎知識。

          Retrospectify

          現場演示:http://pepf.nl/retrospective/?rel=nofollow

          github :https://www.creative-tim.com/product/vue-material-kit?ref=devto

          Retrospectify 是用Vue編寫的出色工具,用于數字化敏捷團隊回顧。當與遠程團隊進行回顧時,或者當您希望隨時間跟蹤回顧結果時,這將很有用。它具有三種注釋類型,您可以在注釋周圍移動或將點添加到各個注釋中。

          Code Notes


          現場演示:https://lauthieb.github.io/code-notes/?rel=nofollow

          github :https://github.com/lauthieb/code-notes?rel=nofollow

          最后

          如果您尚未使用VueJS,則應該知道它在Github上擁有超過164k的星星和88.7k的星星。很多!同樣,Vue是一種開源產品,這意味著任何人都可以為它做貢獻或從貢獻者那里學到新東西。

          我希望這個清單可以在您的下一個開發項目中為您提供幫助

          推薦Vue學習資料文章:

          《如何寫出優秀后臺管理系統?11個經典模版拿去不謝「干貨」》


          主站蜘蛛池模板: 亚洲熟女综合色一区二区三区| 无码人妻精品一区二区三区不卡 | 一本AV高清一区二区三区| 免费观看日本污污ww网站一区| 国产波霸爆乳一区二区| 末成年女A∨片一区二区| 中文字幕一区二区三区乱码| 国产乱人伦精品一区二区 | 一区二区三区午夜| 国产精品久久久久久一区二区三区 | 日韩一区二区超清视频| 亚洲色欲一区二区三区在线观看| 国产成人精品视频一区| 在线|一区二区三区四区| 精品一区二区ww| 国产一区二区三区在线观看免费 | 欧美日韩精品一区二区在线观看 | 在线|一区二区三区| 亚洲一区在线免费观看| 国产一区二区内射最近更新| 精品一区二区三区在线观看l | 免费精品一区二区三区第35| 夜夜高潮夜夜爽夜夜爱爱一区| 亚洲国产情侣一区二区三区 | 中文字幕永久一区二区三区在线观看| 精品少妇人妻AV一区二区 | 亚洲AV无码一区二区三区网址| 国产亚洲一区二区精品| 99精品国产高清一区二区三区 | 久99精品视频在线观看婷亚洲片国产一区一级在线 | 色欲AV蜜桃一区二区三| 人妻精品无码一区二区三区| 色噜噜AV亚洲色一区二区 | 黑巨人与欧美精品一区| 亚洲av永久无码一区二区三区| 日产精品久久久一区二区| 久久精品一区二区| 日本高清成本人视频一区| 99精品国产一区二区三区| 亚洲国产成人久久一区WWW | 亚洲AV无码一区二区三区电影|