system-setting.service.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { DataSource, Repository } from 'typeorm';
  2. import { SystemSetting } from './system-setting.entity';
  3. import { CreateSystemSettingDto, UpdateSystemSettingDto } from './system-setting.schema';
  4. import type { z } from 'zod';
  5. export class SystemSettingService {
  6. private repository: Repository<SystemSetting>;
  7. constructor(dataSource: DataSource) {
  8. this.repository = dataSource.getRepository(SystemSetting);
  9. }
  10. /**
  11. * 获取所有系统设置
  12. */
  13. async findAll(): Promise<SystemSetting[]> {
  14. return this.repository.find({ order: { settingKey: 'ASC' } });
  15. }
  16. /**
  17. * 根据键名获取系统设置
  18. */
  19. async findByKey(settingKey: string): Promise<SystemSetting | null> {
  20. return this.repository.findOne({ where: { settingKey } });
  21. }
  22. /**
  23. * 获取设置值
  24. */
  25. async getValue(settingKey: string): Promise<string | null> {
  26. const setting = await this.findByKey(settingKey);
  27. return setting?.settingValue || null;
  28. }
  29. /**
  30. * 获取布尔值设置
  31. */
  32. async getBooleanValue(settingKey: string): Promise<boolean> {
  33. const value = await this.getValue(settingKey);
  34. return value === 'true';
  35. }
  36. /**
  37. * 获取数字值设置
  38. */
  39. async getNumberValue(settingKey: string): Promise<number> {
  40. const value = await this.getValue(settingKey);
  41. return value ? Number(value) : 0;
  42. }
  43. /**
  44. * 创建系统设置
  45. */
  46. async create(data: z.infer<typeof CreateSystemSettingDto>): Promise<SystemSetting> {
  47. const existing = await this.findByKey(data.settingKey);
  48. if (existing) {
  49. throw new Error(`设置键名 ${data.settingKey} 已存在`);
  50. }
  51. const setting = this.repository.create(data);
  52. return this.repository.save(setting);
  53. }
  54. /**
  55. * 更新系统设置
  56. */
  57. async update(settingKey: string, data: z.infer<typeof UpdateSystemSettingDto>): Promise<SystemSetting> {
  58. const setting = await this.findByKey(settingKey);
  59. if (!setting) {
  60. throw new Error(`设置 ${settingKey} 不存在`);
  61. }
  62. Object.assign(setting, data);
  63. return this.repository.save(setting);
  64. }
  65. /**
  66. * 更新设置值
  67. */
  68. async updateValue(settingKey: string, settingValue: string | null): Promise<SystemSetting> {
  69. const setting = await this.findByKey(settingKey);
  70. if (!setting) {
  71. throw new Error(`设置 ${settingKey} 不存在`);
  72. }
  73. setting.settingValue = settingValue;
  74. return this.repository.save(setting);
  75. }
  76. /**
  77. * 批量更新设置
  78. */
  79. async batchUpdate(settings: Array<{ settingKey: string; settingValue: string | null }>): Promise<SystemSetting[]> {
  80. const results: SystemSetting[] = [];
  81. for (const item of settings) {
  82. try {
  83. const setting = await this.findByKey(item.settingKey);
  84. if (setting) {
  85. setting.settingValue = item.settingValue;
  86. const updated = await this.repository.save(setting);
  87. results.push(updated);
  88. } else {
  89. // 如果设置不存在,创建新的
  90. const newSetting = this.repository.create({
  91. settingKey: item.settingKey,
  92. settingValue: item.settingValue,
  93. settingType: 'string',
  94. description: `系统设置: ${item.settingKey}`
  95. });
  96. const created = await this.repository.save(newSetting);
  97. results.push(created);
  98. }
  99. } catch (error) {
  100. console.error(`更新设置 ${item.settingKey} 失败:`, error);
  101. }
  102. }
  103. return results;
  104. }
  105. /**
  106. * 删除系统设置
  107. */
  108. async delete(settingKey: string): Promise<boolean> {
  109. const result = await this.repository.delete({ settingKey });
  110. return (result.affected ?? 0) > 0;
  111. }
  112. /**
  113. * 初始化默认设置
  114. */
  115. async initDefaultSettings(): Promise<void> {
  116. const defaultSettings = [
  117. {
  118. settingKey: 'home_register_enabled',
  119. settingValue: 'true',
  120. description: '首页注册功能开关',
  121. settingType: 'boolean'
  122. }
  123. ];
  124. for (const setting of defaultSettings) {
  125. const existing = await this.findByKey(setting.settingKey);
  126. if (!existing) {
  127. await this.create(setting);
  128. }
  129. }
  130. }
  131. }