XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

STHApplication

【MAUI】寄当家——安卓端交易管理系统

公开
关注 0 Fork 0 Star 0
UTF-8
using JiDangJia.Services;
using JiDangJia.Core;
using System.Text.Json;

namespace JiDangJia.Views;

public sealed class AdminPage : ContentPage
{
    private readonly AuthClient auth=AuthClient.Current;
    private readonly VerticalStackLayout list=Ui.Stack(),metrics=Ui.Stack();
    private readonly Entry search=new(){Placeholder="搜索账号 / 姓名 / 日志",ClearButtonVisibility=ClearButtonVisibility.WhileEditing};
    private JsonDocument? overview;private string section="accounts";private int page;
    public AdminPage()
    {
        if(!auth.IsAdmin)throw new InvalidOperationException("需要管理员权限");Title="寄当家社群管理后台";
        var body=Ui.Stack(Ui.Card(Ui.Stack(Ui.Text("寄当家社群管理中心",21,bold:true),Ui.Text("管理员:"+auth.Name,11,Ui.Muted))),metrics,
            Ui.Button("社群认证与举报",()=>Navigation.PushAsync(new SafetyAdminPage()),false),
            Ui.Button("社群风险提示与官方推荐",()=>Navigation.PushAsync(new CommunityAdminPage()),false),
            Ui.Button("客服与反馈入口管理",()=>Navigation.PushAsync(new SupportAdminPage()),false),
            Ui.Button("关于我们与备案信息",()=>Navigation.PushAsync(new AboutAdminPage()),false),
            Ui.Button("APP 版本更新管理",()=>Navigation.PushAsync(new AppUpdateAdminPage()),false),
            Ui.Button("用户协议与隐私政策管理",()=>Navigation.PushAsync(new LegalAdminPage()),false),Ui.Card(search,13,new Thickness(12,0),Ui.Paper));
        body.Add(Ui.Spread(Ui.Button("账户",()=>Select("accounts"),false),Ui.Button("日志",()=>Select("audit"),false)));
        body.Add(list);body.Add(Ui.Button("刷新后台数据",Load,false));body.Padding=18;Content=new ScrollView{Content=body};search.TextChanged+=(_,_)=>{page=0;Render();};
    }
    private Task Select(string value){section=value;page=0;Render();return Task.CompletedTask;}
    protected override async void OnAppearing(){base.OnAppearing();try{await Load();}catch(Exception ex){await DisplayAlertAsync("无法加载",ex.Message,"知道了");}}
    private async Task Load(){var loaded=await auth.AdminRequest("/overview");overview?.Dispose();overview=loaded;Render();}
    private void Render()
    {
        if(overview is null)return;list.Clear();metrics.Clear();var root=overview.RootElement;
        var accounts=root.GetProperty("accounts").EnumerateArray().ToList();
        metrics.Add(Ui.Card(Ui.Stack(Ui.Text("用户账户",11,Ui.Muted),Ui.Text(accounts.Count(a=>a.GetProperty("role").GetString()=="user").ToString(),26,Ui.Bronze,true))));
        var records=root.GetProperty(section).EnumerateArray().Where(r=>string.IsNullOrWhiteSpace(search.Text)||r.EnumerateObject().Any(p=>p.Value.ToString().Contains(search.Text,StringComparison.OrdinalIgnoreCase))).ToList();
        list.Add(Ui.Text(records.Count+" 条记录",11,Ui.Muted));if(records.Count==0)list.Add(Ui.Card(Ui.Empty("暂无记录","用户账户与管理日志将在这里显示")));
        page=Math.Min(page,Math.Max(0,(records.Count-1)/40));
        foreach(var record in records.Skip(page*40).Take(40)){
            var r=DbRow.FromJson(record);var id=r.Id;bool active=r.Int("active")==1;var card=Ui.Stack();
            if(section=="accounts"){
                card.Add(Ui.Spread(Ui.Text(r.Text("username"),17,bold:true),Ui.Pill(r.Text("role")=="admin"?"管理员":active?"正常":"停用")));card.Add(Ui.Text(r.Text("name"),12,Ui.Muted));
                if(r.Text("role")!="admin"){
                    card.Add(Ui.Text("认证:"+CommunitySafetyUi.Status(r.Text("identityStatus"))+" · 手机号:"+r.Text("phone"),12,Ui.Muted));
                    card.Add(Ui.Text(r.Int("communityBanned")==1?"社群:已禁言"+(r.Text("communityBanUntil").Length==0?"(永久)":" · "+r.Text("communityBanUntil")):"社群:正常",12,Ui.Bronze));
                    card.Add(Ui.Button("社群禁言设置",()=>Navigation.PushAsync(new CommunityMutePage(r)),false));
                    card.Add(Ui.Button(active?"停用账户":"启用账户",async()=>{if(await DisplayAlertAsync("账户状态","确认更新此账户状态?","确认","取消")){using var d=await auth.AdminRequest("/accounts/"+id+"/status",new{active=!active});await Load();}},false));
                    card.Add(Ui.Button("重置用户密码",async()=>{var secret=await PasswordDialog.Ask(this,"重置密码","为此用户设置新的密码(至少 8 位)");if(secret is null)return;using var d=await auth.AdminRequest("/accounts/"+id+"/reset-password",new{password=secret});await DisplayAlertAsync("已重置","该用户需要使用新密码重新登录。","完成");},false));
                }
            }else{card.Add(Ui.Text(Display.Action(r.Text("action")),15,bold:true));card.Add(Ui.Text(r.Text("actorName")+" · "+r.Date("createdAt").ToLocalTime().ToString("MM-dd HH:mm"),11,Ui.Muted));card.Add(Ui.Text(r.Text("detail"),11,Ui.Muted));}
            list.Add(Ui.Card(card));
        }
        if(records.Count>40)list.Add(Ui.Spread(Ui.Button("上一页",()=>{page=Math.Max(0,page-1);Render();return Task.CompletedTask;},false),Ui.Button("下一页",()=>{page=Math.Min((records.Count-1)/40,page+1);Render();return Task.CompletedTask;},false)));
    }
}