system.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. <template>
  2. <div class="system">
  3. <el-form
  4. ref="form"
  5. :model="config"
  6. label-width="240px"
  7. >
  8. <!-- System start -->
  9. <el-collapse v-model="activeNames">
  10. <el-collapse-item
  11. title="系统配置"
  12. name="1"
  13. >
  14. <el-form-item label="环境值">
  15. <!-- <el-input v-model="config.system.env" />-->
  16. <el-select
  17. v-model="config.system.env"
  18. style="width:100%"
  19. >
  20. <el-option value="public" />
  21. <el-option value="develop" />
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="端口值">
  25. <el-input v-model.number="config.system.addr" />
  26. </el-form-item>
  27. <el-form-item label="数据库类型">
  28. <el-select
  29. v-model="config.system['db-type']"
  30. style="width:100%"
  31. >
  32. <el-option value="mysql" />
  33. <el-option value="pgsql" />
  34. </el-select>
  35. </el-form-item>
  36. <el-form-item label="Oss类型">
  37. <el-select
  38. v-model="config.system['oss-type']"
  39. style="width:100%"
  40. >
  41. <el-option value="local" />
  42. <el-option value="qiniu" />
  43. <el-option value="tencent-cos" />
  44. <el-option value="aliyun-oss" />
  45. <el-option value="huawei-obs" />
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="多点登录拦截">
  49. <el-checkbox v-model="config.system['use-multipoint']">开启</el-checkbox>
  50. </el-form-item>
  51. <el-form-item label="开启redis">
  52. <el-checkbox v-model="config.system['use-redis']">开启</el-checkbox>
  53. </el-form-item>
  54. <el-form-item label="限流次数">
  55. <el-input-number v-model.number="config.system['iplimit-count']" />
  56. </el-form-item>
  57. <el-form-item label="限流时间">
  58. <el-input-number v-model.number="config.system['iplimit-time']" />
  59. </el-form-item>
  60. <el-tooltip
  61. content="请修改完成后,注意一并修改前端env环境下的VITE_BASE_PATH"
  62. placement="top-start"
  63. >
  64. <el-form-item label="全局路由前缀">
  65. <el-input v-model="config.system['router-prefix']" />
  66. </el-form-item>
  67. </el-tooltip>
  68. </el-collapse-item>
  69. <el-collapse-item
  70. title="jwt签名"
  71. name="2"
  72. >
  73. <el-form-item label="jwt签名">
  74. <el-input v-model="config.jwt['signing-key']" />
  75. </el-form-item>
  76. <el-form-item label="有效期">
  77. <el-input v-model="config.jwt['expires-time']" />
  78. </el-form-item>
  79. <el-form-item label="缓冲期">
  80. <el-input v-model="config.jwt['buffer-time']" />
  81. </el-form-item>
  82. <el-form-item label="签发者">
  83. <el-input v-model="config.jwt.issuer" />
  84. </el-form-item>
  85. </el-collapse-item>
  86. <el-collapse-item
  87. title="Zap日志配置"
  88. name="3"
  89. >
  90. <el-form-item label="级别">
  91. <el-input v-model.number="config.zap.level" />
  92. </el-form-item>
  93. <el-form-item label="输出">
  94. <el-input v-model="config.zap.format" />
  95. </el-form-item>
  96. <el-form-item label="日志前缀">
  97. <el-input v-model="config.zap.prefix" />
  98. </el-form-item>
  99. <el-form-item label="日志文件夹">
  100. <el-input v-model="config.zap.director" />
  101. </el-form-item>
  102. <el-form-item label="编码级">
  103. <el-input v-model="config.zap['encode-level']" />
  104. </el-form-item>
  105. <el-form-item label="栈名">
  106. <el-input v-model="config.zap['stacktrace-key']" />
  107. </el-form-item>
  108. <el-form-item label="日志留存时间(默认以天为单位)">
  109. <el-input v-model.number="config.zap['max-age']" />
  110. </el-form-item>
  111. <el-form-item label="显示行">
  112. <el-checkbox v-model="config.zap['show-line']" />
  113. </el-form-item>
  114. <el-form-item label="输出控制台">
  115. <el-checkbox v-model="config.zap['log-in-console']" />
  116. </el-form-item>
  117. </el-collapse-item>
  118. <el-collapse-item
  119. title="Redis admin数据库配置"
  120. name="4"
  121. >
  122. <el-form-item label="库">
  123. <el-input v-model.number="config.redis.db" />
  124. </el-form-item>
  125. <el-form-item label="地址">
  126. <el-input v-model="config.redis.addr" />
  127. </el-form-item>
  128. <el-form-item label="密码">
  129. <el-input v-model="config.redis.password" />
  130. </el-form-item>
  131. </el-collapse-item>
  132. <el-collapse-item
  133. title="Mongo 数据库配置"
  134. name="14"
  135. >
  136. <el-form-item label="collection name(表名,一般不写)">
  137. <el-input v-model="config.mongo.coll" />
  138. </el-form-item>
  139. <el-form-item label="mongodb options">
  140. <el-input v-model="config.mongo.options" />
  141. </el-form-item>
  142. <el-form-item label="database name(数据库名)">
  143. <el-input v-model="config.mongo.database" />
  144. </el-form-item>
  145. <el-form-item label="用户名">
  146. <el-input v-model="config.mongo.username" />
  147. </el-form-item>
  148. <el-form-item label="密码">
  149. <el-input v-model="config.mongo.password" />
  150. </el-form-item>
  151. <el-form-item label="最小连接池">
  152. <el-input v-model="config.mongo['min-pool-size']" />
  153. </el-form-item>
  154. <el-form-item label="最大连接池">
  155. <el-input v-model="config.mongo['max-pool-size']" />
  156. </el-form-item>
  157. <el-form-item label="socket超时时间">
  158. <el-input v-model="config.mongo['socket-timeout-ms']" />
  159. </el-form-item>
  160. <el-form-item label="连接超时时间">
  161. <el-input v-model="config.mongo['socket-timeout-ms']" />
  162. </el-form-item>
  163. <el-form-item label="是否开启zap日志">
  164. <el-checkbox v-model="config.mongo['is-zap']" />
  165. </el-form-item>
  166. <el-form-item label="hosts">
  167. <template v-for="(item,k) in config.mongo.hosts">
  168. <div
  169. v-for="(_,k2) in item"
  170. :key="k2"
  171. >
  172. <el-form-item
  173. :key="k+k2"
  174. :label="k2"
  175. >
  176. <el-input v-model="item[k2]" />
  177. </el-form-item>
  178. </div>
  179. </template>
  180. </el-form-item>
  181. </el-collapse-item>
  182. <el-collapse-item
  183. title="邮箱配置"
  184. name="5"
  185. >
  186. <el-form-item label="接收者邮箱">
  187. <el-input
  188. v-model="config.email.to"
  189. placeholder="可多个,以逗号分隔"
  190. />
  191. </el-form-item>
  192. <el-form-item label="端口">
  193. <el-input v-model.number="config.email.port" />
  194. </el-form-item>
  195. <el-form-item label="发送者邮箱">
  196. <el-input v-model="config.email.from" />
  197. </el-form-item>
  198. <el-form-item label="host">
  199. <el-input v-model="config.email.host" />
  200. </el-form-item>
  201. <el-form-item label="是否为ssl">
  202. <el-checkbox v-model="config.email['is-ssl']" />
  203. </el-form-item>
  204. <el-form-item label="secret">
  205. <el-input v-model="config.email.secret" />
  206. </el-form-item>
  207. <el-form-item label="测试邮件">
  208. <el-button @click="email">测试邮件</el-button>
  209. </el-form-item>
  210. </el-collapse-item>
  211. <el-collapse-item
  212. title="验证码配置"
  213. name="7"
  214. >
  215. <el-form-item label="字符长度">
  216. <el-input v-model.number="config.captcha['key-long']" />
  217. </el-form-item>
  218. <el-form-item label="图片宽度">
  219. <el-input v-model.number="config.captcha['img-width']" />
  220. </el-form-item>
  221. <el-form-item label="图片高度">
  222. <el-input v-model.number="config.captcha['img-height']" />
  223. </el-form-item>
  224. </el-collapse-item>
  225. <el-collapse-item
  226. title="数据库配置"
  227. name="9"
  228. >
  229. <template v-if="config.system['db-type'] === 'mysql'">
  230. <el-form-item label="用户名">
  231. <el-input v-model="config.mysql.username" />
  232. </el-form-item>
  233. <el-form-item label="密码">
  234. <el-input v-model="config.mysql.password" />
  235. </el-form-item>
  236. <el-form-item label="地址">
  237. <el-input v-model="config.mysql.path" />
  238. </el-form-item>
  239. <el-form-item label="数据库">
  240. <el-input v-model="config.mysql['db-name']" />
  241. </el-form-item>
  242. <el-form-item label="前缀">
  243. <el-input v-model="config.mysql['refix']" />
  244. </el-form-item>
  245. <el-form-item label="复数表">
  246. <el-switch v-model="config.mysql['singular']" />
  247. </el-form-item>
  248. <el-form-item label="引擎">
  249. <el-input v-model="config.mysql['engine']" />
  250. </el-form-item>
  251. <el-form-item label="maxIdleConns">
  252. <el-input v-model.number="config.mysql['max-idle-conns']" />
  253. </el-form-item>
  254. <el-form-item label="maxOpenConns">
  255. <el-input v-model.number="config.mysql['max-open-conns']" />
  256. </el-form-item>
  257. <el-form-item label="写入日志">
  258. <el-checkbox v-model="config.mysql['log-zap']" />
  259. </el-form-item>
  260. <el-form-item label="日志模式">
  261. <el-input v-model="config.mysql['log-mode']" />
  262. </el-form-item>
  263. </template>
  264. <template v-if="config.system['db-type'] === 'pgsql'">
  265. <el-form-item label="用户名">
  266. <el-input v-model="config.pgsql.username" />
  267. </el-form-item>
  268. <el-form-item label="密码">
  269. <el-input v-model="config.pgsql.password" />
  270. </el-form-item>
  271. <el-form-item label="地址">
  272. <el-input v-model="config.pgsql.path" />
  273. </el-form-item>
  274. <el-form-item label="数据库">
  275. <el-input v-model="config.pgsql.dbname" />
  276. </el-form-item>
  277. <el-form-item label="前缀">
  278. <el-input v-model="config.pgsql['refix']" />
  279. </el-form-item>
  280. <el-form-item label="复数表">
  281. <el-switch v-model="config.pgsql['singular']" />
  282. </el-form-item>
  283. <el-form-item label="引擎">
  284. <el-input v-model="config.pgsql['engine']" />
  285. </el-form-item>
  286. <el-form-item label="maxIdleConns">
  287. <el-input v-model.number="config.pgsql['max-idle-conns']" />
  288. </el-form-item>
  289. <el-form-item label="maxOpenConns">
  290. <el-input v-model.number="config.pgsql['max-open-conns']" />
  291. </el-form-item>
  292. <el-form-item label="写入日志">
  293. <el-checkbox v-model="config.pgsql['log-zap']" />
  294. </el-form-item>
  295. <el-form-item label="日志模式">
  296. <el-input v-model="config.pgsql['log-mode']" />
  297. </el-form-item>
  298. </template>
  299. </el-collapse-item>
  300. <el-collapse-item
  301. title="oss配置"
  302. name="10"
  303. >
  304. <template v-if="config.system['oss-type'] === 'local'">
  305. <h2>本地文件配置</h2>
  306. <el-form-item label="本地文件访问路径">
  307. <el-input v-model="config.local.path" />
  308. </el-form-item>
  309. <el-form-item label="本地文件存储路径">
  310. <el-input v-model="config.local['store-path']" />
  311. </el-form-item>
  312. </template>
  313. <template v-if="config.system['oss-type'] === 'qiniu'">
  314. <h2>qiniu上传配置</h2>
  315. <el-form-item label="存储区域">
  316. <el-input v-model="config.qiniu.zone" />
  317. </el-form-item>
  318. <el-form-item label="空间名称">
  319. <el-input v-model="config.qiniu.bucket" />
  320. </el-form-item>
  321. <el-form-item label="CDN加速域名">
  322. <el-input v-model="config.qiniu['img-path']" />
  323. </el-form-item>
  324. <el-form-item label="是否使用https">
  325. <el-checkbox v-model="config.qiniu['use-https']">开启</el-checkbox>
  326. </el-form-item>
  327. <el-form-item label="accessKey">
  328. <el-input v-model="config.qiniu['access-key']" />
  329. </el-form-item>
  330. <el-form-item label="secretKey">
  331. <el-input v-model="config.qiniu['secret-key']" />
  332. </el-form-item>
  333. <el-form-item label="上传是否使用CDN上传加速">
  334. <el-checkbox v-model="config.qiniu['use-cdn-domains']">开启</el-checkbox>
  335. </el-form-item>
  336. </template>
  337. <template v-if="config.system['oss-type'] === 'tencent-cos'">
  338. <h2>腾讯云COS上传配置</h2>
  339. <el-form-item label="存储桶名称">
  340. <el-input v-model="config['tencent-cos']['bucket']" />
  341. </el-form-item>
  342. <el-form-item label="所属地域">
  343. <el-input v-model="config['tencent-cos'].region" />
  344. </el-form-item>
  345. <el-form-item label="secretID">
  346. <el-input v-model="config['tencent-cos']['secret-id']" />
  347. </el-form-item>
  348. <el-form-item label="secretKey">
  349. <el-input v-model="config['tencent-cos']['secret-key']" />
  350. </el-form-item>
  351. <el-form-item label="路径前缀">
  352. <el-input v-model="config['tencent-cos']['path-prefix']" />
  353. </el-form-item>
  354. <el-form-item label="访问域名">
  355. <el-input v-model="config['tencent-cos']['base-url']" />
  356. </el-form-item>
  357. </template>
  358. <template v-if="config.system['oss-type'] === 'aliyun-oss'">
  359. <h2>阿里云OSS上传配置</h2>
  360. <el-form-item label="区域">
  361. <el-input v-model="config['aliyun-oss'].endpoint" />
  362. </el-form-item>
  363. <el-form-item label="accessKeyId">
  364. <el-input v-model="config['aliyun-oss']['access-key-id']" />
  365. </el-form-item>
  366. <el-form-item label="accessKeySecret">
  367. <el-input v-model="config['aliyun-oss']['access-key-secret']" />
  368. </el-form-item>
  369. <el-form-item label="存储桶名称">
  370. <el-input v-model="config['aliyun-oss']['bucket-name']" />
  371. </el-form-item>
  372. <el-form-item label="访问域名">
  373. <el-input v-model="config['aliyun-oss']['bucket-url']" />
  374. </el-form-item>
  375. </template>
  376. <template v-if="config.system['oss-type'] === 'huawei-obs'">
  377. <h2>华为云Obs上传配置</h2>
  378. <el-form-item label="路径">
  379. <el-input v-model="config['hua-wei-obs'].path" />
  380. </el-form-item>
  381. <el-form-item label="存储桶名称">
  382. <el-input v-model="config['hua-wei-obs'].bucket" />
  383. </el-form-item>
  384. <el-form-item label="区域">
  385. <el-input v-model="config['hua-wei-obs'].endpoint" />
  386. </el-form-item>
  387. <el-form-item label="accessKey">
  388. <el-input v-model="config['hua-wei-obs']['access-key']" />
  389. </el-form-item>
  390. <el-form-item label="secretKey">
  391. <el-input v-model="config['hua-wei-obs']['secret-key']" />
  392. </el-form-item>
  393. </template>
  394. </el-collapse-item>
  395. <el-collapse-item
  396. title="Excel上传配置"
  397. name="11"
  398. >
  399. <el-form-item label="合成目标地址">
  400. <el-input v-model="config.excel.dir" />
  401. </el-form-item>
  402. </el-collapse-item>
  403. <el-collapse-item
  404. title="自动化代码配置"
  405. name="12"
  406. >
  407. <el-form-item label="是否自动重启(linux)">
  408. <el-checkbox v-model="config.autocode['transfer-restart']" />
  409. </el-form-item>
  410. <el-form-item label="root(项目根路径)">
  411. <el-input
  412. v-model="config.autocode.root"
  413. disabled
  414. />
  415. </el-form-item>
  416. <el-form-item label="Server(后端代码地址)">
  417. <el-input v-model="config.autocode['transfer-restart']" />
  418. </el-form-item>
  419. <el-form-item label="SApi(后端api文件夹地址)">
  420. <el-input v-model="config.autocode['server-api']" />
  421. </el-form-item>
  422. <el-form-item label="SInitialize(后端Initialize文件夹)">
  423. <el-input v-model="config.autocode['server-initialize']" />
  424. </el-form-item>
  425. <el-form-item label="SModel(后端Model文件地址)">
  426. <el-input v-model="config.autocode['server-model']" />
  427. </el-form-item>
  428. <el-form-item label="SRequest(后端Request文件夹地址)">
  429. <el-input v-model="config.autocode['server-request']" />
  430. </el-form-item>
  431. <el-form-item label="SRouter(后端Router文件夹地址)">
  432. <el-input v-model="config.autocode['server-router']" />
  433. </el-form-item>
  434. <el-form-item label="SService(后端Service文件夹地址)">
  435. <el-input v-model="config.autocode['server-service']" />
  436. </el-form-item>
  437. <el-form-item label="Web(前端文件夹地址)">
  438. <el-input v-model="config.autocode.web" />
  439. </el-form-item>
  440. <el-form-item label="WApi(后端WApi文件夹地址)">
  441. <el-input v-model="config.autocode['web-api']" />
  442. </el-form-item>
  443. <el-form-item label="WForm(后端WForm文件夹地址)">
  444. <el-input v-model="config.autocode['web-form']" />
  445. </el-form-item>
  446. <el-form-item label="WTable(后端WTable文件夹地址)">
  447. <el-input v-model="config.autocode['web-table']" />
  448. </el-form-item>
  449. </el-collapse-item>
  450. <el-collapse-item
  451. title="微服务"
  452. name="114"
  453. >
  454. <template v-for="(item,k) in config['mirco_servers']">
  455. <div >
  456. <el-form-item label="名称">
  457. <el-input v-model="item['name']" />
  458. </el-form-item>
  459. <el-form-item label="地址规则">
  460. <el-input v-model="item['apiRule']" />
  461. </el-form-item>
  462. <el-form-item label="地址">
  463. <el-input v-model="item['host']" />
  464. </el-form-item>
  465. </div>
  466. </template>
  467. </el-collapse-item>
  468. <!-- <el-collapse-item-->
  469. <!-- title="Timer(定时任务)"-->
  470. <!-- name="13"-->
  471. <!-- >-->
  472. <!-- <el-form-item label="Start(是否启用)">-->
  473. <!-- <el-checkbox v-model="config.timer['start']" />-->
  474. <!-- </el-form-item>-->
  475. <!-- <el-form-item label="Spec(CRON表达式)">-->
  476. <!-- <el-input v-model="config.timer.spec" />-->
  477. <!-- </el-form-item>-->
  478. <!-- <template v-for="(item,k) in config.timer.detail">-->
  479. <!-- <div-->
  480. <!-- v-for="(_,k2) in item"-->
  481. <!-- :key="k2"-->
  482. <!-- >-->
  483. <!-- <el-form-item-->
  484. <!-- :key="k+k2"-->
  485. <!-- :label="k2"-->
  486. <!-- >-->
  487. <!-- <el-input v-model="item[k2]" />-->
  488. <!-- </el-form-item>-->
  489. <!-- </div>-->
  490. <!-- </template>-->
  491. <!-- </el-collapse-item>-->
  492. </el-collapse>
  493. </el-form>
  494. <div class="mt-4">
  495. <el-button
  496. type="primary"
  497. @click="update"
  498. >立即更新</el-button>
  499. <el-button
  500. type="primary"
  501. @click="reload"
  502. >重启服务(开发中)</el-button>
  503. </div>
  504. </div>
  505. </template>
  506. <script setup>
  507. import { getSystemConfig, setSystemConfig } from '@/api/system'
  508. import { emailTest } from '@/api/email'
  509. import { ref, reactive } from 'vue'
  510. import { ElMessage } from 'element-plus'
  511. defineOptions({
  512. name: 'Config'
  513. })
  514. const activeNames = reactive([])
  515. const config = ref({
  516. system: {
  517. 'iplimit-count': 0,
  518. 'iplimit-time': 0
  519. },
  520. jwt: {},
  521. mysql: {},
  522. pgsql: {},
  523. excel: {},
  524. autocode: {},
  525. redis: {},
  526. mongo: {
  527. coll: '',
  528. options: '',
  529. database: '',
  530. username: '',
  531. password: '',
  532. 'min-pool-size': '',
  533. 'max-pool-size': '',
  534. 'socket-timeout-ms': '',
  535. 'connect-timeout-ms': '',
  536. 'is-zap': '',
  537. hosts: [
  538. {
  539. host: '',
  540. port: ''
  541. }
  542. ]
  543. },
  544. qiniu: {},
  545. 'tencent-cos': {},
  546. 'aliyun-oss': {},
  547. 'hua-wei-obs': {},
  548. captcha: {},
  549. zap: {},
  550. local: {},
  551. email: {},
  552. timer: {
  553. detail: {}
  554. },
  555. 'mirco_servers': []
  556. })
  557. const initForm = async() => {
  558. const res = await getSystemConfig()
  559. if (res.code === 0) {
  560. config.value = res.data.config
  561. console.log(res.data.config['mirco_servers'])
  562. console.log(config.value['mirco_servers'])
  563. }
  564. }
  565. initForm()
  566. const reload = () => {}
  567. const update = async() => {
  568. const res = await setSystemConfig({ config: config.value })
  569. if (res.code === 0) {
  570. ElMessage({
  571. type: 'success',
  572. message: '配置文件设置成功'
  573. })
  574. await initForm()
  575. }
  576. }
  577. const email = async() => {
  578. const res = await emailTest()
  579. if (res.code === 0) {
  580. ElMessage({
  581. type: 'success',
  582. message: '邮件发送成功'
  583. })
  584. await initForm()
  585. } else {
  586. ElMessage({
  587. type: 'error',
  588. message: '邮件发送失败'
  589. })
  590. }
  591. }
  592. </script>
  593. <style lang="scss">
  594. .system {
  595. @apply bg-white p-9 rounded;
  596. h2 {
  597. @apply p-2.5 my-2.5 text-lg shadow;
  598. }
  599. }
  600. </style>