1分鐘臨時共享空間在線小工具實現

運行效果:1分鐘臨時共享空間 - 免注冊即時文件文本共享工具 | 極速傳

直接上代碼:

?

using Microsoft.AspNetCore.Mvc;
using SaaS.OfficialWebSite.Web.Utils;
using ZXing.QrCode;
using ZXing;
using SkiaSharp;
using ZXing.SkiaSharp.Rendering;
using ZXing.Common;
using ZXing.QrCode.Internal;namespace SaaS.OfficialWebSite.Web.Controllers
{public class ShareSpaceController : Controller{public IActionResult Index(){if (string.IsNullOrEmpty(HttpContext.Session.GetString("CurrentUser"))){HttpContext.Session.SetString("CurrentUser", Guid.NewGuid().ToString("N"));}return View();}private readonly ISpaceService _spaceService;public ShareSpaceController(ISpaceService spaceService){_spaceService = spaceService;}[HttpGet("GenerateQrCode")]public IActionResult GenerateQrCode([FromQuery] string content){if (string.IsNullOrWhiteSpace(content)){return BadRequest("內容不能為空");}try{var qrCodeBytes = GenerateQrCodeImg(content);return File(qrCodeBytes, "image/png");}catch (Exception ex){return StatusCode(500, $"生成二維碼失敗: {ex.Message}");}}public byte[] GenerateQrCodeImg(string content, int width = 300, int height = 300){// 解析顏色var foreground =  SKColors.Black;var background =  SKColors.White;// 創建渲染器var renderer = new SKBitmapRenderer();renderer.Foreground = foreground;renderer.Background = background;// 配置條形碼寫入器var barcodeWriter = new BarcodeWriter<SKBitmap>{Format = BarcodeFormat.QR_CODE,Options = new EncodingOptions{Width = width,Height = height,Margin =  2,PureBarcode = true},Renderer = renderer  // 使用配置好的渲染器};barcodeWriter.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 生成條形碼/二維碼var barcodeBitmap = barcodeWriter.Write(content);// 將圖像轉換為內存流using (var image = SKImage.FromBitmap(barcodeBitmap))using (var data = image.Encode(SKEncodedImageFormat.Png, 100))using (var memoryStream = new MemoryStream()){data.SaveTo(memoryStream);memoryStream.Seek(0, SeekOrigin.Begin);return memoryStream.ToArray();}}[HttpGet("GetUserSpaces")]public async Task<IActionResult> GetUserSpaces(){// 這里應該從認證中獲取用戶ID,示例使用固定值var userId = HttpContext.Session.GetString("CurrentUser");var spaces = await _spaceService.GetUserSpaces(userId);return Ok(SpaceApiResponse<IEnumerable<Space>>.Ok(spaces));}[HttpGet("GetSpace")]public async Task<IActionResult> GetSpace([FromQuery] string id){var space = await _spaceService.GetSpace(id);if (space == null){return NotFound(SpaceApiResponse<Space>.Fail("空間不存在"));}// 檢查用戶是否有權限訪問var userId = HttpContext.Session.GetString("CurrentUser");if (space.OwnerId != userId && !space.MemberIds.Contains(userId)){return Unauthorized(SpaceApiResponse<Space>.Fail("無權訪問此空間"));}return Ok(SpaceApiResponse<Space>.Ok(space));}[HttpPost("CreateSpace")]public async Task<IActionResult> CreateSpace([FromForm] CreateSpaceRequest request){if (string.IsNullOrWhiteSpace(request.Name)){return BadRequest(SpaceApiResponse<Space>.Fail("空間名稱不能為空"));}var userId = HttpContext.Session.GetString("CurrentUser");var space = await _spaceService.CreateSpace(request.Name, userId);return Ok(SpaceApiResponse<Space>.Ok(space));}[HttpDelete("DeleteSpace")]public async Task<IActionResult> DeleteSpace([FromQuery] string id){var space = await _spaceService.GetSpace(id);if (space == null){return NotFound(SpaceApiResponse<bool>.Fail("空間不存在"));}// 檢查用戶是否有權限刪除var userId = HttpContext.Session.GetString("CurrentUser");if (space.OwnerId != userId){return Unauthorized(SpaceApiResponse<bool>.Fail("無權刪除此空間"));}var result = await _spaceService.DeleteSpace(id);return Ok(SpaceApiResponse<bool>.Ok(result));}[HttpPost("JoinSpace")]public async Task<IActionResult> JoinSpace([FromQuery] string id){var space = await _spaceService.GetSpace(id);if (space == null){return Ok(SpaceApiResponse<bool>.Fail("空間不存在"));}var userId = HttpContext.Session.GetString("CurrentUser");if (space.OwnerId == userId || space.MemberIds.Contains(userId)){return Ok(SpaceApiResponse<Space>.Ok(space));}var result = await _spaceService.AddUserToSpace(id, userId);return Ok(SpaceApiResponse<Space>.Ok(space));}[HttpGet("GetSpaceItems")]public async Task<IActionResult> GetSpaceItems([FromQuery] string id){var space = await _spaceService.GetSpace(id);if (space == null){return NotFound(SpaceApiResponse<object>.Fail("空間不存在"));}// 檢查用戶是否有權限訪問var userId = HttpContext.Session.GetString("CurrentUser");if (space.OwnerId != userId && !space.MemberIds.Contains(userId)){return Unauthorized(SpaceApiResponse<object>.Fail("無權訪問此空間"));}var items = await _spaceService.GetSpaceItems(id);return Ok(SpaceApiResponse<object>.Ok(new{name = space.Name,items = items}));}[HttpPost("AddTextItem")]public async Task<IActionResult> AddTextItem([FromForm] AddTextItemRequest request){if (string.IsNullOrWhiteSpace(request.Title) || string.IsNullOrWhiteSpace(request.Content)){return BadRequest(SpaceApiResponse<TextItem>.Fail("標題和內容不能為空"));}// 檢查空間是否存在和權限var space = await _spaceService.GetSpace(request.SpaceId);if (space == null){return NotFound(SpaceApiResponse<TextItem>.Fail("空間不存在"));}var userId = HttpContext.Session.GetString("CurrentUser");if (space.OwnerId != userId && !space.MemberIds.Contains(userId)){return Unauthorized(SpaceApiResponse<TextItem>.Fail("無權在此空間添加內容"));}var textItem = await _spaceService.AddTextItem(request.SpaceId,request.Title,request.Content,userId);return Ok(SpaceApiResponse<TextItem>.Ok(textItem));}[HttpPost("UploadFile")]public async Task<IActionResult> UploadFile([FromForm] IFormFile file, [FromForm] string spaceId){if (file == null || file.Length == 0){return BadRequest(SpaceApiResponse<FileItem>.Fail("文件不能為空"));}// 檢查空間是否存在和權限var space = await _spaceService.GetSpace(spaceId);if (space == null){return NotFound(SpaceApiResponse<FileItem>.Fail("空間不存在"));}var userId = HttpContext.Session.GetString("CurrentUser");if (space.OwnerId != userId && !space.MemberIds.Contains(userId)){return Unauthorized(SpaceApiResponse<FileItem>.Fail("無權在此空間上傳文件"));}var fileItem = await _spaceService.AddFileItem(spaceId, file, userId);return Ok(SpaceApiResponse<FileItem>.Ok(fileItem));}[HttpDelete("DeleteItem")]public async Task<IActionResult> DeleteItem([FromQuery] string spaceId, [FromQuery] string type, [FromQuery] string id){if (type != "text" && type != "file"){return BadRequest(SpaceApiResponse<bool>.Fail("無效的類型"));}var item = (await _spaceService.GetSpaceItems(spaceId)).FirstOrDefault(i => i.Id == id && i.Type == type);if (item == null){return NotFound(SpaceApiResponse<bool>.Fail("內容不存在"));}// 檢查權限var userId = HttpContext.Session.GetString("CurrentUser");if (item.CreatorId != userId){// 如果是空間所有者也可以刪除var space = await _spaceService.GetSpace(item.SpaceId);if (space?.OwnerId != userId){return Unauthorized(SpaceApiResponse<bool>.Fail("無權刪除此內容"));}}var result = await _spaceService.DeleteItem(id, type);return Ok(SpaceApiResponse<bool>.Ok(result));}}// DTOspublic class CreateSpaceRequest{public string Name { get; set; }}public class AddTextItemRequest{public string SpaceId { get; set; }public string Title { get; set; }public string Content { get; set; }}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94037.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94037.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94037.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統-lecture5(線程)

進程的缺點 在創建了子進程的時候&#xff0c;得到了可以并發執行的好處 但創建了進程資源會造成浪費 線程的引入 在同一個進程中有這樣兩個執行流&#xff0c;為并發執行的&#xff0c;稱之為線程 這里引用下《操作系統概念》中的線程概述 任務舉例 在復制的過程中&#xf…

FPGA kernel 仿真器調試環境搭建

參考:haps階段說明2:kernel運行和調試 1 仿真器加載FIT及調試步驟 由于使用仿真器,就要額外配置DS-5的軟件環境,有些步驟略復雜,請仔細按照說明操作。 1.1 導入kernel工程 不導入可以運行,但導入方便調試 file——-import 導入后的工程如圖 1.2 創建debug 使用attach方…

MySQL(173)MySQL中的存儲過程和函數有什么區別?

在MySQL中&#xff0c;存儲過程&#xff08;Stored Procedures&#xff09;和函數&#xff08;Functions&#xff09;是兩種用于封裝可重用SQL代碼的機制。盡管它們在很多方面類似&#xff0c;但仍有一些重要的區別。以下是對存儲過程和函數的詳細解釋&#xff0c;以及如何在My…

可計算存儲(Computational Storage)與DPU(Data Processing Unit)的技術特點對比及實際應用場景分析

以下是對可計算存儲&#xff08;Computational Storage&#xff09;與DPU&#xff08;Data Processing Unit&#xff09;的技術特點對比及實際應用場景分析&#xff0c;結合引用資料進行綜合說明&#xff1a;一、技術核心對比維度可計算存儲DPU核心差異定位存儲設備內置計算能力…

rag學習-以項目為基礎快速啟動掌握rag

rag從0到放棄黃帝內經rag問答系統RAG 項目版本迭代總覽各版本技術細節如何使用黃帝內經rag問答系統 本項目使用爬蟲獲取了皇帝內經全文以此為數據構建檢索增強系統 本項目以一個系統的多層迭代不斷更新優化技術&#xff0c;由淺入深逐漸理解rag原理及優化技術 話不多說github…

linux 啟動流程?

linux 啟動流程 CPU 上電后最先執行的啟動代碼&#xff0c;通常確實是放在 arch 目錄下對應架構的啟動文件里。這是因為啟動代碼強相關于 CPU 架構和硬件細節&#xff0c;不同架構差異非常大。具體說明 1. 為什么啟動代碼放在 arch 目錄&#xff1f; 啟動代碼要設置 CPU 狀態&a…

《Kubernetes部署篇:基于Kylin V10+ARM64架構CPU使用containerd部署K8S 1.33.3集群(多主多從)》

總結:整理不易,如果對你有幫助,可否點贊關注一下? 更多詳細內容請參考:企業級K8s集群運維實戰 一、架構圖 如下圖所示: 二、環境信息 基于x86_64+aarch64架構使用containerd部署K8S 1.33.3集群資源合集(三主多從) 2、部署規劃 云平臺 主機名 K8S版本 系統版本 CPU架構…

Docker 鏡像打包為 ZIP 文件便于分享和轉發

網上找到的記錄一下方便下次看步驟詳解1. 將鏡像導出為 TAR 文件Docker 提供了 docker save 命令&#xff0c;可以將鏡像導出為 .tar 文件。使用以下命令&#xff1a;docker save -o dify.tar dify說明&#xff1a;docker save&#xff1a;導出鏡像為文件。-o dify.tar&#xf…

一對一交友小程序 / APP 系統架構分析

一對一交友小程序 / APP 系統架構分析一、引言在數字化社交的大背景下&#xff0c;一對一交友小程序和 APP 為人們拓展社交圈提供了便捷途徑。合理且高效的系統架構是保障此類應用穩定運行、提升用戶體驗的基石。本文將深入剖析一對一交友小程序 / APP 的系統架構&#xff0c;涵…

Anthropic最新研究Persona vector人格向量

今天本來就想更一期強化學習&#xff0c;但是突然看了Anthropic的persona vector&#xff0c;所以又來寫這一篇&#xff0c;因為我覺得這個很有價值以往我們玩LLM比較怕的事就事他亂說話作為概率模型&#xff0c;它能說對&#xff0c;它也能亂編&#xff0c;亂編輕癥就是所謂的…

Spring AI集成Elasticsearch向量檢索時filter過濾失效問題排查與解決方案

使用vectorStore.similaritySearch遇到問題 最近需要做一個功能&#xff0c;用到了es做向量數據庫。在使用vectorStore.similaritySearch查詢的時候&#xff0c;發現filterExpression中加的條件并沒有完全生效&#xff0c;導致查詢出來的數據不準確&#xff0c;出現了不符合me…

安燈系統(Andon System)

安燈系統是源自豐田生產系統(TPS)的一種可視化生產管理工具&#xff0c;其名稱"Andon"來自日語的"提燈"&#xff0c;原指用于報警的燈籠&#xff0c;現已成為制造業現場管理的核心工具之一。一、安燈系統的定義安燈系統是一種實時監控生產異常的可視化管理…

MyBatis與MySQL

要理解 MyBatis 語法及其與 MySQL 的區別&#xff0c;首先需要明確兩者的本質定位&#xff1a;MyBatis 是 Java 的持久層框架&#xff08;負責 Java 對象與數據庫數據的映射&#xff09;&#xff0c;而MySQL 是關系型數據庫管理系統&#xff08;負責數據的存儲和 SQL 執行&…

Vulnhub Noob靶機復現(附提權)

一、安裝靶機 下載地址&#xff1a;https://download.vulnhub.com/noob/Noob.ova 下載好后使用VM打開配置如下。 二、主機發現 使用nmap掃描確認靶機ip(192.168.29.138) nmap -sn 192.168.29.1/24 三、端口掃描 使用nmap工具掃描全部端口以防遺漏。 nmap -A -p- 192.168.…

文心4.5開源測評:國產大模型的輕量化革命與全棧突破

> 當算力成本成為AI落地的最大攔路虎,一款僅需2.1GB顯存、支持32K上下文的輕量級大模型如何撬動產業智能化的大門? ^ - ^ 2025年6月30日,百度正式開源文心大模型4.5系列,以**10款全維度模型矩陣**(0.3B至424B參數)刷新國產開源模型的技術邊界。這不僅是參數規模的躍進…

【自存用】mumu模擬器+mitmproxy配置

一、 安裝證書 下載mitmproxy進行安裝。cmd 輸入 mitmdump產生證書在C:\Users\賬號名.mitmproxy找到mitmproxy-ca.p12,雙擊進入證書導入向導&#xff0c;一直點下一頁&#xff0c;直到選擇證書存儲的地方選擇【受信任的根證書頒發機構】&#xff0c;后面的繼續點【是】或【完成…

Java中的字符串 - String 類

在C語言中若要表示字符串只能使用字符數組或者字符指針&#xff0c;Java語言則專門提供了 String 類&#xff0c;在面向對象編程中具有重要地位。在開發和校招筆試中&#xff0c;字符串也是常客。 目錄 一、字符串的構造 二、常用方法 2.1 字符串的拼接 2.2 字符串之間的比…

[網安工具] Web 漏洞掃描工具 —— AWVS · 使用手冊

&#x1f31f;想了解其它網安工具&#xff1f;看看這個&#xff1a;[網安工具] 網絡安全工具管理 —— 工具倉庫 管理手冊 Acunetix | Web Application Security ScannerAcunetix is an end-to-end web security scanner that offers a 360 view of an organization’s securi…

丑數-優先隊列/三指針/動態規劃

丑數 Solution 核心思路&#xff1a; 注意的幾個點&#xff1a; 1.優先隊列改變排序&#xff1a; priority_queue<int,vector<int>,greater<int>> q;2.用來判斷是否訪問過&#xff0c;可以用unordered_set 注意set的插入用的是insert而不是push unorder…

FPGA(或者數字電路)中組合邏輯和時序邏輯是怎么劃分的

1.組合邏輯 在FPGA中&#xff0c;組合邏輯是哪些沒有觸發器作為存儲單元的電路 LUT查找表就是組合邏輯電路&#xff0c;無時鐘信號參與。 加法器&#xff0c;邏輯門&#xff0c;多路選擇器&#xff0c;譯碼器2.時序邏輯電路 輸出依賴于當前輸入&#xff0c;還依賴于過去 觸發器…