当前位置:   article > 正文

WPF 项目开发入门(十)DevExpress 插件+NHibernate 登录实现_devexpress wpf

devexpress wpf

WPF 项目开发入门(一) 安装运行
WPF 项目开发入门(二) WPF 页面布局
WPF 项目开发入门(三)WPF 窗体与页面
WPF 项目开发入门(四) MVVM 模式 与 TreeView树组件
WPF 项目开发入门(五)ListView列表组件 与 Expander组件
WPF 项目开发入门(六)DataGrid组件
WPF 项目开发入门(七) From表单组件
WPF 项目开发入门(八)数据库驱动配置与数据库操作
WPF 项目开发入门(九)数据库连接 NHibernate使用
WPF 项目开发入门(十)DevExpress 插件+NHibernate登录
WPF 项目开发入门(十一)DevExpress 插件 Grid表格应用
WPF开发中最常使用的是DevExpress 插件。下面实现一个DevExpress 插件+NHibernate 操作数据库开发一个简单的用户登录与菜单框架页面功能。

1 项目目录

|---db    数据库业务数据目录
|---page  系统子页面
|---App.xaml  启动设置
|---DXLogin.xaml  登录页面
|---DXMainWindow.xaml  后台框架页面
  • 1
  • 2
  • 3
  • 4
  • 5

项目如果没有驱动,导入NuGet中数据库驱动 Oracle.ManagedDataAccess,FluentNHibernate ,NHibernate 到项目中来。

6.1 登录功能

1 创建用户表

create table SYS_USER(
  USER_ID     NUMBER not null,
  DEPT_ID     NUMBER,
  LOGIN_NAME  NVARCHAR2(30),
  USER_NAME   NVARCHAR2(30),
  PASSWORD    NVARCHAR2(50)
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2 创建表POJO

public class UserMap : ClassMap<SysUserPojo>{
    public UserMap() {
        Table("SYS_USER");//映射表
        //主键设置  
        Id(m => m.userid).Column("USER_ID").GeneratedBy.Assigned();
        Map(m => m.loginname).Column("LOGIN_NAME");
        Map(m => m.name).Column("USER_NAME");
        Map(m => m.password).Column("PASSWORD");
        }
    }
    public class SysUserPojo{
        public virtual int userid { get; set; }
        public virtual string name { get; set; }
        public virtual string password { get; set; }
        public virtual string loginname { get; set; }
        //登录成功与失败判断
        public virtual String mesages { get; set; }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

HOracleDb 类中引入POJO

return FluentNHibernate.Cfg.Fluently.Configure()
 .Database(OracleConfiguration.Oracle10
     ........ 导入 UserMap 配置类
 .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>())
 .BuildSessionFactory();
  • 1
  • 2
  • 3
  • 4
  • 5

3 登录DAO数据库业务类

public class SysLoginDao{
    //用户登录判断
    public SysUserPojo Login(string name,string passwrd) {
        SysUserPojo user=null;
        string sql = "select * from sys_user 
            where LOGIN_NAME='"+ name + "'";
        List<SysUserPojo> ls= HOracleDb
            .FindListSqlObj<SysUserPojo>(sql).ToList();
        if (ls.Any()) {//判断是否查到用户信息
            user=ls[0];
            if (!passwrd.Equals(user.password)) {
                //判断密码,密码错误为 
                user.mesages = "01";
            }
        }
            return user;
    }
    //登录用户信息保存内存中
    public static SysUserPojo getUserPojo =null;
}      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

4 登录页面DXLogin.xaml

<dx:ThemedWindow
    x:Class="JMDJ.DXLogin"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
    xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
    xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"  
    dx:ThemeManager.ThemeName="Office2019Colorful"
    HeaderBackground="DodgerBlue"
    HeaderForeground="White" 
    ResizeMode ="NoResize" ----窗体大小不可变
    Top="250" Left="500"
    Title="登录" Height="170" Width="450">
    <Grid>
        <dxlc:LayoutControl Orientation="Vertical" Width="300" >
            <dxlc:LayoutGroup Orientation="Vertical" >
                <dxlc:LayoutItem Label="名称" >
                    <dxe:TextEdit NullText="请录入用户名称" 
                                  x:Name="name"
                                  Width="150"/>
                </dxlc:LayoutItem>
                <dxlc:LayoutItem Label="密码" >
                    <dxe:PasswordBoxEdit 
                     x:Name="paw"
                     ShowCapsLockWarningToolTip="True"  
                     NullValue="" 
                     NullText="请录入密码信息" Width="150"/>
                </dxlc:LayoutItem>
            </dxlc:LayoutGroup>
            <dxlc:LayoutGroup Orientation="Horizontal" >
                <dxlc:LayoutItem >
                </dxlc:LayoutItem>
                <dxlc:LayoutItem >
                    <dx:SimpleButton Width="100" 
                                     Height="22" 
                                     Content="登录"  
                                     Click="Login_Click" />
                </dxlc:LayoutItem>
            </dxlc:LayoutGroup>
            <dxlc:LayoutGroup Orientation="Horizontal" >
                <dxlc:LayoutItem >
                    <!------错误消息提示-------->
                    <TextBlock TextAlignment="Center" 
                               VerticalAlignment="Center" 
                               FontSize="20" 
                               x:Name="megname" ></TextBlock>
                </dxlc:LayoutItem>
            </dxlc:LayoutGroup>
        </dxlc:LayoutControl>
    </Grid>
</dx:ThemedWindow>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

5 DXLogin.CS 登录业务

public partial class DXLogin : ThemedWindow{
    public DXLogin(){
        InitializeComponent();
    }
    //登录数据库业务类
    SysLoginDao dao = new SysLoginDao();
    //登录数据模型
    SysUserPojo user = null;
    //登录事件
    private void Login_Click(object sender, RoutedEventArgs e){
            OnLogin();//业务判断
    }
    private void OnLogin() {
        try{
            //用户名称与密码验证
            user = dao.Login(name.Text, paw.Text);
        } catch (Exception eg){
            //判断数据库操作是否正确
            megname.Text = "数据库连接失败(联系管理员)";
            return;
        }
        //判断用户是否正确
        if (user == null){
                megname.Text = "用户名称错误";
        } else{
            //判断密码是否正确
            if ("01".Equals(user.mesages)){
                megname.Text = "用户密码错误";
            }else{
                SysLoginDao.getUserPojo = user;//登录用户信息保存内存中
                DXMainWindow win = new DXMainWindow();
                win.Show();
                this.Close();
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

在这里插入图片描述

6.2 菜单框架

用户登录成功之后查询数据库中的菜单表,获得系统菜单信息内容。

1 创建菜单表

create table SYS_MENU(
  MUID    NUMBER,
  PMUID   NUMBER,
  NAME    VARCHAR2(200),
  IS_DEL  VARCHAR2(1),
  WPF_URL VARCHAR2(300),
  WEB_URL VARCHAR2(300),
  WPF_IMG VARCHAR2(300)
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2 创建表POJO

public class SysMenuMap : ClassMap<SysMenuPojo>{
    public SysMenuMap(){
            Table("SYS_MENU");//映射表
            Id(m => m.MUID).Column("MUID")
                .GeneratedBy.Assigned();//主键设置  
            Map(m => m.PMUID).Column("PMUID");
            Map(m => m.NAME).Column("NAME");
            Map(m => m.IS_DEL).Column("IS_DEL");
            Map(m => m.WPF_URL).Column("WPF_URL");
            Map(m => m.WEB_URL).Column("WEB_URL");
        }
}
public class SysMenuPojo{
        public virtual int MUID { get; set; }
        public virtual int PMUID { get; set; }
        public virtual string NAME { get; set; }
        public virtual string IS_DEL { get; set; }
        public virtual string WPF_URL { get; set; }
        public virtual string WEB_URL { get; set; }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

HOracleDb 类中引入POJO

return FluentNHibernate.Cfg.Fluently.Configure()
.......
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<SysMenuMap>())
.BuildSessionFactory();
  • 1
  • 2
  • 3
  • 4

3 菜单生成数据库业务类

public class SysLoginDao{
    public List<SysMenuPojo> getUserMeut() {
        string sql = "select * from sys_menu where IS_DEL=0";
        return  HOracleDb
            .FindListSqlObj<SysMenuPojo>(sql)
            .ToList();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4 菜单架构DXMainWindow.xaml

<dx:ThemedWindow
    x:Class="JMDJ.DXMainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
    xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
    xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
    xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
    xmlns:dxa="http://schemas.devexpress.com/winfx/2008/xaml/accordion"  
    xmlns:dxwui="http://schemas.devexpress.com/winfx/2008/xaml/windowsui" 
    xmlns:dxwuin="http://schemas.devexpress.com/winfx/2008/xaml/windowsui/navigation"
    xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
    dx:ThemeManager.ThemeName="Office2019Colorful"
    HeaderBackground="#FF2A8AD4"
    HeaderForeground="White"
    Title="系统架构">
<Grid>
<dxlc:DockLayoutControl>
            <dxlc:GroupBox 
            dxlc:DockLayoutControl.Dock="Top" Height="50" >
            </dxlc:GroupBox>
<dxg:TreeViewControl x:Name="usermenu"----菜单组件
  dxlc:DockLayoutControl.Dock="Left" 
    Width="170" FontSize="13"
    TreeDerivationMode="Selfreference" 
    KeyFieldName="MUID" 
    ParentFieldName="PMUID" 
    TreeViewFieldName="NAME" 
   SelectedItemChanged="usermenu_SelectedItemChanged">----菜单事件
</dxg:TreeViewControl>
<dxwui:NavigationFrame      ----业务页面组件
   dxlc:DockLayoutControl.Dock="Client"
   x:Name="zhttFrame"  
    AnimationType="SlideHorizontal" 
    NavigationCacheMode="Required">
    <dxmvvm:Interaction.Behaviors>
        <dxwuin:FrameNavigationService />
    </dxmvvm:Interaction.Behaviors>
    </dxwui:NavigationFrame>
    </dxlc:DockLayoutControl>
    </Grid>
</dx:ThemedWindow>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

5 菜单架构DXMainWindow.CS业务类

public partial class DXMainWindow : ThemedWindow{
    SysLoginDao dao=new SysLoginDao();
    public DXMainWindow(){
        InitializeComponent();
        Window_Loaded();// 初始化设置全屏
        //菜单数据生成组件
        usermenu.ItemsSource = dao.getUserMeut();
    }
    // 设置全屏
    private void Window_Loaded(){
        // 设置全屏
        this.Left = 0.0;
        this.Top = 0.0;
        this.Width = System.Windows.SystemParameters.PrimaryScreenWidth;
        this.Height = System.Windows.SystemParameters.PrimaryScreenHeight;
    }
    //菜单点击事件
    private void usermenu_SelectedItemChanged(
        object sender,
        DevExpress.Xpf.Grid.SelectedItemChangedEventArgs e){
        SysMenuPojo meu=e.NewItem as SysMenuPojo;
        if (meu!=null&& meu.WPF_URL!=null) {
            //动态创建视图页面 例如:视图地址JMDJ.page.scgl.page1
            Type type = Type.GetType(meu.WPF_URL);
            object ojb = type.Assembly.CreateInstance(meu.WPF_URL);
            zhttFrame.Content = ojb;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

在这里插入图片描述

7 用户管理页面

在page 目录中创建用户管理视图页面,生成user.xaml与对应的user.cs业务代码。业务逻辑完成用户表的查询,添加,删除功能。

sys_menu表中加入菜单信息内容,并将它的路径和程序地址关联。

MUID PMUID NAME WPF_URL

10000 0 系统管理 0

10001 10000 用户管理 JMDJ.page.user

user.xaml页面

<UserControl 
     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:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
     xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
     xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
     xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
     xmlns:dxa="http://schemas.devexpress.com/winfx/2008/xaml/accordion"  
     xmlns:dxwui="http://schemas.devexpress.com/winfx/2008/xaml/windowsui" 
     xmlns:dxwuin="http://schemas.devexpress.com/winfx/2008/xaml/windowsui/navigation"
     xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
    mc:Ignorable="d"
             d:DesignHeight="1000" d:DesignWidth="800">
    <!---------------   提示消息设置  -------------------->
    <UserControl.Resources>
        <DataTemplate x:Key="CustomNotificationTemplate">
            <Border Background="DarkBlue" 
                    BorderThickness="1" BorderBrush="Black">
                <StackPanel Orientation="Vertical" 
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch">
                    <TextBlock HorizontalAlignment="Center" Text="{Binding}" 
                               Foreground="LightGray" FontSize="16" 
                               Margin="3" FontFamily="SegoeUI"/>
                </StackPanel>
            </Border>
        </DataTemplate>
    </UserControl.Resources>
    <dxmvvm:Interaction.Behaviors>
 <!---------------   通知框  -------------------->        
 <dxwuin:FrameNavigationService x:Name="usermenu" />
        <dxmvvm:NotificationService 
        x:Name="ServiceWithCustomNotifications"  
       CustomNotificationTemplate="{StaticResource CustomNotificationTemplate}"/>
 </dxmvvm:Interaction.Behaviors>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="90" />
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <dxlc:FlowLayoutControl Orientation="Vertical" 
               Background="#FF2A8AD4" 
               BreakFlowToFit="True"  Grid.Row="0">
            <TextBlock Text="用户管理" FontSize="18" 
               oreground="#ffffff"/>
        </dxlc:FlowLayoutControl>
   <!---------------   添加用户布局  -------------------->  
  <dxlc:LayoutControl VerticalAlignment="Stretch" 
                    Orientation="Vertical" 
                    Grid.Row="1" 
                    x:Name="userFrom">-------绑定后台的用户数据模型
      <dxlc:LayoutGroup Orientation="Horizontal" >
          <dxlc:LayoutGroup Orientation="Vertical">
              <dxlc:LayoutGroup Orientation="Horizontal"
                                VerticalAlignment="Top" 
                                x:Name="imageGroup" 
                                Margin="5">
                  <dxlc:LayoutItem Label="用户名称" 
                                   AddColonToLabel="True">
                      <dxe:TextEdit Text="{Binding name}"/>
                  </dxlc:LayoutItem>
                  <dxlc:LayoutItem Label="登录名称" A
                                   ddColonToLabel="True">
                      <dxe:TextEdit Text="{Binding loginname}" />
                  </dxlc:LayoutItem>
                  <dxlc:LayoutItem Label="密码" 
                                   AddColonToLabel="True">
                      <dxe:TextEdit Text="{Binding password}" />
                  </dxlc:LayoutItem>
                  <dxlc:LayoutItem Width="300">
                  </dxlc:LayoutItem>
                    </dxlc:LayoutGroup>
              <dxlc:LayoutGroup Orientation="Horizontal" >
                  <dx:SimpleButton Width="100" Height="22" 
                                   Content="添加"
                                   Click="OnSave_Click" />---添加事件
              </dxlc:LayoutGroup>
          </dxlc:LayoutGroup>
      </dxlc:LayoutGroup>
 </dxlc:LayoutControl>
 <!---------------   列表部分  -------------------->   
<dxg:GridControl  Grid.Row="2" x:Name="usergird">
    <dxg:GridControl.View>
        <dxg:TableView AutoWidth="True"
                       ShowGroupPanel="False"/>
    </dxg:GridControl.View>
    <dxg:GridColumn FieldName="name" IsSmart="True"  Header="用户名称" />
    <dxg:GridColumn FieldName="loginname" IsSmart="True" Header="登录名称"/>
    <dxg:GridColumn FieldName="password" IsSmart="True"  Header="密码" />
    <dxg:GridColumn  Header="操作" >
        <dxg:GridColumn.CellTemplate >
            <DataTemplate >
                <StackPanel 
                  Orientation="Horizontal" 
                   HorizontalAlignment="Center" >
                    <Button Content="删除" Click="OnDel_Click">----删除功能
                    </Button>
                </StackPanel>
            </DataTemplate>
        </dxg:GridColumn.CellTemplate>
    </dxg:GridColumn>
</dxg:GridControl>
 </Grid>
</UserControl>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

user.xaml业务代码

public partial class user : UserControl{
    SysUserPojo userpojo = new SysUserPojo();
    public Scgl_sb_wl01list(){
        InitializeComponent();
        //添加组件引入数据模块
        userFrom.DataContext = userpojo;
        //列表组件引入数据模块
        usergird.ItemsSource = FindList();
    }
    //添加用户信息到SYS_USER表中
    private void OnSave_Click(object sender, 
                              RoutedEventArgs e) {
        if (userpojo!=null) {
            //添加数据
            HOracleDb.Save<SysUserPojo>(userpojo);
            ServiceWithCustomNotifications
                .CreateCustomNotification("成功").ShowAsync();
            usergird.ItemsSource = FindList();
            //刷新列表
            usergird.RefreshData();
        }
}
   //删除用户信心
    private void OnDel_Click(object sender, 
                             RoutedEventArgs e){
        //获得表列中选中的信息内容
        SysUserPojo up = usergird
            .SelectedItem as SysUserPojo;
            if (up == null) {
                return;
            }
        //删除提升框
        MessageBoxResult result = 
            WinUIMessageBox.Show(messageBoxText: "是否要删除数据信息",
                                 caption: "提示信息", 
                                 button: MessageBoxButton.YesNo);
            if (result == MessageBoxResult.Yes){
                //删除信息
                HOracleDb.Delete<SysUserPojo>(up);
                ServiceWithCustomNotifications
                    .CreateCustomNotification("删除成功").ShowAsync();
                usergird.ItemsSource = FindList();
                //刷新列表
                usergird.RefreshData();
            }
        }
  	   //查询用户表
        public List<SysUserPojo> FindList() {
             return HOracleDb
                 .FindListSqlObj<SysUserPojo>(
                 "select * from sys_user order by user_id desc")
                 .ToList();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/825871
推荐阅读
相关标签
  

闽ICP备14008679号