运行效果: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;还依赖于过去 触发器…