User.razor 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. @page "/system/user"
  2. @attribute [ReuseTabsPage(Title = "用户管理")]
  3. <Spin Spinning="Loading">
  4. <Table @ref="_Table"
  5. AutoHeight
  6. TItem="SystemUser"
  7. @bind-PageSize="Ps"
  8. @bind-PageIndex="Pi"
  9. Total="Total"
  10. DataSource="DataSource"
  11. @bind-SelectedRows="SelectedRows"
  12. ScrollX="1300"
  13. OnChange="OnChange">
  14. <TitleTemplate>
  15. <Flex Justify="FlexJustify.Start" Gap="@("10")">
  16. <Input Width="300" Placeholder="输入名称" @bind-Value="@Q_Account" />
  17. <Button OnClick="Search">搜索</Button>
  18. <Button OnClick="ResetQuery">重置</Button>
  19. <Button Type="ButtonType.Primary" Color="Color.Green6" OnClick="() => StartEdit(default)">新增</Button>
  20. </Flex>
  21. </TitleTemplate>
  22. <ColumnDefinitions Context="row">
  23. <PropertyColumn Align="ColumnAlign.Center" Property="c=>c.Id" Width="100" Title="ID" />
  24. <PropertyColumn Align="ColumnAlign.Center" Property="c=>c.Avatar" Width="100" Title="头像">
  25. <Image Src="@row.Avatar" Fallback="data:image/png;base64,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" />
  26. </PropertyColumn>
  27. <PropertyColumn Align="ColumnAlign.Center" Property="c=>c.Account" Width="200" Title="用户名" />
  28. <PropertyColumn Property="c=>c.NickName" Width="300" Title="用户信息">
  29. 昵称:@row.NickName
  30. <br />
  31. 手机:@row.Mobile
  32. <br />
  33. 邮箱:@row.Email
  34. </PropertyColumn>
  35. <PropertyColumn Align="ColumnAlign.Center" Width="100" Property="c=>c.RoleName" Title="角色" />
  36. <PropertyColumn Align="ColumnAlign.Center" Width="100" Property="c=>c.DepartmentName" Title="部门" />
  37. <PropertyColumn Align="ColumnAlign.Center" Width="100" Property="c=>c.Enabled" Title="是否启用">
  38. <Switch Checked="@row.Enabled" @bind-Value="@row.Enabled" CheckedChildren="启用" UnCheckedChildren="禁用" OnChange="() => CheckedChanged(row)" />
  39. </PropertyColumn>
  40. <PropertyColumn Align="ColumnAlign.Center" Property="c => c.CreateTime" Width="200" Title="创建时间">
  41. @{
  42. var formattedTime = row.CreateTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? "N/A";
  43. }
  44. @formattedTime
  45. </PropertyColumn>
  46. <PropertyColumn Align="ColumnAlign.Center" Width="250" Property="c=>c.Area" Title="地区" />
  47. <PropertyColumn Align="ColumnAlign.Center" Width="250" Property="c=>c.Signature" Title="签名" />
  48. <ActionColumn Width="180" Title="操作" Fixed="ColumnFixPlacement.Right">
  49. <Button Type="ButtonType.Primary" Color="Color.Blue6" OnClick="() => StartEdit(row)">编辑</Button>
  50. <Button Type="ButtonType.Primary" Color="Color.Red6" Danger OnClick="() => Delete(row)">删除</Button>
  51. </ActionColumn>
  52. </ColumnDefinitions>
  53. <PaginationTemplate>
  54. <Pagination Class="@(context.PaginationClass + " my-custom-pagination")"
  55. Total="context.Total"
  56. PageSize="context.PageSize"
  57. Current="context.PageIndex"
  58. ShowSizeChanger
  59. ShowQuickJumper
  60. ShowTotal="ShowTotal"
  61. OnChange="context.HandlePageChange" />
  62. </PaginationTemplate>
  63. </Table>
  64. </Spin>
  65. @inject ModalService ModalService;
  66. @inject ConfirmService ComfirmService;
  67. @inject IMessageService MessageService;
  68. @code {
  69. // <FormItem Label="用户类型" Required>
  70. // <Select @bind-Value="@context.UserType"
  71. // TItemValue="UserType"
  72. // TItem="string"
  73. // DefaultActiveFirstOption="true">
  74. // <SelectOptions>
  75. // @foreach (var userType in Enum.GetValues(typeof(UserType)).Cast<UserType>())
  76. // {
  77. // <SelectOption TItemValue="UserType" TItem="string" Value="@userType" Label="@userType.Description()" />
  78. // }
  79. // </SelectOptions>
  80. // </Select>
  81. // </FormItem>
  82. private void StartEdit(SystemUser row)
  83. {
  84. var data = row ?? new();
  85. ModalRef<bool> modalRef = default;
  86. IForm form = default;
  87. modalRef = ModalService.CreateModal<bool>(new()
  88. {
  89. DestroyOnClose = true,
  90. MaskClosable = false,
  91. Title = data.Id > 0 ? "编辑" : "新增",
  92. Content =
  93. @<Form @ref="form" Model="data" OnFinish="()=> modalRef.OkAsync(true)" LabelColSpan="6" WrapperColSpan="18">
  94. @if (data.Id == 0)
  95. {
  96. <FormItem Label="用户名" Required>
  97. <Input @bind-Value="@data.Account" />
  98. </FormItem>
  99. <FormItem Label="密码" Required>
  100. <InputPassword @bind-Value="@data.Password" />
  101. </FormItem>
  102. <FormItem Label="确认密码" Required>
  103. <InputPassword @bind-Value="@data.ConfirmPassword" />
  104. </FormItem>
  105. }
  106. <FormItem Label="昵称" Required>
  107. <Input @bind-Value="@data.NickName" />
  108. </FormItem>
  109. <FormItem Label="手机" Required>
  110. <Input @bind-Value="@data.Mobile" />
  111. </FormItem>
  112. <FormItem Label="邮箱">
  113. <Input @bind-Value="@data.Email" />
  114. </FormItem>
  115. <FormItem Label="角色" Required>
  116. <Select @bind-Value="@data.RoleId"
  117. TItemValue="long"
  118. TItem="string"
  119. DefaultActiveFirstOption="true" EnableSearch AllowClear>
  120. <SelectOptions>
  121. @foreach (var role in Roles)
  122. {
  123. <SelectOption TItemValue="long" TItem="string" Value="@role.Id" Label="@role.Name" />
  124. }
  125. </SelectOptions>
  126. </Select>
  127. </FormItem>
  128. <FormItem Label="部门" Required>
  129. <Select @bind-Value="@data.DepartmentId"
  130. TItemValue="long"
  131. TItem="string"
  132. DefaultActiveFirstOption="true" EnableSearch AllowClear>
  133. <SelectOptions>
  134. @foreach (var department in Departments)
  135. {
  136. <SelectOption TItemValue="long" TItem="string" Value="@department.Id" Label="@department.Name" />
  137. }
  138. </SelectOptions>
  139. </Select>
  140. </FormItem>
  141. <FormItem Label="是否启用" Required>
  142. <Select @bind-Value="@data.Enabled"
  143. TItemValue="bool"
  144. TItem="string"
  145. DefaultActiveFirstOption="false">
  146. <SelectOptions>
  147. <SelectOption TItemValue="bool" TItem="string" Value="true" Label="启用" />
  148. <SelectOption TItemValue="bool" TItem="string" Value="false" Label="禁用" />
  149. </SelectOptions>
  150. </Select>
  151. </FormItem>
  152. <FormItem Label="地区">
  153. <Cascader Options="@Areas" @bind-Value="@data.LastAreadId" SelectedNodesChanged="OnChange" />
  154. </FormItem>
  155. <FormItem Label="地址">
  156. <Input @bind-Value="@data.Address" />
  157. </FormItem>
  158. <FormItem Label="签名">
  159. <TextArea ShowCount MaxLength="200" @bind-Value="@data.Signature" />
  160. </FormItem>
  161. </Form>,
  162. OnOk = async (e) =>
  163. {
  164. if (!form.Validate())
  165. {
  166. return;
  167. }
  168. modalRef.SetConfirmLoading(true);
  169. var flag = await InsertOrUpdate(data);
  170. if (flag)
  171. {
  172. MessageService.Success("操作成功");
  173. await modalRef.CloseAsync();
  174. _Table.ReloadData(Pi, Ps);
  175. StateHasChanged();
  176. }
  177. else
  178. {
  179. MessageService.Error("操作失败");
  180. }
  181. modalRef.SetConfirmLoading(false);
  182. },
  183. OnCancel = async (e) =>
  184. {
  185. if (form.IsModified && (!await Comfirm("已修改内容,确定退出吗?")))
  186. {
  187. return;
  188. }
  189. await modalRef.CloseAsync();
  190. }
  191. });
  192. }
  193. private async Task<bool> Comfirm(string message)
  194. {
  195. return await ComfirmService.Show(message, "提示", ConfirmButtons.YesNo, ConfirmIcon.Warning) == ConfirmResult.Yes;
  196. }
  197. }