Wpf 使用 Prism 实战开发Day27

首页汇总和数据动态显示

一.创建首页数据汇总数据接口

  • 汇总:待办事项的总数
  • 已完成:待办事项里面有多少条完成的待办
  • 完成比例:已完成和汇总之间的比例
  • 备忘录:显示备忘录的总数
  • 待办事项:显示待办事项未完成的集合
  • 备忘录:显示全部的备忘录信息

step1:在MyToDo.Shared 项目中创建出首页汇总的数据实体类(SummaryDto)

public class SummaryDto:BaseDto
{
	private int sum;
	/// <summary>
	/// 汇总
	/// </summary>
	public int Sum
	{
		get { return sum; }
		set { sum = value;OnPropertyChanged();}
	}
	private int completedCount;
	/// <summary>
	/// 已完成总数
	/// </summary>
	public int CompletedCount
    {
		get { return completedCount; }
		set { completedCount = value; OnPropertyChanged(); }
	}
	private string completedRatio;
	/// <summary>
	/// 完成比例
	/// </summary>
	public string CompletedRatio
    {
		get { return completedRatio; }
		set { completedRatio = value; OnPropertyChanged(); }
	}
	private int memoeCount;
	/// <summary>
	/// 备忘录总数
	/// </summary>
	public int MemoeCount
    {
		get { return memoeCount; }
		set { memoeCount = value; OnPropertyChanged(); }
	}


	private ObservableCollection<ToDoDto> todoList;
	/// <summary>
	/// 待办事项列表
	/// </summary>
	public ObservableCollection<ToDoDto> TodoList
	{
		get { return todoList; }
		set { todoList = value; OnPropertyChanged(); }
	}
    private ObservableCollection<MemoDto> memoList;
    /// <summary>
    /// 备忘录列表
    /// </summary>
    public ObservableCollection<MemoDto> MemoList
    {
        get { return memoList; }
        set { memoList = value; OnPropertyChanged(); }
    }
}

step2:在MyToDo.Api 项目中,创建接口实现

1.在IToDoService 增加汇总接口
    public interface IToDoService: IBaseService<ToDoDto>
    {
        Task<ApiResponse> GetAllFilterAsync(ToDoParameter query);
        /// <summary>
        /// 汇总接口
        /// </summary>
        /// <returns></returns>
        Task<ApiResponse> Summary();
    }
2.ToDoService 实现汇总接口逻辑
 public async Task<ApiResponse> Summary()
 {
     try
     {
         //待办事项结果
         var todos = await work.GetRepository<ToDo>().GetAllAsync(orderBy: source => source.OrderByDescending(t => t.CreateDate));
         //备忘录结果
         var memos = await work.GetRepository<Memo>().GetAllAsync(orderBy: source => source.OrderByDescending(m => m.CreateDate));

         SummaryDto summary = new SummaryDto();
         summary.Sum = todos.Count();//汇总待办事项数量
         summary.CompletedCount = todos.Where(t => t.Status == 1).Count();//统计待办完成数量
         summary.CompletedRatio = (summary.CompletedCount / (double)summary.Sum).ToString("0%");//统计完成比率,转换成百分比
         summary.MemoeCount = memos.Count();//备忘录总数
         summary.TodoList = new ObservableCollection<ToDoDto>(mapper.Map<List<ToDoDto>>(todos.Where(t => t.Status == 0))); //未完成的待办
         summary.MemoList = new ObservableCollection<MemoDto>(mapper.Map<List<MemoDto>>(memos));
         return new ApiResponse(true, summary);
     }
     catch (Exception ex)
     {
         return new ApiResponse(false,ex.Message);
     }
 }

step3:在MyToDo.Api 项目中,ToDoController 控制器层添加请求方式供外部调用


二.数据接口创建完成后,客户端中去使用该接口

 step1:首先在MyToDo 项目中的Server层,IToDoService 中增加一个汇总接口

step 2:在ToDoService 中实现上面的接口,获取统计汇总的数据


step3:在首页IndexViewModel 中去调用该接口,获取数据

1.首先,创建一个 SummaryDto,去接收调用接口传过来的数据 
        private SummaryDto summaryDto;

        public SummaryDto SummaryDto
        {
            get { return summaryDto; }
            set { summaryDto = value; RaisePropertyChanged(); }
        }
2. 重写导航事件方法 OnNavigatedTo,在该方法中调用汇总接口。拿到数据后赋给当前SummaryDto
public override  void OnNavigatedTo(NavigationContext navigationContext)
{
    GetSummaryAsync();
    base.OnNavigatedTo(navigationContext);
}
/// <summary>
/// 获取汇总数据
/// </summary>
async void GetSummaryAsync()
{
    var summaryResult = await toDoService.SummaryAsync();
    if (summaryResult.Status)
    {
        SummaryDto = summaryResult.Result;
        RefreshBars();
    }
}
 3.修改统计列表数据中的Content赋值。需要动态从接口中获取,并动态赋值。

在TaskBars中的Content属性,要调用实现通知绑定方法 RaisePropertyChanged 

void RefreshBars()
{
    TaskBars[0].Content = summaryDto.Sum.ToString();
    TaskBars[1].Content = summaryDto.CompletedCount.ToString();
    TaskBars[2].Content = summaryDto.CompletedRatio;
    TaskBars[3].Content = summaryDto.MemoeCount.ToString();
}
4.由于SummaryDto 已经拿到待办事项和备忘录的所有数据了,接下来修改整个IndexViewMode,把单独显示ToDoDtos和MemoDtos数据集合全部删掉,改成通过SummaryDto 来获取待办或备忘录数据。并且前端视图也要修改去拿数据的对应数据集合。

IndexViewModel 完整代码

public class IndexViewModel:NavigationViewModel
{
    private readonly IToDoService toDoService;
    private readonly IMemoService memoService;
    public IndexViewModel(IDialogHostService dialogService,IContainerProvider provider):base(provider)
    {
        TaskBars=new ObservableCollection<TaskBar>();
        ExecuteCommand = new DelegateCommand<string>(Execute);
        EditTodoCommand = new DelegateCommand<ToDoDto>(AddTodo);
        EditMemoCommand = new DelegateCommand<MemoDto>(AddMemo);
        ToDoCompltedCommand = new DelegateCommand<ToDoDto>(Complted);
        CreateTaskBars();
        this.toDoService = provider.Resolve<IToDoService>();//取到待办事项接口服务实例
        this.memoService = provider.Resolve<IMemoService>();
        this.dialogService = dialogService;
    }
    public DelegateCommand<ToDoDto> ToDoCompltedCommand {  get; private set; }//完成按钮绑定命令
    public DelegateCommand<ToDoDto> EditTodoCommand { get; private set; } //待办事项双击绑定命令
    public DelegateCommand<MemoDto> EditMemoCommand { get; private set; } //备忘录双击绑定命令
    
    public DelegateCommand<string> ExecuteCommand { get; private set; }
        
    private ObservableCollection<TaskBar> taskBars;

    public ObservableCollection<TaskBar> TaskBars
    {
        get { return taskBars; }
        set { taskBars = value; RaisePropertyChanged(); }
    }
    private readonly IDialogHostService dialogService;
    private SummaryDto summaryDto;
    /// <summary>
    /// 首页统计
    /// </summary>
    public SummaryDto SummaryDto
    {
        get { return summaryDto; }
        set { summaryDto = value; RaisePropertyChanged(); }
    }

    void CreateTaskBars()
    {
        TaskBars.Add(new TaskBar() { Icon="ClockFast",Title="汇总",Color="#FF0CA0FF",Target=""});
        TaskBars.Add(new TaskBar() { Icon = "ClockCheckOutline", Title = "已完成", Color = "#FF1ECA3A", Target = "" });
        TaskBars.Add(new TaskBar() { Icon = "ChartLineVariant", Title = "完成比例", Color = "#FF02C6DC", Target = "" });
        TaskBars.Add(new TaskBar() { Icon = "PlaylistStar", Title = "备忘录", Color = "#FFFFA000", Target = "" });
    }
    void RefreshBars()
    {
        TaskBars[0].Content = summaryDto.Sum.ToString();
        TaskBars[1].Content = summaryDto.CompletedCount.ToString();
        TaskBars[2].Content = summaryDto.CompletedRatio;
        TaskBars[3].Content = summaryDto.MemoeCount.ToString();
    }
    
    public override  void OnNavigatedTo(NavigationContext navigationContext)
    {
        GetSummaryAsync();
        base.OnNavigatedTo(navigationContext);
    }
    /// <summary>
    /// 获取汇总数据
    /// </summary>
    async void GetSummaryAsync()
    {
        var summaryResult = await toDoService.SummaryAsync();
        if (summaryResult.Status)
        {
            SummaryDto = summaryResult.Result;
            RefreshBars();
        }
    }
    private void Execute(string obj)
    {
       switch(obj)
        {
            case "新增备忘录":
                AddMemo();
                break;
            case "新增待办事项":
                AddTodo();
                break;
        }
    }
    async void AddMemo(MemoDto? model =null)
    {
        DialogParameters param = new DialogParameters();
        if (model != null)//如果是编辑
        {
            param.Add("Value",model);//把要编辑的数据传过去
        }
        var dialogMemoResult = await dialogService.ShowDialog("AddMemoView", param, "RootDialog");
        if (dialogMemoResult.Result == ButtonResult.OK)
        {
            UpdateLoading(true);
            var memo = dialogMemoResult.Parameters.GetValue<MemoDto>("Value");//获取到弹窗传过来的值
            if (memo.Id > 0)//编辑
            {
                var updateResult = await memoService.UpdateAsync(memo);
                if (updateResult.Status)//更新成功
                {
                    var memoModel = SummaryDto.MemoList.FirstOrDefault(it => it.Id.Equals(memo.Id));//在界面的数据集合中,找到要更新的那条数据
                    if (memoModel != null)
                    {
                        memoModel.Title = memo.Title;
                        memoModel.Content = memo.Content;
                    }
                }
            }
            else
            {
                //新增
                var addResult = await memoService.AddAsync(memo);
                if (addResult.Status)
                {
                    SummaryDto.MemoList.Add(addResult.Result);//添加到界面的集合中
                }
            }
            GetSummaryAsync();
            UpdateLoading(false);
        }
    }
    async void AddTodo(ToDoDto? model = null)
    {
        DialogParameters param = new DialogParameters();
        if (model != null)//如果是编辑
        {
            param.Add("Value", model);//把要编辑的数据传过去
        }
        var dialogToDoResult = await dialogService.ShowDialog("AddToDoView", param, "RootDialog");
        if (dialogToDoResult.Result == ButtonResult.OK)
        {
            UpdateLoading(true);
            var todo = dialogToDoResult.Parameters.GetValue<ToDoDto>("Value");//获取到弹窗传过来的值
            if (todo.Id > 0)//编辑
            {
               var updateResult=await toDoService.UpdateAsync(todo);
                if(updateResult.Status)//更新成功
                {
                   var todoModel= SummaryDto.TodoList.FirstOrDefault(it => it.Id.Equals(todo.Id));//在界面的数据集合中,找到要更新的那条数据
                    if (todoModel != null)
                    {
                        todoModel.Title = todo.Title;
                        todoModel.Content= todo.Content;
                    }
                }
            }
            else
            {
                //新增
                var addResult = await toDoService.AddAsync(todo);
                if (addResult.Status)
                {
                    SummaryDto.TodoList.Add(addResult.Result);//添加到界面的集合中
                }
            }
            GetSummaryAsync();
            UpdateLoading(false);
        }
    }

    private async void Complted(ToDoDto dto)
    {
       var updateResult=await toDoService.UpdateAsync(dto);//根据传过来的对象进行更新
        if(updateResult.Status)
        {
           var todo= SummaryDto.TodoList.FirstOrDefault(t=>t.Id.Equals(dto.Id));//在界面数据列表中找到这条数据
           if(todo != null)
            {
                SummaryDto.TodoList.Remove(todo);
                GetSummaryAsync();
            }
        }
    }
}

IndexView完整代码

<UserControl x:Class="MyToDo.Views.IndexView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyToDo.Views"
             mc:Ignorable="d" 
             xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
             xmlns:cv="clr-namespace:MyToDo.Common.Converters"
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <cv:IntToBoolConveter x:Key="intToBool"/>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Margin="15,10" FontSize="22" Text="你好,WPF! 今天是2023-11-12 星期天"/>

        <ItemsControl Grid.Row="1" ItemsSource="{Binding TaskBars}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="4"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <!--模板内容设计-->
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border Background="{Binding Color}" CornerRadius="5" Margin="10">
                        <Border.Style>
                            <Style TargetType="Border">
                                <Style.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="Effect">
                                            <Setter.Value>
                                                <DropShadowEffect Color="#DDDDDD" ShadowDepth="1" BlurRadius="10" />
                                            </Setter.Value>
                                        </Setter>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </Border.Style>
                        <Grid>
                            <StackPanel Margin="20,10">
                                <!--图标-->
                                <materialDesign:PackIcon Kind="{Binding Icon}" Width="30" Height="30" />
                                <!--标题文本-->
                                <TextBlock Text="{Binding Title}" Margin="0,15" FontSize="15"/>
                                <!--内容-->
                                <TextBlock Text="{Binding Content}" FontWeight="Bold" FontSize="40"/>
                            </StackPanel>
                            <!--白色背景底色控件-->
                            <Canvas ClipToBounds="True">
                                <Border Canvas.Top="10" CornerRadius="100" Canvas.Right="-50" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/>
                                <Border Canvas.Top="80" CornerRadius="100" Canvas.Right="-30" Width="120" Height="120" Background="#ffffff" Opacity="0.1"/>
                            </Canvas>
                        </Grid>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

        <Grid Grid.Row="2" Margin="0,10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
             
            <!--外边框-->
            <Border Margin="10,0" Background="#BEBEBE" CornerRadius="5" Opacity="0.1"/>
            <Border Grid.Column="1" Margin="10,0" Background="#BEBEBE" CornerRadius="5" Opacity="0.1"/>
            
            <!--主体内容左-->
            <DockPanel Margin="10,0">
                <DockPanel Margin="10,5" LastChildFill="False" DockPanel.Dock="Top">
                    <TextBlock Text="待办事项" FontSize="20" FontWeight="Bold"/>
                    <Button Width="30" Height="30" VerticalAlignment="Top" DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" 
                            Command="{Binding ExecuteCommand}" CommandParameter="新增待办事项">
                        <materialDesign:PackIcon Kind="Add" />
                    </Button>
                </DockPanel>
                <!--数据列表区域-->
                <ListBox x:Name="todoList" ItemsSource="{Binding SummaryDto.TodoList}" ScrollViewer.VerticalScrollBarVisibility="Hidden" HorizontalContentAlignment="Stretch" >
                    <!--鼠标双击-->
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseDoubleClick">
                            <i:InvokeCommandAction  Command="{Binding EditTodoCommand}"
                                                    CommandParameter="{Binding ElementName=todoList,Path=SelectedItem}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <DockPanel MaxHeight="80" LastChildFill="False">
                                <ToggleButton DockPanel.Dock="Right" Command="{Binding DataContext.ToDoCompltedCommand,
                                     RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}" IsChecked="{Binding Status,Converter={StaticResource intToBool}}"
                                              CommandParameter="{Binding}"/>
                                <StackPanel>
                                    <TextBlock Text="{Binding Title}" FontSize="16" FontWeight="Bold"/>
                                    <TextBlock Text="{Binding Content}" Margin="0,5" Opacity="0.5" />
                                </StackPanel>
                            </DockPanel>
                           
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </DockPanel>

            <!--主体内容右-->
            <DockPanel  Grid.Column="1" Margin="10,0">
                <DockPanel Margin="10,5" LastChildFill="False" DockPanel.Dock="Top">
                    <TextBlock Text="备忘录" FontSize="20" FontWeight="Bold"/>
                    <Button Width="30" Height="30" VerticalAlignment="Top" DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" 
                            Command="{Binding ExecuteCommand}" CommandParameter="新增备忘录">
                        <materialDesign:PackIcon Kind="Add" />
                    </Button>
                </DockPanel>
                <!--数据列表区域-->
                <ListBox x:Name="memoList"  ItemsSource="{Binding SummaryDto.MemoList}"  ScrollViewer.VerticalScrollBarVisibility="Hidden" >
                    <!--鼠标双击-->
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseDoubleClick">
                            <i:InvokeCommandAction  Command="{Binding EditMemoCommand}"
                                CommandParameter="{Binding ElementName=memoList,Path=SelectedItem}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel MaxHeight="80">
                                <TextBlock Text="{Binding Title}" FontSize="16" FontWeight="Bold"/>
                                <TextBlock Text="{Binding Content}" Margin="0,5" Opacity="0.5" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </DockPanel>
        </Grid>
    </Grid>
</UserControl>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask+Vue+MySQL天水麻辣烫管理系统设计与实现(附源码 配置 文档)

背景&#xff1a; 同学找到我期望做一个天水麻辣烫的网页&#xff0c;想复用以前做过的课设&#xff0c;结合他的实际需求&#xff0c;让我们来看看这个系统吧~ 项目功能与使用技术概述&#xff1a; 里面嵌入了6个子系统&#xff0c;其中餐饮系统可以进行餐馆信息添加、修改…

【ARFoundation自学03】平面追踪可视化效果美化

对已检测到的平面默认的渲染效果显得有些生硬和突兀&#xff0c;有时我们需要更加友好、美观的的平面虚拟界面&#xff0c;这时就需要对已检测到的平面定制个性化的可视方案。为达到更好的视觉效果&#xff0c;处理的思路如下。 视觉效果前后对比&#xff01; &#xff08;本节…

Android Compose 七:常用组件 Image

1 基本使用 Image(painter painterResource(id R.drawable.ic_wang_lufei), contentDescription "" ) // 图片Spacer(modifier Modifier.height(20.dp))Image(imageVector ImageVector.vectorResource(id R.drawable.ic_android_black_24dp), contentDescript…

Nature 正刊!瑞典于默奥大学研究团队在研究全球河流和溪流的甲烷排放中取得新进展

甲烷(CH4)是一种强有力的温室气体&#xff0c;自工业革命以来&#xff0c;其在大气中的浓度增加了两倍。有证据表明&#xff0c;全球变暖增加了淡水生态系统的 CH4 排放&#xff0c;为全球气候提供了积极的反馈。然而&#xff0c;对于河流和溪流来说&#xff0c;甲烷排放的控制…

618有什么宠物空气净化器推荐?希喂FreAir Lite宠物空气净化器真实体验

一、宠物空气净化器的必要性 掉毛季又来了&#xff0c;猫咪的毛发满天飞&#xff0c;怎么办&#xff1f;我家里的猫咪一到换毛季就掉满地的毛发&#xff0c;尤其喜欢在家里奔跑打闹&#xff0c;结果整个房间都是毛。为了减少家里空气中的浮毛&#xff0c;你都做过哪些努力呢&a…

电脑出现:excel词典(xllex.dll)文件丢失或损坏的错误提示怎么办?有效的将丢失的xllex.dll修复

当遇到 Excel 提示“词典 (xllex.dll) 文件丢失或损坏”的问题时&#xff0c;通常意味着该动态链接库文件&#xff08;Dynamic Link Library&#xff0c;DLL&#xff09;&#xff0c;它与拼写检查功能相关联的&#xff0c;无法被正确找到或者合适地使用。那么有什么办法可以解决…

空间转录组数据的意义

10X空间转录组Visium学习笔记&#xff08;三&#xff09;跑通Visium全流程记录 | 码农家园 (codenong.com) 这两个的区别是&#xff1a;一个是像素的位置信息&#xff0c;一个是阵列的位置信息

第97天:权限提升-Web 权限权限划分源码后台中间件第三方数据库等

前置知识 具体有哪些权限需要我们了解掌握的 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 以上常见权限获取方法简要归类说明 后台权限&#xff1a;SQL 注入,数据库备份泄露&#xff0c;默认或弱口…

设计模型-系统架构师(三)

1、按照《中华人民共和国著作权法》的权利保护期&#xff0c;署名权和修改权 是永久保护的。 发表权、使用权和获取报酬权 保护期限 作者终生和死后的50年。 2、&#xff08;重要&#xff09;面向对象的分析模型主要由 顶层架构图、用例与用例图和&#xff08;&#xff09;构成…

CTF网络安全大赛简单的web抓包题目:HEADache

题目来源于&#xff1a;bugku 题目难度&#xff1a;简单 题目 描  述: > Wanna learn about some types of headache? > Lets dig right into it! 下面是题目源代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"&…

基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善

前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善-CSDN博客 本篇将完善主界面的管理员入库和出库功能&#xff0c;同样的&#xff0c;管理员入库和出库的设计套路适用于动态表的录入和编辑 首先还是介绍一下本项目将要实现的功能 &#xf…

对象解构与迭代器的猫腻?

前言 变量的解构赋值是前端开发中经常用到的一个技巧&#xff0c;比如&#xff1a; // 对象解构 const obj { a: 1, b: 2 }; const { a, b } obj; console.log(a, b)数组解构 const arr [1, 2, 3]; const [a, b] arr; console.log(a, b)工作中我们最经常用的就是类似上面…

【Python安全攻防】【网络安全】一、常见被动信息搜集手段

一、IP查询 原理&#xff1a;通过目标URL查询目标的IP地址。 所需库&#xff1a;socket Python代码示例&#xff1a; import socketip socket.gethostbyname(www.163.com) print(ip)上述代码中&#xff0c;使用gethostbyname函数。该函数位于Python内置的socket库中&#xf…

②单细胞学习-组间及样本细胞比例分析

目录 数据读入 每个样本各细胞比例 两个组间细胞比例 亚组间细胞比例差异分析&#xff08;循环&#xff09; 单个细胞类型亚新间比例差异 ①单细胞学习-数据读取、降维和分群-CSDN博客 比较各个样本间的各类细胞比例或者亚组之间的细胞比例差异 ①数据读入 #各样本细胞…

ubuntu-24.04系统静态Mac和IP配置

操作系统版本&#xff08;桌面版&#xff09;&#xff1a;ubuntu-24.04-desktop-amd64.iso 原因说明&#xff1a;因网络的IP地址和Mac是预分配的&#xff0c;所以ubuntu系统需要修改网卡的mac地址和IP才能访问&#xff0c;网络查了半天资料都没成功&#xff0c;后再界面提示&a…

vue2 案例入门

vue2 案例入门 1 vue环境2 案例2.1 1.v-text v-html2.2 v-bind2.3 v-model2.4 v-on2.5 v-for2.6 v-if和v-show2.7 v-else和v-else-if2.8 计算属性和侦听器2.9 过滤器2.10 组件化2.11 生命周期2.12 使用vue脚手架2.13 引入ElementUI2.13.1 npm方式安装2.13.2 main.js导入element…

BIGO前端CICD平台

本文首发于&#xff1a;https://github.com/bigo-frontend/blog/ 欢迎关注、转载。 我是谁 BIGO前端CICD平台&#xff0c;是一个服务于前端团队的全研发周期管理平台&#xff0c;已经是我们团队日常都要使用的工具了。 该平台实现了一键创建项目、发布编排、新建迭代、checkl…

互联网应用主流框架整合之数据库事务管理

在互联网系统中同时运行着成千上百个线程是十分常见的事情&#xff0c;尤其当一个热门出现时&#xff0c;用户几乎同时打开手机、电脑、平板灯设备进行访问&#xff0c;这样就会导致数据库处在一个多事务访问的环境中&#xff0c;从而引发数据丢失或者数据不一致的现象&#xf…

Java GC问题排查的一些个人总结和问题复盘

个人博客 Java GC问题排查的一些个人总结和问题复盘 | iwts’s blog 是否存在GC问题判断指标 有的比较明显&#xff0c;比如发布上线后内存直接就起飞了&#xff0c;这种也是比较好排查的&#xff0c;也是最多的。如果单纯从优化角度&#xff0c;看当前应用是否需要优化&…

Mowgli用于配对多组学整合

对同一组细胞的多个分子层进行分析逐渐流行。越来越需要能够联合分析这些数据的多视图学习方法。Mowgli是一种支持配对多组学数据的整合方法。值得注意的是&#xff0c;Mowgli将非负矩阵分解和最优传输相结合&#xff0c;同时提高了非负矩阵分解的聚类性能和可解释性。作者将Mo…