网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using Dpz.Core.EnumLibrary;
using Dpz.Core.Public.ViewModel.V4;
using Dpz.Core.Service.ObjectStorage.Services;
using Dpz.Core.Service.V4.Services;
using Dpz.Core.Web.Library.Hub;
using Dpz.Core.Web.Models;
using Microsoft.AspNetCore.SignalR;
using MongoDB.Bson;

namespace Dpz.Core.Web.Controllers;

public class TalkController(
    IMumbleService mumbleService,
    IHubContext<Notification> hubContext,
    IObjectStorageOperation objectStorageService
) : Controller
{
    public async Task<IActionResult> Index(int pageIndex = 1, int pageSize = 10)
    {
        this.SetTitle("日常碎碎念");
        ViewBag.Menu = MenuItem.Mumble;
        var list = await mumbleService.GetPagesAsync(pageIndex, pageSize);
        if (Request.Headers["X-PJAX"] == "true" && Request.Query["_pjax"] == ".mumble-list")
        {
            return View("_TalkPagePartial", list);
        }
        var data = await mumbleService.GetRandomMumblesAsync(5);
        return View(new MumbleIndexModel(list, data));
    }

    [CheckAuthorize]
    [HttpPost]
    public async Task<IActionResult> Publish(string markdown, string html, string id = "")
    {
        var viewModel = new VmMumble
        {
            Id = id,
            Author = this.GetIdentity(),
            CreateTime = DateTime.Now,
            HtmlContent = html,
            LastUpdateTime = DateTime.Now,
            Markdown = markdown,
        };
        if (!string.IsNullOrEmpty(id))
        {
            var userInfo = User.GetStrictIdentity();
            var talk = await mumbleService.FindAsync(id);
            if (userInfo.Id != talk?.Author.Id)
            {
                return Json(new ResultInfo("没有权限修改碎碎念!"));
            }
        }

        if (string.IsNullOrEmpty(id))
        {
            await mumbleService.CreateAsync(viewModel);
            await hubContext.Clients.All.SendCoreAsync("pushMessage", [viewModel]);
        }
        else
            await mumbleService.EditContentAsync(viewModel);

        return Json(new ResultInfo(true));
    }

    //[CheckAuthorize]
    [HttpPost]
    public async Task<IActionResult> Like(string id)
    {
        var talk = await mumbleService.LikeAsync(id);
        return Json(new ResultInfo(talk?.Like));
    }

    [CheckAuthorize]
    [HttpPost]
    public async Task<IActionResult> Upload()
    {
        var file = Request.Form.Files.FirstOrDefault();
        if (file is { Length: > 0 } && file.ContentType.Contains("image"))
        {
            //var userInfo = User.GetIdentity();
            var path = new List<string> { "images", "mumble", DateTime.Now.ToString("yyyy-MM-dd") };
#if DEBUG
            path.Insert(0, "Test");
#endif
            var fileName =
                ObjectId.GenerateNewId() + file.FileName[file.FileName.LastIndexOf('.')..];
            var result = await objectStorageService.UploadAsync(
                file.OpenReadStream(),
                path,
                fileName
            );
            return Json(
                new
                {
                    success = 1,
                    message = "",
                    url = result.AccessUrl,
                }
            );
        }

        return Json(
            new
            {
                success = 0,
                message = "请选择一张图片!",
                url = "",
            }
        );
    }

    [CheckAuthorize, HttpGet]
    public async Task<IActionResult> Publish(string id = "")
    {
        VmMumble? model = null;
        if (!string.IsNullOrEmpty(id))
        {
            model = await mumbleService.FindAsync(id);
        }

        return View(model);
    }

    [HttpGet]
    public async Task<IActionResult> Preview(string id = "")
    {
        if (string.IsNullOrEmpty(id))
        {
            return NotFound();
        }

        var talk = await mumbleService.FindAsync(id);
        if (talk == null)
            return NotFound();
        return View(talk);
    }

    [HttpPost, CheckAuthorize]
    public async Task<IActionResult> Delete(string id)
    {
        var userInfo = User.GetStrictIdentity();
        var talk = await mumbleService.FindAsync(id);
        if (talk == null || talk.Author.Id != userInfo.Id)
        {
            return Json(new ResultInfo("碎碎念删除失败,没有权限删除或者不存在!"));
        }

        await mumbleService.DeleteAsync(id);
        return Json(new ResultInfo(true));
    }

    [HttpGet]
    public async Task<IActionResult> Comment(string id = "")
    {
        var talk = await mumbleService.FindAsync(id);
        if (talk == null)
            return NotFound();
        this.SetTitle("碎碎念回复");
        ViewBag.Menu = MenuItem.Mumble;
        return View(talk);
    }

    #region memble mobile

    [HttpGet, CheckAuthorize]
    public async Task<IActionResult> MyTalk(
        int pageIndex = 1,
        int pageSize = 10,
        string content = ""
    )
    {
        var userInfo = User.GetStrictIdentity();
        var source = await mumbleService.GetPagesAsync(pageIndex, pageSize, content, userInfo.Id);
        var data = Pagination<VmMumble>.Create(source);
        return Json(new ResultInfo(data));
    }

    [HttpGet]
    public async Task<IActionResult> Detail(string id = "")
    {
        if (string.IsNullOrEmpty(id))
        {
            return Json(new ResultInfo("缺失参数"));
        }

        var mumble = await mumbleService.FindAsync(id);
        if (mumble == null)
        {
            return Json(new ResultInfo("碎碎念不存在"));
        }

        return Json(new ResultInfo(mumble));
    }

    #endregion
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个 ASP.NET Core 控制器类 TalkController,用于处理与“碎碎念”相关的操作。这个控制器主要负责管理用户的碎碎念(类似于社交媒体的帖子或状态更新),包括发布、编辑、删除、点赞、上传图片等功能。以下是对代码中各个部分的详细解释:

1. 控制器构造函数

public TalkController(
    IMumbleService mumbleService,
    IHubContext<Notification> hubContext,
    IObjectStorageOperation objectStorageService
)
  • IMumbleService: 用于处理与碎碎念相关的业务逻辑。
  • IHubContext: 用于与 SignalR Hub 进行交互,推送实时通知。
  • IObjectStorageOperation: 用于处理文件上传和存储。

2. Index 方法

public async Task<IActionResult> Index(int pageIndex = 1, int pageSize = 10)
  • 该方法用于显示碎碎念的列表。
  • 支持分页,默认每页显示 10 条记录。
  • 如果请求是通过 PJAX(一个用于无刷新加载内容的技术)发起的,则返回部分视图 _TalkPagePartial
  • 否则,返回完整的视图 MumbleIndexModel,其中包含随机的碎碎念数据。

3. Publish 方法

[CheckAuthorize]
[HttpPost]
public async Task<IActionResult> Publish(string markdown, string html, string id = "")
  • 该方法用于发布或编辑碎碎念。
  • 如果提供了 id,则检查当前用户是否有权限修改该碎碎念。
  • 如果没有 id,则创建新的碎碎念,并通过 SignalR 推送消息。
  • 如果有 id,则更新现有的碎碎念。

4. Like 方法

[HttpPost]
public async Task<IActionResult> Like(string id)
  • 该方法用于对指定的碎碎念进行点赞。
  • 返回当前点赞数。

5. Upload 方法

[CheckAuthorize]
[HttpPost]
public async Task<IActionResult> Upload()
  • 该方法用于上传图片。
  • 检查上传的文件是否为图片,并将其存储在指定路径。
  • 返回上传结果,包括图片的访问 URL。

6. Publish (GET) 方法

[CheckAuthorize, HttpGet]
public async Task<IActionResult> Publish(string id = "")
  • 该方法用于显示发布或编辑碎碎念的页面。
  • 如果提供了 id,则加载相应的碎碎念数据。

7. Preview 方法

[HttpGet]
public async Task<IActionResult> Preview(string id = "")
  • 该方法用于预览指定的碎碎念。
  • 如果找不到对应的碎碎念,则返回 404。

8. Delete 方法

[HttpPost, CheckAuthorize]
public async Task<IActionResult> Delete(string id)
  • 该方法用于删除指定的碎碎念。
  • 检查用户是否有权限删除该碎碎念。

9. Comment 方法

[HttpGet]
public async Task<IActionResult> Comment(string id = "")
  • 该方法用于显示指定碎碎念的评论页面。

10. MyTalk 方法

[HttpGet, CheckAuthorize]
public async Task<IActionResult> MyTalk(int pageIndex = 1, int pageSize = 10, string content = "")
  • 该方法用于获取当前用户的碎碎念列表,支持分页和内容过滤。

11. Detail 方法

[HttpGet]
public async Task<IActionResult> Detail(string id = "")
  • 该方法用于获取指定碎碎念的详细信息。

总结

整体上,TalkController 提供了一系列 API 接口,允许用户创建、编辑、删除、查看和点赞碎碎念,同时支持图片上传和实时通知功能。通过这些功能,用户可以在平台上进行互动和分享。

loading