WPF中如何简单的使用MvvmLight创建一个项目并进行 增删改查

目录

第一步:创建项目后下载如下两个NuGet程序包,然后删除删掉using Microsoft.Practices.ServiceLocation; 并且引入using CommonServiceLocator;

 第二步:删除原来的XAML文件并创建如下的包结构然后创建一个在View文件夹中创建一个Main窗体   再将App.XAML中的StartupUri修改为View/Main.xaml

 第三步:创建Model层中的文件UserInfo和Todo

 UserInfo的类如下:

 Todo的类如下:

 第四步:创建Service层IUserInfoService接口和ITodoService接口

IUserInfoService接口如下:

ITodoService接口如下:

 第五步:配置连接字符串 并将连接的内容封装到Tool文件夹中的ConstHelper

 ConstHelper类如下:

第六步:在ServiceImpl文件夹实现Service层中的接口

UserInfoService类如下:

TodoService类如下:

第七步:在View文件夹中创建Login.XAML文件 并将App.XAML文件进行修改

1.将StartupUri删除

2.添加 ShutdownMode="OnExplicitShutdown"和Startup="Application_Startup"

3.在App.xaml.cs中写如下代码:

第8步:在Tool文件夹中创建LoginInfo在ViewModel文件夹中创建LoginViewModel

LoginInfo类如下:

LoginViewModel类如下:

第九步:将页面和类放入Ioc容器中并设计将View文件夹中

ViewModelLocator类如下:

Login.XAML中的内容如下:

第十步:将View文件中的Main.XAML写好  然后写好ViewModel中的MainViewModel 最后创建两个UC

1.Main.XAML如下:

2.MainViewModel如下:

3.创建两个Contorls

UCUserInfo如下:

UCTodo如下:

最后的效果如下:

登录界面:

点击登录后进入Main窗体:

点击任务管理后:


第一步:创建项目后下载如下两个NuGet程序包,然后删除删掉using Microsoft.Practices.ServiceLocation; 并且引入using CommonServiceLocator;

 

 第二步:删除原来的XAML文件并创建如下的包结构然后创建一个在View文件夹中创建一个Main窗体   再将App.XAML中的StartupUri修改为View/Main.xaml

 

 第三步:创建Model层中的文件UserInfo和Todo

 UserInfo的类如下:

using GalaSoft.MvvmLight;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;namespace WPF练习12简单的项目.Model
{public class UserInfo : ObservableObject{[Key]public int UserId { get; set; }[Required(ErrorMessage = "账号必填")][Column(TypeName = "varchar(50)")]public string Account { get; set; }[Required(ErrorMessage = "密码必填")][Column(TypeName = "varchar(50)")]public string Pwd { get; set; }}
}

 Todo的类如下:

using GalaSoft.MvvmLight;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;namespace WPF练习12简单的项目.Model
{public class Todo:ObservableObject{[Key]public int TodoId { get; set; }[Required(ErrorMessage = "任务标题必填")][Column(TypeName = "varchar(50)")]public string Title { get; set; }[Column(TypeName = "varchar(150)")]public string Detail { get; set; }[Required(ErrorMessage = "是否完成必填")][Column(TypeName = "bit")]public bool IsCompleted { get; set; } = false;[Required(ErrorMessage = "创建人Id必填")][Column(TypeName = "int")]public int CreateUserId { get; set; }[Required(ErrorMessage = "创建日期必填")][Column(TypeName = "datetime")]public DateTime CreateTime { get; set; } = DateTime.Now;}
}

 第四步:创建Service层IUserInfoService接口和ITodoService接口

IUserInfoService接口如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF练习12简单的项目.Model;namespace WPF练习12简单的项目.Service
{public interface IUserInfoService{bool Add(UserInfo model);bool Delete(int id);bool Update(UserInfo model);List<UserInfo> GetList(string strWhere);List<UserInfo> GetListByPage(string strWhere, string orderBy, int startIndex, int endIndex);UserInfo GetModel(int id);}
}

ITodoService接口如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF练习12简单的项目.Model;namespace WPF练习12简单的项目.Service
{public interface ITodoService{bool Add(Todo model);bool Delete(int id);bool Update(Todo model);List<Todo> GetList(string strWhere);List<Todo> GetListByPage(string strWhere, string orderBy, int startIndex, int endIndex);int GetCount(string strWhere);Todo GetModel(int id);}
}

 第五步:配置连接字符串 并将连接的内容封装到Tool文件夹中的ConstHelper

 

 ConstHelper类如下:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WPF练习12简单的项目.Tool
{public static class ConstHelper{public static string ConnectionString { get; } = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;}
}

第六步:在ServiceImpl文件夹实现Service层中的接口

UserInfoService类如下:

using Dapper;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF练习12简单的项目.Model;
using WPF练习12简单的项目.Service;
using WPF练习12简单的项目.Tool;namespace WPF练习12简单的项目.ServiceImpl
{public class UserInfoService:IUserInfoService{public bool Add(UserInfo model){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "INSERT INTO UserInfo(Account, Pwd) VALUES (@Account, @Pwd)";return conn.Execute(sql, model) > 0;}}public bool Delete(int id){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "DELETE FROM UserInfo WHERE UserId=@UserId";var paramter = new { UserId = id };return conn.Execute(sql, paramter) > 0;}}public List<UserInfo> GetList(string strWhere){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "SELECT UserId, Account, Pwd FROM UserInfo WHERE 1=1 ";if (!string.IsNullOrEmpty(strWhere)) sql += $" AND {strWhere}";return conn.Query<UserInfo>(sql).ToList();}}public List<UserInfo> GetListByPage(string strWhere, string orderBy, int startIndex, int endIndex){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();StringBuilder sql = new StringBuilder();sql.Append("SELECT * FROM ( ");sql.Append(" SELECT ROW_NUMBER() OVER (");if (!string.IsNullOrEmpty(orderBy.Trim()))sql.Append("ORDER BY T." + orderBy);elsesql.Append("ORDER BY T.UserId DESC");sql.Append(")AS Row, T.*  FROM [User] T ");if (!string.IsNullOrEmpty(strWhere.Trim())){sql.Append(" WHERE " + strWhere);}sql.Append(" ) TT");sql.AppendFormat(" WHERE TT.Row BETWEEN {0} AND {1}", startIndex, endIndex);return conn.Query<UserInfo>(sql.ToString()).ToList();}}public UserInfo GetModel(int id){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "SELECT UserId, Account, Pwd FROM UserInfo WHERE UserId=@UserId";var parameter = new { UserId = id };return conn.QueryFirstOrDefault<UserInfo>(sql, parameter);}}public bool Update(UserInfo model){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "UPDATE UserInfo SET Account=@Account, Pwd=@Pwd WHERE UserId=@UserId";return conn.Execute(sql, model) > 0;}}}
}

TodoService类如下:

using Dapper;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF练习12简单的项目.Model;
using WPF练习12简单的项目.Service;
using WPF练习12简单的项目.Tool;namespace WPF练习12简单的项目.ServiceImpl
{public class TodoService : ITodoService{public bool Add(Todo model){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "INSERT INTO [Todo](Title, Detail, IsCompleted, CreateUserId, CreateTime) VALUES (@Title, @Detail, @IsCompleted, @CreateUserId, @CreateTime)";return conn.Execute(sql, model) > 0;}}public bool Delete(int id){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "DELETE FROM [Todo] WHERE TodoId=@TodoId";var paramter = new { TodoId = id };return conn.Execute(sql, paramter) > 0;}}public List<Todo> GetList(string strWhere){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "SELECT TodoId, Title, Detail, IsCompleted, CreateUserId, CreateUserName, CreateTime FROM [TodoView] WHERE 1=1 ";if (!string.IsNullOrEmpty(strWhere)) sql += $" AND {strWhere}";return conn.Query<Todo>(sql).ToList();}}public List<Todo> GetListByPage(string strWhere, string orderBy, int startIndex, int endIndex){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();StringBuilder sql = new StringBuilder();sql.Append("SELECT * FROM ( ");sql.Append(" SELECT ROW_NUMBER() OVER (");if (!string.IsNullOrEmpty(orderBy.Trim()))sql.Append("ORDER BY T." + orderBy);elsesql.Append("ORDER BY T.TodoId DESC");sql.Append(")AS Row, T.*  FROM [TodoView] T ");if (!string.IsNullOrEmpty(strWhere.Trim())){sql.Append(" WHERE " + strWhere);}sql.Append(" ) TT");sql.AppendFormat(" WHERE TT.Row BETWEEN {0} AND {1}", startIndex, endIndex);return conn.Query<Todo>(sql.ToString()).ToList();}}public int GetCount(string strWhere){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "SELECT COUNT(TodoId) FROM [Todo] WHERE 1=1 ";if (!string.IsNullOrEmpty(strWhere)) sql += $" AND {strWhere}";return conn.ExecuteScalar<int>(sql);}}public Model.Todo GetModel(int id){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "SELECT TodoId, Title, Detail, IsCompleted, CreateUserId, CreateTime FROM [Todo] WHERE TodoId=@TodoId";var parameter = new { TodoId = id };return conn.QueryFirstOrDefault<Model.Todo>(sql, parameter);}}public bool Update(Model.Todo model){using (var conn = new SqlConnection(ConstHelper.ConnectionString)){conn.Open();var sql = "UPDATE [Todo] SET Title=@Title, Detail=@Detail, IsCompleted=@IsCompleted, CreateUserId=@CreateUserId, CreateTime=@CreateTime WHERE TodoId=@TodoId";return conn.Execute(sql, model) > 0;}}}
}

第七步:在View文件夹中创建Login.XAML文件 并将App.XAML文件进行修改

1.将StartupUri删除

2.添加 ShutdownMode="OnExplicitShutdown"和Startup="Application_Startup"

3.在App.xaml.cs中写如下代码:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using WPF练习12简单的项目.View;namespace WPF练习12简单的项目
{/// <summary>/// App.xaml 的交互逻辑/// </summary>public partial class App : Application{private void Application_Startup(object sender, StartupEventArgs e){Login loginWindow = new Login();bool? result = loginWindow.ShowDialog();if (result == true){Main main = new Main();main.ShowDialog();}}}
}

第8步:在Tool文件夹中创建LoginInfo在ViewModel文件夹中创建LoginViewModel

LoginInfo类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF练习12简单的项目.Model;namespace WPF练习12简单的项目.Tool
{public static class LoginInfo{public static UserInfo CurrentUser { get; set; }}
}

LoginViewModel类如下:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using WPF练习12简单的项目.Model;
using WPF练习12简单的项目.Service;
using WPF练习12简单的项目.Tool;
using WPF练习12简单的项目.View;namespace WPF练习12简单的项目.ViewModel
{public class LoginViewModel: ViewModelBase{private readonly IUserInfoService userService;public LoginViewModel(IUserInfoService userService){this.userService = userService;}private UserInfo user = new UserInfo();public UserInfo User{get { return user; }set { user = value; RaisePropertyChanged(); }}public RelayCommand<Login> LoginCommand{get{return new RelayCommand<Login>((Login win) =>{Button btnLogin = win.FindName("btnLogin") as Button;btnLogin.Focus();List<UserInfo> list = this.userService.GetList($" Account='{User.Account}' AND Pwd='{User.Pwd}'");if (list.Count == 0){MessageBox.Show("账号或密码有误!", "错误", MessageBoxButton.OK, MessageBoxImage.Error);return;}if (list.Count > 1){MessageBox.Show("账号重复,请联系管理员!", "错误", MessageBoxButton.OK, MessageBoxImage.Error);return;}LoginInfo.CurrentUser = list[0];win.DialogResult = true;});}}}
}

第九步:将页面和类放入Ioc容器中并设计将View文件夹中

ViewModelLocator类如下:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using CommonServiceLocator;
using WPF练习简单的项目12.ViewModel;
using WPF练习12简单的项目.Service;
using WPF练习12简单的项目.ServiceImpl;namespace WPF练习12简单的项目.ViewModel
{/// <summary>/// This class contains static references to all the view models in the/// application and provides an entry point for the bindings./// </summary>public class ViewModelLocator{/// <summary>/// Initializes a new instance of the ViewModelLocator class./// </summary>public ViewModelLocator(){ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);// 注册是窗体的视图模型SimpleIoc.Default.Register<LoginViewModel>();SimpleIoc.Default.Register<MainViewModel>();// 注册是用户控件的视图模型//SimpleIoc.Default.Register<UCUserViewModel>();//SimpleIoc.Default.Register<UCTodoViewModel>();//SimpleIoc.Default.Register<UCPagerViewModel>();// 注册其他服务SimpleIoc.Default.Register<IUserInfoService, UserInfoService>();SimpleIoc.Default.Register<ITodoService, TodoService>();}public MainViewModel Main{get{return ServiceLocator.Current.GetInstance<MainViewModel>();}}public LoginViewModel Login{get { return ServiceLocator.Current.GetInstance<LoginViewModel>(); }}public static void Cleanup(){// TODO Clear the ViewModels}}
}

Login.XAML中的内容如下:

<Window x:Class="WPF练习12简单的项目.View.Login"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPF练习12简单的项目.View"xmlns:viewmodel="clr-namespace:WPF练习12简单的项目.ViewModel"d:DataContext="{d:DesignInstance Type=viewmodel:LoginViewModel}"DataContext="{Binding Source={StaticResource Locator}, Path=Login}"FocusManager.FocusedElement="{Binding ElementName=txtAccount}"WindowStartupLocation="CenterScreen"mc:Ignorable="d"Title="Login"Height="250"Width="400"><Grid HorizontalAlignment="Center"VerticalAlignment="Center"><StackPanel><WrapPanel Margin="0,0,0,10"><Label Content="账号:" /><TextBox Name="txtAccount"Width="120"Height="30"Padding="5,0,0,0"VerticalContentAlignment="Center"Text="{Binding UserInfo.Account}" /></WrapPanel><WrapPanel Margin="0,0,0,10"><Label Content="密码:" /><TextBox Width="120"Height="30"Padding="5,0,0,0"VerticalContentAlignment="Center"Text="{Binding UserInfo.Pwd}" /></WrapPanel><WrapPanel Margin="0,0,0,10"HorizontalAlignment="Center"><Button Name="btnLogin"Width="80"Height="30"Command="{Binding LoginCommand}"CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"Content="登录"IsDefault="True" /></WrapPanel></StackPanel></Grid>
</Window>

第十步:将View文件中的Main.XAML写好  然后写好ViewModel中的MainViewModel 最后创建两个UC

1.Main.XAML如下:

<Window x:Class="WPF练习12简单的项目.View.Main"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPF练习12简单的项目.View"xmlns:viewmodel="clr-namespace:WPF练习简单的项目12.ViewModel"d:DataContext="{d:DesignInstance Type=viewmodel:MainViewModel}"DataContext="{Binding Source={StaticResource Locator}, Path=Main}"mc:Ignorable="d"Title="Main" Height="450" Width="800"><Grid><Grid.RowDefinitions><RowDefinition Height="60" /><RowDefinition /></Grid.RowDefinitions><Grid VerticalAlignment="Center"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition Width="200" /></Grid.ColumnDefinitions><TextBlock Margin="10,0"VerticalAlignment="Center"FontSize="20"Text="任务列表管理MVVMLIGHT小案例" /><WrapPanel Grid.Column="1"HorizontalAlignment="Right"><TextBlock VerticalAlignment="Center"Text="当前用户:" /><TextBlock VerticalAlignment="Center"Text="{Binding CurrentUser.Account}" /><Button Width="80"Height="30"Margin="10,0"Command="{Binding LogoutCommand}"Content="退出" /></WrapPanel></Grid><Grid Grid.Row="1"><Grid.ColumnDefinitions><ColumnDefinition Width="160" /><ColumnDefinition /></Grid.ColumnDefinitions><StackPanel><Button Height="30"Margin="0,0,0,10"Command="{Binding ToggleCommand}"CommandParameter="user"Content="用户管理" /><Button Height="30"Margin="0,0,0,10"Command="{Binding ToggleCommand}"CommandParameter="todo"Content="任务管理" /></StackPanel><!--  ContentControl内容控件:充当一个控件容器,可以把UserControl.xaml放到此处,但不能放Page.xaml和Window.xaml文件。  --><ContentControl Grid.Column="1"Margin="10,0"Content="{Binding CurrentUserControl}" /></Grid></Grid>
</Window>

2.MainViewModel如下:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System.Windows;
using System.Windows.Controls;
using WPF练习12简单的项目.Contorls;
using WPF练习12简单的项目.Model;
using WPF练习12简单的项目.Tool;namespace WPF练习简单的项目12.ViewModel
{/// <summary>/// This class contains properties that the main View can data bind to./// <para>/// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel./// </para>/// <para>/// You can also use Blend to data bind with the tool's support./// </para>/// <para>/// See http://www.galasoft.ch/mvvm/// </para>/// </summary>public class MainViewModel : ViewModelBase{public MainViewModel(){currentUser = LoginInfo.CurrentUser;}private UserInfo currentUser;public UserInfo CurrentUser{get { return currentUser; }set { currentUser = value; RaisePropertyChanged(); }}private UserControl currentUserControl = new UCUserInfo();public UserControl CurrentUserControl{get { return currentUserControl; }set { currentUserControl = value; RaisePropertyChanged(); }}public RelayCommand<string> ToggleCommand{get{return new RelayCommand<string>((str) =>{switch (str){case "user":CurrentUserControl = new UCUserInfo();break;case "todo":CurrentUserControl = new UCTodo();break;default:CurrentUserControl = new UCUserInfo();break;}});}}public RelayCommand LogoutCommand{get{return new RelayCommand(() =>{Application.Current.Shutdown();});}}}
}

3.创建两个Contorls

UCUserInfo如下:

<UserControl x:Class="WPF练习12简单的项目.Contorls.UCUserInfo"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:WPF练习12简单的项目.Contorls"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid Background="White"><TextBlock Text="200" /></Grid>
</UserControl>
UCTodo如下:
<UserControl x:Class="WPF练习12简单的项目.Contorls.UCTodo"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:WPF练习12简单的项目.Contorls"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid Background="White"><TextBlock Text="100" /></Grid>
</UserControl>

最后的效果如下:

登录界面:

点击登录后进入Main窗体:

点击任务管理后:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ssm校园媒体信息发布系统—计算机毕业设计源码42272

目 录 摘要 1 绪论 1.1研究背景与意义 1.2国内外研究现状 1.3研究内容 1.4 ssm框架介绍 1.5论文结构与章节安排 2 校园媒体信息发布系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十一章 制作Ubuntu文件系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

【数据结构】线性表——链表

写在前面 本篇笔记记录线性表——链表的主要形式&#xff0c;虽然链表有8种形式&#xff0c;但是只要精通笔记中编写的两种&#xff0c;即可触类旁通。 文章目录 写在前面一、链表的概念及结构二、链表的分类三、无头单向非循环链表3.1、链表的实现3.1.1、链表的结构体定义3.1…

Java:168 springboot小区团购管理

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 ​ 系统有管理员&#xff0c;用户两个角色。 主要的功能有用户信息管理、商品信息管理、商品类型管理、商品订单管理、公告信息管理、公告类型管理 …

CSS如何改变滚动条的颜色样式粗细?

默认滚动条很丑怎么办&#xff1f;如何改版滚动条的粗细&#xff0c;颜色&#xff0c;让它更美观&#xff1f;CSS如何改变滚动条的粗细&#xff1f; 干货来了 /* Webkit内核浏览器的滚动条样式 */ ::-webkit-scrollbar {width: 4px; /* 设置滚动条的宽度 */ }::-webkit-scroll…

idea连接docker并构建镜像

安装docker 安装docker idea连接docker 安装docker插件 设置docker连接 设置docker.exe 这个docker.exe是为了运行docker&#xff0c;可以通过安装docker desktop获取 docker desktop下载地址 右键图标找到文件位置 在同级的resource中 编写Dockerfile # 使用官方 Nginx…

你竟然赶我走

目录 解题思路 题目设计原理 总结 解题思路 拿到图看属性没问题&#xff0c;格式是 jpg 的&#xff0c;但是这张图片肯定不简单。 文件分离不出东西。 使用 stegsolve 打开&#xff0c;使用文件格式分析功能&#xff0c;拉到最底下&#xff0c;flag 浮出水面。好吧&#xff…

ssm065基于JAVA WEB技术大健康综合咨询问诊平台的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;健康综合咨询问诊平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本健康综合咨询…

masm汇编字符输入换行输出演示

从键盘读取一个字符并换行输出 assume cs:codecode segmentstart:mov ah, 1int 21hmov bl, almov dl, 10 mov ah, 2int 21h mov dl, blmov ah, 2int 21hmov ah, 4chint 21hcode ends end start 效果演示&#xff1a;

设备管理网关(golang版本)

硬件设备&#xff1a;移远EC200A-CN LTE Cat 4 无线通信模块 操作系统&#xff1a;openwrt 技术选型&#xff1a;layui golang sqlite websocket 工程结构 界面展示 区域管理 设备管理 运行监控 系统参数 资源文件 版本信息

变电站接地电阻监测装置-输电铁塔接地电阻监测装置:实时监测,预防故障

变电站接地电阻监测装置 接地电阻对电力系统的安全和稳定性至关重要&#xff0c;但在高压环境和极端气候下&#xff0c;接地系统可能出现性能下降&#xff0c;增加故障和跳闸的风险。传统的人工检测方法常常无法及时发现这些问题&#xff0c;并且操作繁琐。为此&#xff0c;我…

【ArcGIS】绘制各省碳排放分布的中国地图

首先&#xff0c;准备好各省、自治区、直辖市及特别行政区&#xff08;包括九段线&#xff09;的shp文件&#xff1a; 通过百度网盘分享的文件&#xff1a;GS&#xff08;2022&#xff09;1873 链接&#xff1a;https://pan.baidu.com/s/1wq8-XM99LXG_P8q-jNgPJA 提取码&#…

maven plugin:在自定义插件中获取当前项目的依赖库列表

我的项目中需要在自定义maven插件中调用javadoc获取java源码的注释,就需要为了javadoc能正常解析源码,还需要源码所在项目的依赖库列表(java 9以上版本的javadoc这是必须的)作为-classpath. 方案一:dependency:build-classpath 如果在项目安装(install)阶段(phase),这个参数通…

linux基础2

声明 学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一&#xff0c;linux目录简介 1&#xff0c;根目录&#xff08;/&#xff09; 根目录是Linux文件系统的…

Leecode热题100-78.子集

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集 &#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2]…

【NRM】npm镜像源地址管理

【NRM】npm镜像源地址管理 1.背景 因为公司有npm内网源地址&#xff0c;很多外网依赖拉取很慢。使用nrm管理npm的源地址&#xff0c;更方便切换使用 2.NRM是什么 nrm(npm registry manager&#xff0c;nrm )是npm的镜像源管理工具&#xff0c;有时候国外资源太慢&#xff0…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

C语言复习第9章 字符串/字符/内存函数

目录 一、字符串函数1.1 读取字符串gets函数原型Example 1.2 字符串拷贝strcpy函数原型模拟实现官方源码 1.3 求字符串长度strlen函数原型关于返回值size_与算术转换的一个易错点模拟实现:递归模拟实现:指针-指针模拟实现:暴力官方源码 1.4 字符串追加strcat函数原型注意自己给…

借助 Aspose.Words,使用 C# 从 Word 文档中删除页面

如果您正在寻找一种快速删除 Word 文档中不相关、过时或空白页的方法&#xff0c;那么您来对地方了。在这篇博文中&#xff0c;我们将学习如何使用 C# 从 Word 文档中删除页面。我们将逐步引导您完成该过程&#xff0c;提供清晰的示例&#xff0c;以帮助您以编程方式高效地从 W…

AI领域的新千禧:为你的智能助手取个趣味名字!

内容概要 随着智能助手的崛起&#xff0c;它们逐渐成为我们日常生活中不可或缺的一部分。在这个过程中&#xff0c;为这些助手取一个趣味名字显得尤为重要。一个有趣的名字不仅能让用户感到更加亲切&#xff0c;还能带来更多的互动乐趣&#xff0c;使得人与科技之间的关系更加…