Przeglądaj źródła

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper into master

seyason 7 miesięcy temu
rodzic
commit
9bb279f865
100 zmienionych plików z 26379 dodań i 87 usunięć
  1. 176 0
      fhKeeper/formulahousekeeper/ArticleOperation/log/article.log
  2. 140 0
      fhKeeper/formulahousekeeper/articleBackend/package-lock.json
  3. 3 0
      fhKeeper/formulahousekeeper/articleBackend/package.json
  4. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/langs/zh_CN.js
  5. 66 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/dark/content.css
  6. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/dark/content.js
  7. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/dark/content.min.css
  8. 61 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/default/content.css
  9. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/default/content.js
  10. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/default/content.min.css
  11. 66 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/document/content.css
  12. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/document/content.js
  13. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/document/content.min.css
  14. 66 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5-dark/content.css
  15. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5-dark/content.js
  16. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5-dark/content.min.css
  17. 61 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5/content.css
  18. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5/content.js
  19. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5/content.min.css
  20. 62 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/writer/content.css
  21. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/writer/content.js
  22. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/writer/content.min.css
  23. 770 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.css
  24. 776 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.inline.css
  25. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.inline.js
  26. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.inline.min.css
  27. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.js
  28. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.min.css
  29. 4663 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.css
  30. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.js
  31. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.min.css
  32. 30 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css
  33. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.js
  34. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css
  35. 782 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.css
  36. 776 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.inline.css
  37. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.inline.js
  38. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.inline.min.css
  39. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.js
  40. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.min.css
  41. 4660 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.css
  42. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.js
  43. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.min.css
  44. 30 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.shadowdom.css
  45. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.shadowdom.js
  46. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css
  47. 770 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.css
  48. 776 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css
  49. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.inline.js
  50. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css
  51. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.js
  52. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.min.css
  53. 4773 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.css
  54. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.js
  55. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css
  56. 30 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css
  57. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js
  58. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css
  59. 782 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.css
  60. 776 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.inline.css
  61. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.inline.js
  62. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.inline.min.css
  63. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.js
  64. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.min.css
  65. 4773 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.css
  66. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.js
  67. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.min.css
  68. 30 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css
  69. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.js
  70. 1 0
      fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css
  71. BIN
      fhKeeper/formulahousekeeper/articleBackend/src/assets/logo - 副本.png
  72. BIN
      fhKeeper/formulahousekeeper/articleBackend/src/assets/logo.png
  73. BIN
      fhKeeper/formulahousekeeper/articleBackend/src/assets/logo2 - 副本.png
  74. BIN
      fhKeeper/formulahousekeeper/articleBackend/src/assets/logo2.png
  75. 143 0
      fhKeeper/formulahousekeeper/articleBackend/src/components/backend/TinymceEditor.vue
  76. 1 1
      fhKeeper/formulahousekeeper/articleBackend/src/main.js
  77. 2 1
      fhKeeper/formulahousekeeper/articleBackend/src/router/index.js
  78. 8 2
      fhKeeper/formulahousekeeper/articleBackend/src/views/Layout.vue
  79. 6 4
      fhKeeper/formulahousekeeper/articleBackend/src/views/article/ArticleManage.vue
  80. 15 0
      fhKeeper/formulahousekeeper/articleBackend/src/views/testText/text.vue
  81. 2 2
      fhKeeper/formulahousekeeper/articleBackend/vite.config.js
  82. 0 1
      fhKeeper/formulahousekeeper/customerBuler-crm/index.html
  83. 7 7
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue
  84. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/index.vue
  85. 57 22
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue
  86. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  87. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts
  88. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  89. 8 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/controller/ArticleController.java
  90. 3 1
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/controller/ArticleTemplateController.java
  91. 8 1
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/mapper/ArticleMapper.java
  92. 1 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/pojo/Article.java
  93. 2 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/service/ArticleService.java
  94. 11 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/service/impl/ArticleServiceImpl.java
  95. 1 1
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/mapper/ArticleMapper.xml
  96. 3 3
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/index.css
  97. 71 17
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/knowledgeField.css
  98. 79 17
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/knowledgeField.less
  99. BIN
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/image/bannar11.png
  100. 0 0
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/index.html

+ 176 - 0
fhKeeper/formulahousekeeper/ArticleOperation/log/article.log

@@ -0,0 +1,176 @@
+2024-11-12 14:32:51.481 [main] ERROR o.s.b.SpringApplication - [reportFailure,818] - Application run failed
+org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
+	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218)
+	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176)
+	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171)
+	at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1218)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:329)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251)
+	at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:214)
+	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166)
+	at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:156)
+	at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:93)
+	at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:124)
+	at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:509)
+	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:199)
+	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166)
+	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:88)
+	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
+	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54)
+	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36)
+	at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:108)
+	at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:132)
+	at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:87)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
+	at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
+	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
+	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
+	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
+	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
+	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
+	at org.springframework.boot.SpringApplicationRunListeners$$Lambda$37/1452442375.accept(Unknown Source)
+	at java.util.ArrayList.forEach(ArrayList.java:1249)
+	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
+	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
+	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
+	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
+	at com.my.bigevent.BigEventApplication.main(BigEventApplication.java:12)
+Caused by: java.nio.charset.MalformedInputException: Input length = 1
+	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
+	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
+	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
+	at java.io.InputStreamReader.read(InputStreamReader.java:184)
+	at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125)
+	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:183)
+	... 44 common frames omitted
+2024-11-12 14:34:08.746 [main] ERROR o.s.b.SpringApplication - [reportFailure,818] - Application run failed
+org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
+	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218)
+	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176)
+	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171)
+	at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1218)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:329)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251)
+	at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:214)
+	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166)
+	at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:156)
+	at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:93)
+	at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:124)
+	at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:509)
+	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:199)
+	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166)
+	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:88)
+	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
+	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54)
+	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36)
+	at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:108)
+	at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:132)
+	at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:87)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
+	at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
+	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
+	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
+	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
+	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
+	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
+	at org.springframework.boot.SpringApplicationRunListeners$$Lambda$37/1452442375.accept(Unknown Source)
+	at java.util.ArrayList.forEach(ArrayList.java:1249)
+	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
+	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
+	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
+	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
+	at com.my.bigevent.BigEventApplication.main(BigEventApplication.java:12)
+Caused by: java.nio.charset.MalformedInputException: Input length = 1
+	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
+	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
+	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
+	at java.io.InputStreamReader.read(InputStreamReader.java:184)
+	at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125)
+	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:183)
+	... 44 common frames omitted
+2024-11-12 14:34:32.513 [main] ERROR o.s.b.SpringApplication - [reportFailure,818] - Application run failed
+org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
+	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218)
+	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176)
+	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171)
+	at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1218)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:329)
+	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251)
+	at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:214)
+	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166)
+	at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:156)
+	at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:93)
+	at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:124)
+	at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:509)
+	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:199)
+	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166)
+	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:88)
+	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
+	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54)
+	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36)
+	at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:108)
+	at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:132)
+	at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:87)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
+	at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
+	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
+	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
+	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
+	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)
+	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
+	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
+	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
+	at org.springframework.boot.SpringApplicationRunListeners$$Lambda$37/1667148529.accept(Unknown Source)
+	at java.util.ArrayList.forEach(ArrayList.java:1249)
+	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
+	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
+	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
+	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
+	at com.my.bigevent.BigEventApplication.main(BigEventApplication.java:12)
+Caused by: java.nio.charset.MalformedInputException: Input length = 1
+	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
+	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
+	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
+	at java.io.InputStreamReader.read(InputStreamReader.java:184)
+	at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125)
+	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:183)
+	... 44 common frames omitted
+2024-11-12 14:34:52.557 [background-preinit] INFO  o.h.v.i.util.Version - [<clinit>,21] - HV000001: Hibernate Validator 6.2.5.Final
+2024-11-12 14:34:52.560 [main] INFO  c.m.b.BigEventApplication - [logStarting,55] - Starting BigEventApplication using Java 1.8.0_45 on Yurk with PID 29304 (D:\WorkSpeace\manHourHousekeeper\fhKeeper\formulahousekeeper\ArticleOperation\target\classes started by 123 in D:\WorkSpeace\manHourHousekeeper\fhKeeper\formulahousekeeper\ArticleOperation)
+2024-11-12 14:34:52.561 [main] INFO  c.m.b.BigEventApplication - [logStartupProfileInfo,632] - No active profile set, falling back to 1 default profile: "default"
+2024-11-12 14:34:53.152 [main] ERROR o.a.c.c.AprLifecycleListener - [log,173] - An incompatible version [1.1.32] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
+2024-11-12 14:34:53.285 [main] INFO  o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-8091"]
+2024-11-12 14:34:53.286 [main] INFO  o.a.c.c.StandardService - [log,173] - Starting service [Tomcat]
+2024-11-12 14:34:53.286 [main] INFO  o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/9.0.83]
+2024-11-12 14:34:53.404 [main] INFO  o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext
+2024-11-12 14:34:53.849 [main] INFO  o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-8091"]
+2024-11-12 14:34:53.866 [main] INFO  c.m.b.BigEventApplication - [logStarted,61] - Started BigEventApplication in 1.554 seconds (JVM running for 2.339)
+2024-11-12 14:35:03.671 [http-nio-8091-exec-1] INFO  o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'

+ 140 - 0
fhKeeper/formulahousekeeper/articleBackend/package-lock.json

@@ -9,6 +9,7 @@
       "version": "0.0.0",
       "dependencies": {
         "@rollup/plugin-inject": "^5.0.5",
+        "@tinymce/tinymce-vue": "^6.1.0",
         "@vueup/vue-quill": "^1.2.0",
         "axios": "^1.6.5",
         "element-plus": "^2.4.4",
@@ -17,6 +18,8 @@
         "quill-image-drop-module": "^1.0.3",
         "quill-image-resize": "^3.0.9",
         "quill-image-resize-module": "^3.0.0",
+        "tinymce": "^7.5.0",
+        "tinymce-vue": "^1.0.0",
         "vue": "^3.3.11",
         "vue-router": "^4.2.5"
       },
@@ -709,6 +712,20 @@
         "win32"
       ]
     },
+    "node_modules/@tinymce/tinymce-vue": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/@tinymce/tinymce-vue/-/tinymce-vue-6.1.0.tgz",
+      "integrity": "sha512-7JdaKMOaohuFWpjKwRmaZJbT/eNVUUYHG93R7+lUf7SUN+hSqd2spbuqZcki+tG9kaSAGd2ZmvJIsmzWDNAzpw==",
+      "peerDependencies": {
+        "tinymce": "^7.0.0 || ^6.0.0 || ^5.5.1",
+        "vue": "^3.0.0"
+      },
+      "peerDependenciesMeta": {
+        "tinymce": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
@@ -1792,6 +1809,21 @@
         "node": "^10 || ^12 || >=14"
       }
     },
+    "node_modules/prettier": {
+      "version": "2.8.8",
+      "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+      "optional": true,
+      "bin": {
+        "prettier": "bin-prettier.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
     "node_modules/proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -4864,6 +4896,14 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/source-map-js": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -4872,6 +4912,48 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/tinymce": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmmirror.com/tinymce/-/tinymce-7.5.0.tgz",
+      "integrity": "sha512-A7iuQPIfeze5rO6bvnnPwP7TiWnPA9AGr8U/9ssLwrEG+FMYPzvLPt3RT8ktVn/wPSJkVBBSLCAZX2dAHb8YEA=="
+    },
+    "node_modules/tinymce-vue": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/tinymce-vue/-/tinymce-vue-1.0.0.tgz",
+      "integrity": "sha512-htEc8lDGC4guQx1H5QzsNu55ynyehUKhAYdWRUqu9VfgA41x0VHqXTMoLRdo2oDlZYqJ4u5k7XqL3HtyxI7HgQ==",
+      "dependencies": {
+        "tinymce": "^4.7.3",
+        "vue": "^2.5.3"
+      }
+    },
+    "node_modules/tinymce-vue/node_modules/@vue/compiler-sfc": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
+      "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
+      "dependencies": {
+        "@babel/parser": "^7.23.5",
+        "postcss": "^8.4.14",
+        "source-map": "^0.6.1"
+      },
+      "optionalDependencies": {
+        "prettier": "^1.18.2 || ^2.0.0"
+      }
+    },
+    "node_modules/tinymce-vue/node_modules/tinymce": {
+      "version": "4.9.11",
+      "resolved": "https://registry.npmmirror.com/tinymce/-/tinymce-4.9.11.tgz",
+      "integrity": "sha512-nkSLsax+VY5DBRjMFnHFqPwTnlLEGHCco82FwJF2JNH6W+5/ClvNC1P4uhD5lXPDNiDykSHR0XJdEh7w/ICHzA=="
+    },
+    "node_modules/tinymce-vue/node_modules/vue": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz",
+      "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
+      "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
+      "dependencies": {
+        "@vue/compiler-sfc": "2.7.16",
+        "csstype": "^3.1.0"
+      }
+    },
     "node_modules/to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -5347,6 +5429,12 @@
       "dev": true,
       "optional": true
     },
+    "@tinymce/tinymce-vue": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/@tinymce/tinymce-vue/-/tinymce-vue-6.1.0.tgz",
+      "integrity": "sha512-7JdaKMOaohuFWpjKwRmaZJbT/eNVUUYHG93R7+lUf7SUN+hSqd2spbuqZcki+tG9kaSAGd2ZmvJIsmzWDNAzpw==",
+      "requires": {}
+    },
     "@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
@@ -6109,6 +6197,12 @@
         "source-map-js": "^1.0.2"
       }
     },
+    "prettier": {
+      "version": "2.8.8",
+      "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+      "optional": true
+    },
     "proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -8595,11 +8689,57 @@
         "has-property-descriptors": "^1.0.0"
       }
     },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
     "source-map-js": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
       "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
     },
+    "tinymce": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmmirror.com/tinymce/-/tinymce-7.5.0.tgz",
+      "integrity": "sha512-A7iuQPIfeze5rO6bvnnPwP7TiWnPA9AGr8U/9ssLwrEG+FMYPzvLPt3RT8ktVn/wPSJkVBBSLCAZX2dAHb8YEA=="
+    },
+    "tinymce-vue": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/tinymce-vue/-/tinymce-vue-1.0.0.tgz",
+      "integrity": "sha512-htEc8lDGC4guQx1H5QzsNu55ynyehUKhAYdWRUqu9VfgA41x0VHqXTMoLRdo2oDlZYqJ4u5k7XqL3HtyxI7HgQ==",
+      "requires": {
+        "tinymce": "^4.7.3",
+        "vue": "^2.5.3"
+      },
+      "dependencies": {
+        "@vue/compiler-sfc": {
+          "version": "2.7.16",
+          "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
+          "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
+          "requires": {
+            "@babel/parser": "^7.23.5",
+            "postcss": "^8.4.14",
+            "prettier": "^1.18.2 || ^2.0.0",
+            "source-map": "^0.6.1"
+          }
+        },
+        "tinymce": {
+          "version": "4.9.11",
+          "resolved": "https://registry.npmmirror.com/tinymce/-/tinymce-4.9.11.tgz",
+          "integrity": "sha512-nkSLsax+VY5DBRjMFnHFqPwTnlLEGHCco82FwJF2JNH6W+5/ClvNC1P4uhD5lXPDNiDykSHR0XJdEh7w/ICHzA=="
+        },
+        "vue": {
+          "version": "2.7.16",
+          "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz",
+          "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
+          "requires": {
+            "@vue/compiler-sfc": "2.7.16",
+            "csstype": "^3.1.0"
+          }
+        }
+      }
+    },
     "to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",

+ 3 - 0
fhKeeper/formulahousekeeper/articleBackend/package.json

@@ -10,6 +10,7 @@
   },
   "dependencies": {
     "@rollup/plugin-inject": "^5.0.5",
+    "@tinymce/tinymce-vue": "^6.1.0",
     "@vueup/vue-quill": "^1.2.0",
     "axios": "^1.6.5",
     "element-plus": "^2.4.4",
@@ -18,6 +19,8 @@
     "quill-image-drop-module": "^1.0.3",
     "quill-image-resize": "^3.0.9",
     "quill-image-resize-module": "^3.0.0",
+    "tinymce": "^7.5.0",
+    "tinymce-vue": "^1.0.0",
     "vue": "^3.3.11",
     "vue-router": "^4.2.5"
   },

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/langs/zh_CN.js


+ 66 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/dark/content.css

@@ -0,0 +1,66 @@
+body {
+  background-color: #222f3e;
+  color: #fff;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+  line-height: 1.4;
+  margin: 1rem;
+}
+a {
+  color: #4099ff;
+}
+table {
+  border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+  padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+  border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+  border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+  border-color: #6d737b;
+}
+figure {
+  display: table;
+  margin: 1rem auto;
+}
+figure figcaption {
+  color: #8a8f97;
+  display: block;
+  margin-top: 0.25rem;
+  text-align: center;
+}
+hr {
+  border-color: #6d737b;
+  border-style: solid;
+  border-width: 1px 0 0 0;
+}
+code {
+  background-color: #6d737b;
+  border-radius: 3px;
+  padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+  border-left: 2px solid #6d737b;
+  margin-left: 1.5rem;
+  padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+  border-right: 2px solid #6d737b;
+  margin-right: 1.5rem;
+  padding-right: 1rem;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/dark/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/dark/content.min.css


+ 61 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/default/content.css

@@ -0,0 +1,61 @@
+body {
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+  line-height: 1.4;
+  margin: 1rem;
+}
+table {
+  border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+  padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+  border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+  border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+  border-color: #ccc;
+}
+figure {
+  display: table;
+  margin: 1rem auto;
+}
+figure figcaption {
+  color: #999;
+  display: block;
+  margin-top: 0.25rem;
+  text-align: center;
+}
+hr {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 1px 0 0 0;
+}
+code {
+  background-color: #e8e8e8;
+  border-radius: 3px;
+  padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+  border-left: 2px solid #ccc;
+  margin-left: 1.5rem;
+  padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+  border-right: 2px solid #ccc;
+  margin-right: 1.5rem;
+  padding-right: 1rem;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/default/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/default/content.min.css


+ 66 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/document/content.css

@@ -0,0 +1,66 @@
+@media screen {
+  html {
+    background: #f4f4f4;
+    min-height: 100%;
+  }
+}
+body {
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+}
+@media screen {
+  body {
+    background-color: #fff;
+    box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);
+    box-sizing: border-box;
+    margin: 1rem auto 0;
+    max-width: 820px;
+    min-height: calc(100vh - 1rem);
+    padding: 4rem 6rem 6rem 6rem;
+  }
+}
+table {
+  border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+  padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+  border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+  border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+  border-color: #ccc;
+}
+figure figcaption {
+  color: #999;
+  margin-top: 0.25rem;
+  text-align: center;
+}
+hr {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 1px 0 0 0;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+  border-left: 2px solid #ccc;
+  margin-left: 1.5rem;
+  padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+  border-right: 2px solid #ccc;
+  margin-right: 1.5rem;
+  padding-right: 1rem;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/document/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/document/content.min.css


+ 66 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5-dark/content.css

@@ -0,0 +1,66 @@
+body {
+  background-color: #2f3742;
+  color: #dfe0e4;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+  line-height: 1.4;
+  margin: 1rem;
+}
+a {
+  color: #4099ff;
+}
+table {
+  border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+  padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+  border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+  border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+  border-color: #6d737b;
+}
+figure {
+  display: table;
+  margin: 1rem auto;
+}
+figure figcaption {
+  color: #8a8f97;
+  display: block;
+  margin-top: 0.25rem;
+  text-align: center;
+}
+hr {
+  border-color: #6d737b;
+  border-style: solid;
+  border-width: 1px 0 0 0;
+}
+code {
+  background-color: #6d737b;
+  border-radius: 3px;
+  padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+  border-left: 2px solid #6d737b;
+  margin-left: 1.5rem;
+  padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+  border-right: 2px solid #6d737b;
+  margin-right: 1.5rem;
+  padding-right: 1rem;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5-dark/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5-dark/content.min.css


+ 61 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5/content.css

@@ -0,0 +1,61 @@
+body {
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+  line-height: 1.4;
+  margin: 1rem;
+}
+table {
+  border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+  padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+  border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+  border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+  border-color: #ccc;
+}
+figure {
+  display: table;
+  margin: 1rem auto;
+}
+figure figcaption {
+  color: #999;
+  display: block;
+  margin-top: 0.25rem;
+  text-align: center;
+}
+hr {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 1px 0 0 0;
+}
+code {
+  background-color: #e8e8e8;
+  border-radius: 3px;
+  padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+  border-left: 2px solid #ccc;
+  margin-left: 1.5rem;
+  padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+  border-right: 2px solid #ccc;
+  margin-right: 1.5rem;
+  padding-right: 1rem;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/tinymce-5/content.min.css


+ 62 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/writer/content.css

@@ -0,0 +1,62 @@
+body {
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+  line-height: 1.4;
+  margin: 1rem auto;
+  max-width: 900px;
+}
+table {
+  border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+  padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+  border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+  border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+   and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+  border-color: #ccc;
+}
+figure {
+  display: table;
+  margin: 1rem auto;
+}
+figure figcaption {
+  color: #999;
+  display: block;
+  margin-top: 0.25rem;
+  text-align: center;
+}
+hr {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 1px 0 0 0;
+}
+code {
+  background-color: #e8e8e8;
+  border-radius: 3px;
+  padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+  border-left: 2px solid #ccc;
+  margin-left: 1.5rem;
+  padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+  border-right: 2px solid #ccc;
+  margin-right: 1.5rem;
+  padding-right: 1rem;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/writer/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/content/writer/content.min.css


Plik diff jest za duży
+ 770 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.css


Plik diff jest za duży
+ 776 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.inline.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.inline.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.inline.min.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/content.min.css


Plik diff jest za duży
+ 4663 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.min.css


+ 30 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css

@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+  overflow: hidden;
+}
+.tox-fullscreen {
+  border: 0;
+  height: 100%;
+  margin: 0;
+  overflow: hidden;
+  overscroll-behavior: none;
+  padding: 0;
+  touch-action: pinch-zoom;
+  width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+  display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+  left: 0;
+  position: fixed;
+  top: 0;
+  z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+  background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+  z-index: 1201;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css


Plik diff jest za duży
+ 782 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.css


Plik diff jest za duży
+ 776 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.inline.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.inline.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.inline.min.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/content.min.css


Plik diff jest za duży
+ 4660 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.min.css


+ 30 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.shadowdom.css

@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+  overflow: hidden;
+}
+.tox-fullscreen {
+  border: 0;
+  height: 100%;
+  margin: 0;
+  overflow: hidden;
+  overscroll-behavior: none;
+  padding: 0;
+  touch-action: pinch-zoom;
+  width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+  display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+  left: 0;
+  position: fixed;
+  top: 0;
+  z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+  background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+  z-index: 1201;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.shadowdom.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css


Plik diff jest za duży
+ 770 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.css


Plik diff jest za duży
+ 776 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.inline.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/content.min.css


Plik diff jest za duży
+ 4773 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css


+ 30 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css

@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+  overflow: hidden;
+}
+.tox-fullscreen {
+  border: 0;
+  height: 100%;
+  margin: 0;
+  overflow: hidden;
+  overscroll-behavior: none;
+  padding: 0;
+  touch-action: pinch-zoom;
+  width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+  display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+  left: 0;
+  position: fixed;
+  top: 0;
+  z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+  background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+  z-index: 1201;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css


Plik diff jest za duży
+ 782 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.css


Plik diff jest za duży
+ 776 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.inline.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.inline.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.inline.min.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/content.min.css


Plik diff jest za duży
+ 4773 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.css


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.min.css


+ 30 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css

@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+  overflow: hidden;
+}
+.tox-fullscreen {
+  border: 0;
+  height: 100%;
+  margin: 0;
+  overflow: hidden;
+  overscroll-behavior: none;
+  padding: 0;
+  touch-action: pinch-zoom;
+  width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+  display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+  left: 0;
+  position: fixed;
+  top: 0;
+  z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+  background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+  z-index: 1201;
+}

Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.js


Plik diff jest za duży
+ 1 - 0
fhKeeper/formulahousekeeper/articleBackend/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css


BIN
fhKeeper/formulahousekeeper/articleBackend/src/assets/logo - 副本.png


BIN
fhKeeper/formulahousekeeper/articleBackend/src/assets/logo.png


BIN
fhKeeper/formulahousekeeper/articleBackend/src/assets/logo2 - 副本.png


BIN
fhKeeper/formulahousekeeper/articleBackend/src/assets/logo2.png


+ 143 - 0
fhKeeper/formulahousekeeper/articleBackend/src/components/backend/TinymceEditor.vue

@@ -0,0 +1,143 @@
+<template>
+  <div>
+      <Editor v-model="content" :init="myTinyInit"></Editor>
+  </div>
+</template>
+
+<script setup>
+import {computed, defineEmits, defineProps, onMounted, reactive, ref, watch} from 'vue'
+import tinymce from "tinymce/tinymce";
+import Editor from '@tinymce/tinymce-vue';
+import "tinymce/icons/default/icons";
+import "tinymce/themes/silver";
+import "tinymce/models/dom/model";
+
+//按需引入插件
+// import "tinymce/plugins/image";
+// import "tinymce/plugins/table";
+// import "tinymce/plugins/lists";
+// import "tinymce/plugins/link";
+// import "tinymce/plugins/help";
+// import "tinymce/plugins/wordcount";
+
+import 'tinymce/models/dom'; // 引入dom模块。从 Tinymce6,开始必须有此模块导入
+import 'tinymce/skins/ui/oxide/skin.css'//样式
+import 'tinymce/themes/silver'; //默认主题
+// import 'tinymce/icons/default'; //引入编辑器图标icon,不引入则不显示对应图标
+// import 'tinymce/langs/zh-Hans'; //引入编辑器语言包
+// import '/tinymce/langs/zh-CN'; //引入编辑器语言包
+// import 'tinymce/models/dom'; // 引入dom模块。从 Tinymce6,开始必须有此模块导入
+// import 'tinymce/themes/silver'; //默认主题
+// import 'tinymce/icons/default'; //引入编辑器图标icon,不引入则不显示对应图标
+import 'tinymce/plugins/advlist'; //高级列表
+import 'tinymce/plugins/anchor'; //锚点
+import 'tinymce/plugins/autolink'; //自动链接
+import 'tinymce/plugins/autoresize'; //编辑器高度自适应,注:plugins里引入此插件时,Init里设置的height将失效
+import 'tinymce/plugins/autosave'; //自动存稿
+import 'tinymce/plugins/charmap'; //特殊字符
+import 'tinymce/plugins/code'; //编辑源码
+import 'tinymce/plugins/codesample'; //代码示例
+import 'tinymce/plugins/directionality'; //文字方向
+import 'tinymce/plugins/emoticons'; //表情
+import 'tinymce/plugins/fullscreen'; //全屏
+import 'tinymce/plugins/help'; //帮助
+import 'tinymce/plugins/image'; //插入编辑图片
+import 'tinymce/plugins/importcss'; //引入css
+import 'tinymce/plugins/insertdatetime'; //插入日期时间
+import 'tinymce/plugins/link'; //超链接
+import 'tinymce/plugins/lists'; //列表插件
+import 'tinymce/plugins/media'; //插入编辑媒体
+import 'tinymce/plugins/nonbreaking'; //插入不间断空格
+import 'tinymce/plugins/pagebreak'; //插入分页符
+import 'tinymce/plugins/preview'; //预览
+import 'tinymce/plugins/quickbars'; //快速工具栏
+import 'tinymce/plugins/save'; //保存
+import 'tinymce/plugins/searchreplace'; //查找替换
+import 'tinymce/plugins/table'; //表格
+// import 'tinymce/plugins/template'; //内容模板
+import 'tinymce/plugins/visualblocks'; //显示元素范围
+import 'tinymce/plugins/visualchars'; //显示不可见字符
+import 'tinymce/plugins/wordcount'; //字数统计
+
+import axios from "axios";
+
+const props = defineProps({
+  modelValue: {
+      type: String,
+      default: ""
+  },
+  plugins: {
+      type: [String, Array],
+      // default:'lists link image table help wordcount',
+      default:'codesample preview searchreplace autolink directionality visualblocks visualchars image link template table charmap pagebreak nonbreaking anchor insertdatetime advlist lists wordcount autosave help'
+  },
+  toolbar: {
+      type: [String, Array],
+      default: `undo redo formatselect bold italic  alignjustify bullist numlist outdent indent help preview codesample code  backcolor styles directionality fontfamily fontsize searchreplace image link alignleft aligncenter alignright template table charmap pagebreak nonbreaking anchor
+  insertdatetime advlist lists wordcount autosave `,
+  }
+});
+const emit = defineEmits(['input']);
+const piniaToken = JSON.parse(localStorage.getItem('pinia-token') || '')
+const myTinyInit = reactive({
+  width: '100%',
+  height: 800,
+  branding: true,
+  menubar: true,
+  resize: true,
+  promotion: false, //Upgrade是否开启
+  branding: false, //tiny技术支持信息是否显示
+  language_url: "/tinymce/langs/zh_CN.js", // 语言包的路径,具体路径看自己的项目
+  language: "zh_CN",
+  skin_url: "/tinymce/skins/ui/oxide", //手动引入
+  content_css: '/tinymce/skins/content/default/content.css', //手动引入
+  toolbar_mode: "wrap",
+  plugins: props.plugins,
+  toolbar: props.toolbar,
+  line_height_formats: '1 1.2 1.4 1.6 2', //行高
+  font_size_formats: '12px 14px 16px 18px 20px 22px 24px 28px 32px 36px 48px 56px 72px', //字体大小
+  font_family_formats:'微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;',
+  //图片上传方法(注意!!:要使用 promise 对象中的 resolve 返回图片路径,否则会报错)
+  images_upload_handler: (blobInfo) => new Promise((resolve, reject) => {
+      let formData = new FormData();
+      console.log(blobInfo, '<==== blobInfo')
+      formData.append('multipartFile', blobInfo.blob(), blobInfo.filename());
+      axios.post(`/api/common/uploadFile`, formData, {
+          headers: ({
+              'Content-Type': 'multipart/form-data',
+              // 'Authorization': "Bearer " + piniaToken.token
+              'Authorization': piniaToken.token
+          })
+      }).then(res => {
+          if(res.data.code == 0) {
+            resolve(`${res.data.data}`)
+          } else {
+            ElMessage.warning('上传失败')
+          }
+      }).catch(error => {
+          reject(error);
+      })
+  }),
+});
+
+
+const initContent = computed(() => {
+  return props.modelValue
+});
+
+onMounted(() => {
+  tinymce.init({});
+})
+
+const content = ref();
+watch(initContent, (newVal) => {
+  content.value = newVal;
+}, {deep: true, immediate: true});
+
+watch(content, (newVal) => {
+  emit("input", newVal);
+}, {deep: true});
+</script>
+
+<style scoped lang="scss">
+</style>

+ 1 - 1
fhKeeper/formulahousekeeper/articleBackend/src/main.js

@@ -30,7 +30,7 @@ app.use(pinia)
 app.use(router)
 
 // 使用element-plus 和他的中文语言包
-app.use(ElementPlus,{locale});
+app.use(ElementPlus,{locale, zIndex: 1000});
 
 // 必须最后才能挂载,若先挂载,则 app.use 的那些配置都不生效了。
 app.mount('#app');

+ 2 - 1
fhKeeper/formulahousekeeper/articleBackend/src/router/index.js

@@ -10,6 +10,7 @@ import ArticleManageVue from '@/views/article/ArticleManage.vue'
 import UserAvatarVue from '@/views/user/UserAvatar.vue'
 import UserInfoVue from '@/views/user/UserInfo.vue'
 import UserResetPassword from '@/views/user/UserResetPassword.vue'
+import TextText from "@/views/testText/text.vue"
 
 
 // 定义路由关系redirect 属性是重定向,这里默认重定向到 /article/category
@@ -22,7 +23,7 @@ const routes=[
         {path:'/user/avatar',component:UserAvatarVue},
         {path:'/user/info',component:UserInfoVue},
         {path:'/user/resetPassword',component:UserResetPassword},
-
+        {path:'/textText/text',component:TextText},
     ]}
 ]
 

+ 8 - 2
fhKeeper/formulahousekeeper/articleBackend/src/views/Layout.vue

@@ -94,6 +94,12 @@ const handleCommand=(command)=>{
                     </el-icon>
                     <span>文章管理</span>
                 </el-menu-item>
+                <el-menu-item index="/textText/text">
+                    <el-icon>
+                        <Promotion />
+                    </el-icon>
+                    <span>测试文本</span>
+                </el-menu-item>
                 <el-sub-menu >
                     <template #title>
                         <el-icon>
@@ -126,7 +132,7 @@ const handleCommand=(command)=>{
         <el-container>
             <!-- 头部区域 -->
             <el-header>
-                <div>文章后台系统:<strong>{{ userInfoStore.info.nickname }}</strong></div>
+                <div>珊瑚岛系统:<strong>{{ userInfoStore.info.nickname }}</strong></div>
                 <!--下拉菜单,注意这里的 @command,让其捆绑自定义的事件处理函数,用于对下面个人信息中捆绑的command属性进行处理-->
                 <el-dropdown placement="bottom-end" @command="handleCommand">
                     <span class="el-dropdown__box">
@@ -160,7 +166,7 @@ const handleCommand=(command)=>{
                 <router-view></router-view>
             </el-main>
             <!-- 底部区域 -->
-            <el-footer>大事件 ©2023 Created by 文章后台系统</el-footer>
+            <el-footer>珊瑚岛 ©2023 Created by 珊瑚岛系统</el-footer>
         </el-container>
     </el-container>
 </template>

+ 6 - 4
fhKeeper/formulahousekeeper/articleBackend/src/views/article/ArticleManage.vue

@@ -6,6 +6,7 @@ import {
 // 文章编辑器组件
 import { QuillEditor, Quill } from "@vueup/vue-quill";
 import "@vueup/vue-quill/dist/vue-quill.snow.css";
+import Editor from '@/components/backend/TinymceEditor.vue';
 // import { ImageDrop } from 'quill-image-drop-module';
 // import ImageResize from 'quill-image-resize-module';
 
@@ -324,7 +325,7 @@ const deleteArticle = async (row) => {
         <!-- 文章列表 -->
         <el-table :data="articles" style="width: 100%">
             <el-table-column label="文章标题" width="400" prop="title"></el-table-column>
-            <el-table-column label="分类" prop="categoryNames"></el-table-column>
+            <el-table-column label="标签" prop="categoryNames"></el-table-column>
             <el-table-column label="发表时间" prop="createTime"> </el-table-column>
             <el-table-column label="状态" prop="state"></el-table-column>
             <el-table-column label="操作" width="100">
@@ -343,7 +344,7 @@ const deleteArticle = async (row) => {
             @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
 
             <!-- 抽屉 -->
-        <el-drawer v-model="visibleDrawer" :title="`${articleModel.id ? '编辑文章' : '添加文章'}`" direction="rtl" size="50%">
+        <el-drawer v-model="visibleDrawer" :title="`${articleModel.id ? '编辑文章' : '添加文章'}`" direction="rtl" size="100%">
             <!-- 添加文章表单 -->
             <el-form :model="articleModel" label-width="100px" >
                 <el-form-item label="文章标题" >
@@ -388,14 +389,15 @@ const deleteArticle = async (row) => {
                 <el-form-item label="文章内容">
                     <div class="editor">
                         <!--富文本编辑器组件-->
-                        <quill-editor
+                        <!-- <quill-editor
                             theme="snow"
                             v-model:content="articleModel.content"
                             contentType="html"
                             :options="options"
                             :key="quilleditorKey"
                             >
-                        </quill-editor>
+                        </quill-editor> -->
+                        <editor v-model="articleModel.content" @input="(val)=> {articleModel.content=val}"></editor>
                     </div>
                 </el-form-item>
                 <el-form-item>

+ 15 - 0
fhKeeper/formulahousekeeper/articleBackend/src/views/testText/text.vue

@@ -0,0 +1,15 @@
+<template>
+  <div>
+     <editor v-model="notificationForm.content" @input="(val)=> {notificationForm.content=val}"></editor>
+     //@input方法需要自己定义,不然父组件可能获取不到editor的值
+      测试文本
+  </div>
+</template>
+
+<script setup>
+import {reactive} from 'vue'
+import Editor from '@/components/backend/TinymceEditor.vue';
+const notificationForm = reactive({
+   content: '',    
+})
+</script>

+ 2 - 2
fhKeeper/formulahousekeeper/articleBackend/vite.config.js

@@ -29,8 +29,8 @@ export default defineConfig({
     proxy:{
       '/api':{
         // target:'http://localhost:8080',  // 后台服务所在的源,用这个源替换前端服务源
-        // target:'http://47.101.180.183:8091',  // 后台服务所在的源,用这个源替换前端服务源
-        target:'http://192.168.2.17:8091',  // 后台服务所在的源,用这个源替换前端服务源
+        target:'http://47.101.180.183:8091',  // 后台服务所在的源,用这个源替换前端服务源
+        // target:'http://192.168.2.17:8091',  // 后台服务所在的源,用这个源替换前端服务源
         changeOrigin:true,     // 开启修改源
         rewrite:(path)=>path.replace(/^\/api/,'')   // url路径中的 /api 将会被替换成 '' 
       }

+ 0 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/index.html

@@ -1,4 +1,3 @@
-<!doctype html>
 <html lang="en">
   <head>
     <meta charset="UTF-8" />

+ 7 - 7
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue

@@ -51,7 +51,7 @@ const dateOptions = [
 
 type PromptType = {
   permission?: 0 | 1 | 2 | 3;
-  date?: 0 | 1 | 2;
+  date?: 0 | 1 | 2 | any;
   sliceDate: [Date, Date];
 };
 
@@ -171,7 +171,7 @@ watchEffect(() => {
           <el-select
             size="small"
             :model-value="bulletinPrompt.permission"
-            @change="(value) => (bulletinPrompt.permission = value)"
+            @change="(value: any) => (bulletinPrompt.permission = value)"
           >
             <el-option
               v-for="permission in permissionOptions"
@@ -185,7 +185,7 @@ watchEffect(() => {
             ref="select1"
             size="small"
             :model-value="bulletinPrompt.date"
-            @change="(value) => (bulletinPrompt.date = value)"
+            @change="(value: any) => (bulletinPrompt.date = value)"
           >
             <el-option v-for="date in dateOptions" :label="date.label" :value="date.value" />
             <el-option label="自定义" value="ignore" disabled>
@@ -275,7 +275,7 @@ watchEffect(() => {
                 clearable
                 size="small"
                 :model-value="summaryPrompt.permission"
-                @change="(value) => (summaryPrompt.permission = value)"
+                @change="(value: any) => (summaryPrompt.permission = value)"
               >
                 <el-option
                   v-for="permission in permissionOptions"
@@ -290,7 +290,7 @@ watchEffect(() => {
                 clearable
                 size="small"
                 :model-value="summaryPrompt.date"
-                @change="(value) => (summaryPrompt.date = value)"
+                @change="(value: any) => (summaryPrompt.date = value)"
               >
                 <el-option v-for="date in dateOptions" :label="date.label" :value="date.value" />
                 <el-option label="自定义" value="ignore" disabled>
@@ -378,7 +378,7 @@ watchEffect(() => {
                 clearable
                 size="small"
                 :model-value="stagePrompt.permission"
-                @change="(value) => (stagePrompt.permission = value)"
+                @change="(value: any) => (stagePrompt.permission = value)"
               >
                 <el-option
                   v-for="permission in permissionOptions"
@@ -393,7 +393,7 @@ watchEffect(() => {
                 clearable
                 size="small"
                 :model-value="stagePrompt.date"
-                @change="(value) => (stagePrompt.date = value)"
+                @change="(value: any) => (stagePrompt.date = value)"
               >
                 <el-option v-for="date in dateOptions" :label="date.label" :value="date.value" />
                 <el-option label="自定义" value="ignore" disabled>

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/index.vue

@@ -17,7 +17,7 @@ import { downloadFile } from '@/utils/tools';
 const isLoading = ref(false);
 const dataSource = ref([]);
 const form = reactive({ type: 1, date: undefined, member: undefined });
-const memberOptions = ref([]);
+const memberOptions: any = ref([]);
 // 0 客户总量  1 客户转化率
 const dataType = ref<0 | 1>(0);
 
@@ -69,7 +69,7 @@ const queryOverall = async (payload?: RequestProps) => {
   const { data = [] } = await getOverallData(payload);
   isLoading.value = false;
 
-  dataSource.value = data.map((d) => ({
+  dataSource.value = data.map((d: any) => ({
     dealRate: d.dealRate * 100,
     customerDeal: d.customerDeal,
     customertotal: d.customertotal,
@@ -98,7 +98,7 @@ const queryConversion = async (payload?: RequestProps) => {
   const { data = [] } = await getConversionData(payload);
   isLoading.value = false;
 
-  dataSource.value = data.map((d) => ({
+  dataSource.value = data.map((d: any) => ({
     name: form.type === 1 ? d.name : d.departmentName,
     dealRate: d.dealRate * 100
   }));
@@ -122,7 +122,7 @@ watchEffect(() => {
 watchEffect(async () => {
   const { data = [] } = form.type === 1 ? await getStaffData() : await getDepartmentData();
 
-  memberOptions.value = data.map((d) => ({
+  memberOptions.value = data.map((d: any) => ({
     name: form.type === 1 ? d.name : d.departmentName,
     id: form.type === 1 ? d.id : d.departmentId
   }));

+ 57 - 22
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue

@@ -7,8 +7,7 @@
     <div v-for="(routerItem, routerItemIdex) in routerList" @click="setCurrentRouter(routerItem)"
       :class="`border-b-2 border-transparent hover:border-white p-2 mr-4 cursor-pointer multipleyHeader ${activeRouter?.path === routerItem.path ? 'border-white' : ''}`"
       :key="routerItem.path" ref="childDivs" v-show="visibleItems.includes(routerItemIdex)">
-      <div v-if="routerItem.children && routerItem.children.length <= 0 && routerItem?.isMenu"
-         class="text-nowrap">
+      <div v-if="routerItem.children && routerItem.children.length <= 0 && routerItem?.isMenu" class="text-nowrap">
         {{ routerItem.name }}
       </div>
       <div v-if="routerItem.children && routerItem.children.length > 0" class="flex justify-center items-center">
@@ -48,7 +47,7 @@
     </div>
   </div>
   <div class="flex flex-row justify-start items-center text-white header-right">
-    <el-badge :value="12" :max="99" class="ml-4 cursor-pointer h-[26px]">
+    <el-badge :value="numberOfLogos" :max="99" class="ml-4 cursor-pointer h-[26px]" :show-zero="false">
       <el-icon :size="26" @click="newsDrawer = true">
         <Bell />
       </el-icon>
@@ -81,29 +80,46 @@
   </el-drawer>
 
   <!-- 消息 -->
-  <el-drawer v-model="newsDrawer" modal-class="drawerVisClass" :with-header="false" size="45%">
-    <div class="w-full h-full">
-      <el-table :data="newsDrawerTableData" style="width: 100%" v-loading="newsDrawerLoading">
-        <el-table-column prop="msg" label="消息内容">
-          <template #default="scope">
-            <el-link type="primary" :underline="false" @click="toDetail(scope.row)">{{ scope.row.msg }}</el-link>
-          </template>
-        </el-table-column>
-        <el-table-column prop="checked" label="状态" width="100">
-          <template #default="scope">
-            <el-tag :type="scope.row.checked ? 'success' : 'danger'">
-              {{ scope.row.checked ? '已读' : '未读' }}
-            </el-tag>
+  <el-drawer v-model="newsDrawer" modal-class="drawerVisClass" :with-header="false" size="50%">
+    <div class="w-full h-full flex flex-row" v-loading="newsDrawerLoading">
+      <div class="w-full h-full">
+        <el-table :data="newsDrawerTableData" style="flex1" border>
+          <el-table-column prop="msg" label="消息内容">
+            <template #default="scope">
+              <el-link type="primary" :underline="false" @click="toDetail(scope.row)">{{ scope.row.msg }}</el-link>
+            </template>
+          </el-table-column>
+          <el-table-column prop="checked" label="状态" width="100">
+            <template #default="scope">
+              <el-tag :type="scope.row.checked ? 'success' : 'danger'">
+                {{ scope.row.checked ? '已读' : '未读' }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="time" label="时间" width="140" />
+        </el-table>
+      </div>
+      
+      <div class="messageStyle">
+        <el-dropdown>
+          <span class="el-dropdown-link">
+            <el-icon class="el-icon--right">
+              <el-icon><MoreFilled /></el-icon>
+            </el-icon>
+          </span>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item @click="oneClickRead()" :disabled="numberOfLogos <= 0">一键已读</el-dropdown-item>
+            </el-dropdown-menu>
           </template>
-        </el-table-column>
-        <el-table-column prop="time" label="时间" width="140" />
-      </el-table>
+        </el-dropdown>
+      </div>
     </div>
   </el-drawer>
 </template>
 
 <!-- /information/list -->
-  
+
 <script lang="ts" setup>
 import { onMounted, ref, watchEffect, watch } from 'vue';
 import { RouteRecordRaw, useRouter, useRoute } from 'vue-router';
@@ -127,6 +143,7 @@ const newsDrawerTableData = ref<any[]>([])
 const drawerVis = ref(false)
 const newsDrawer = ref(false)
 const newsDrawerLoading = ref(false)
+const numberOfLogos = ref(0)
 
 const updateVisibleItems = () => {
   const parentWidth = (parentDiv.value?.offsetWidth && parentDiv.value?.offsetWidth - 150) || 10;
@@ -224,6 +241,7 @@ const getNewsDrawerTableData = () => {
         time: formatDate(new Date(item.time))
       }
     })
+    numberOfLogos.value = (data || []).filter((item: any) => !item.checked).length
     newsDrawerTableData.value = data
   }).catch(err => {
     newsDrawerTableData.value = []
@@ -233,13 +251,24 @@ const getNewsDrawerTableData = () => {
   })
 }
 
+const oneClickRead = () => {
+  newsDrawerLoading.value = true
+  post(`/information/checkAll`).then(_res => {
+    getNewsDrawerTableData()
+  }).catch(err => {
+    console.log(err, '<==== 失败')
+  }).finally(() => {
+    newsDrawerLoading.value = false
+  })
+}
+
 const toDetail = (row: any) => {
   console.log(row, '<=== 点击数据')
   const { id, type, path } = row
   post(`/information/check`, { id }).then(res => {
     console.log(res, '<=== 成功')
     getNewsDrawerTableData()
-    if(path) {
+    if (path) {
       router.push({ path });
     }
   }).catch(err => {
@@ -268,8 +297,12 @@ watchEffect(() => {
   );
 });
 </script>
-  
+
 <style scoped lang="scss">
+.messageStyle {
+  margin: 15px;
+  margin-left: 100px;
+}
 .trademark {
   font-size: 20px;
 }
@@ -304,11 +337,13 @@ watchEffect(() => {
   .drawerVisBtn {
     margin-top: 10px;
     border-top: 1px solid #999;
+
     div {
       text-align: center;
       line-height: 40px;
       color: #fff;
       cursor: pointer;
+
       &:hover {
         background: #086597;
       }

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue

@@ -2,7 +2,7 @@
   <div class="loginView w-screen h-screen overflow-hidden flex">
     <div class="w-96 bg-white m-auto border-t-8 border-[#075985] shadow-xl rounded-md pl-9 pr-9">
       <div class="m-auto pt-4">
-        <img class="w-1/5 h-1/5 m-auto" :src="loginLogo" alt="">
+        <img class="w-1/5 m-auto" :src="loginLogo" alt="">
       </div>
       <h2 class="text-xl text-center pt-4 font-bold">客户管家</h2>
       <el-form class="pt-4" ref="ruleFormRef" :model="ruleForm" :rules="rules">

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts

@@ -3,7 +3,8 @@ import vue from '@vitejs/plugin-vue';
 
 import { resolve } from 'path';
 
-const target = 'http://192.168.2.28:10010';
+// const target = 'http://192.168.2.28:10010';
+const target = 'http://192.168.2.17:10010';
 // const target = "http://127.0.0.1:10010";
 // const target = "http://192.168.2.178:10010";
 // const target = 'http://47.101.180.183:10010';

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -242,7 +242,7 @@ public class ReportController {
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate start = LocalDate.parse(startDate, dateTimeFormatter);
         LocalDate end = LocalDate.parse(endDate, dateTimeFormatter);
-        if (start.until(end, ChronoUnit.DAYS) > 365) {
+        if (projectId==null&&start.until(end, ChronoUnit.DAYS) > 365) {
             HttpRespMsg httpRespMsg = new HttpRespMsg();
             httpRespMsg.setError("导出日报时间间隔不得超过1年");
             return httpRespMsg;

+ 8 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/controller/ArticleController.java

@@ -90,4 +90,12 @@ public class ArticleController {
         return map;
     }
 
+    @GetMapping("/viewArticle")
+    public Object viewArticle(@RequestParam("id") Integer id){
+        articleService.updateViewCountById(id);
+        Map<String, Object> map = new HashMap<>();
+        map.put("data", "success");
+        return map;
+    }
+
 }

+ 3 - 1
fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/controller/ArticleTemplateController.java

@@ -31,6 +31,8 @@ public class ArticleTemplateController {
     public Object PageList(Model model, Integer pageIndex, Integer pageSize,
                            @RequestParam(required = false) String info)
     {
+        // 定义格式化器
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         List<Article> articleList= articleService.PageList(pageIndex,pageSize,info);
         Integer total=articleService.getTotal(info);
         if (!articleList.isEmpty()){
@@ -42,7 +44,7 @@ public class ArticleTemplateController {
                 }else {
                     article.setBaseImage("");
                 }
-
+                article.setCreateTimeStr(article.getCreateTime().format(formatter));
             }
         }
         model.addAttribute("knowledgeFieldTableList", articleList);

+ 8 - 1
fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/mapper/ArticleMapper.java

@@ -4,6 +4,7 @@ import com.firerock.webttkuaiban.demos.pojo.Article;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
 
@@ -17,6 +18,12 @@ public interface ArticleMapper {
 
     List<Article> relatedList(@Param("strings")List<String> strings,@Param("articleId")Integer articleId);
 
-    @Select("select id,title,content,category_ids,create_time,product_id from article where id = #{id}")
+    @Select("select id,title,content,category_ids,create_time,product_id,profile from article where id = #{id}")
     Article getArticleById(Integer id);
+
+    @Update(" update article set view_count = view_count + 1 where id= #{id}")
+    void updateViewCountById(Integer id);
+
+    @Select("SELECT id,view_count FROM article WHERE id = #{articleId} FOR UPDATE")
+    Article selectForUpdate(Integer articleId);
 }

+ 1 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/pojo/Article.java

@@ -37,6 +37,7 @@ public class Article {
     private String baseImage;
     private String productId;
     private String coverImgUrl;
+    private Integer viewCount;
 
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")

+ 2 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/service/ArticleService.java

@@ -16,4 +16,6 @@ public interface ArticleService {
     List<Article> relatedList(Integer id);
 
     Article getArticleById(Integer id);
+
+    void updateViewCountById(Integer id);
 }

+ 11 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/java/com/firerock/webttkuaiban/demos/service/impl/ArticleServiceImpl.java

@@ -9,6 +9,7 @@ import com.firerock.webttkuaiban.demos.pojo.Category;
 import com.firerock.webttkuaiban.demos.service.ArticleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import java.util.ArrayList;
 import java.util.List;
@@ -73,4 +74,14 @@ public class ArticleServiceImpl implements ArticleService {
         }
         return article;
     }
+
+
+    @Override
+    @Transactional
+    public void updateViewCountById(Integer articleId) {
+        // 先锁定行
+        articleMapper.selectForUpdate(articleId);
+        // 然后更新浏览量
+        articleMapper.updateViewCountById(articleId);
+    }
 }

+ 1 - 1
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/mapper/ArticleMapper.xml

@@ -6,7 +6,7 @@
 <mapper namespace="com.firerock.webttkuaiban.demos.mapper.ArticleMapper">
 
     <select id="pageList" resultType="com.firerock.webttkuaiban.demos.pojo.Article">
-        select a.id,a.title,a.`profile` ,a.cover_img_url
+        select a.id,a.title,a.`profile` ,a.cover_img_url,a.create_time
         from article a
         left join  article_cover_img aci on a.id=aci.article_id
         <where>

+ 3 - 3
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/index.css

@@ -72,10 +72,10 @@
 
 /* 图片 */
 .bannarIMgGam {
-    width: 35.6875rem;
+    width: 50rem;
     position: absolute;
-    top: 15.8125rem;
-    right: 6.25rem;
+    top: 13.6875rem;
+    right: 6.375rem;
     z-index: 1;
 }
 

+ 71 - 17
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/knowledgeField.css

@@ -18,7 +18,7 @@
   display: flex;
   align-items: center;
   justify-content: space-between;
-  padding: 0 1.5rem;
+  padding: 0 3.125rem;
   border-bottom: 0.0625rem solid #ededed;
 }
 .knowledgeFieldCon .knowledgeField .knowledgeField-header .knowledgeInput {
@@ -62,10 +62,9 @@
   width: 5rem;
 }
 .knowledgeFieldCon .knowledgeField .knowledgeField-content {
-  padding: 0 1.5625rem;
+  padding: 0 3.25rem;
   margin: 1.875rem 0;
-  overflow-y: auto;
-  height: 60vh;
+  min-height: 60vh;
 }
 .knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item {
   display: flex;
@@ -80,24 +79,33 @@
   margin-right: 1.25rem;
 }
 .knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item .textContent {
-  width: 100.5rem;
+  width: 97.5rem;
 }
-.knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item .textContent div {
+.knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item .textContent .textContentTitle {
   color: #000000;
   font-family: Microsoft YaHei UI;
   font-weight: regular;
-  font-size: 20px;
+  font-size: 1.25rem;
   line-height: normal;
   letter-spacing: 0px;
-  padding-bottom: 0.875rem;
+  padding-bottom: 0.625rem;
+}
+.knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item .textContent .textContentUnderstand {
+  display: flex;
+  align-items: center;
+}
+.knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item .textContent .textContentUnderstand .textContentUnderstandText {
+  font-size: 0.875rem;
+  color: #7B7B7B;
+  padding-right: 0.625rem;
 }
 .knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item .textContent p {
   color: #7b7b7b;
   font-family: Microsoft YaHei UI;
   font-weight: regular;
-  font-size: 16px;
-  height: 2.5rem;
-  line-height: normal;
+  font-size: 1rem;
+  line-height: 1.65;
+  height: 3.5625rem;
   letter-spacing: 0px;
   display: -webkit-box;
   /* 必须设置为弹性盒模型 */
@@ -109,13 +117,12 @@
   /* 限制显示2行 */
   text-overflow: ellipsis;
   /* 超出的部分显示省略号 */
-  margin-bottom: 0.625rem;
 }
 .knowledgeFieldCon .knowledgeField .knowledgeField-content .knowledgeField-content-item .textContent span {
   color: #3396fb;
   font-family: Microsoft YaHei UI;
   font-weight: regular;
-  font-size: 16px;
+  font-size: 1rem;
   line-height: normal;
   letter-spacing: 0px;
   cursor: pointer;
@@ -180,7 +187,7 @@
   margin-right: 1rem;
 }
 .knowledgeFieldCon .knowledgeDetails .knowledgeDetails-left .knowledgeDetails-left-con .timeContent span {
-  color: #000000;
+  color: #7b7b7b;
 }
 .knowledgeFieldCon .knowledgeDetails .knowledgeDetails-left .knowledgeDetails-left-con .readUse .text {
   font-size: 1rem;
@@ -204,7 +211,7 @@
   font-weight: regular;
   font-size: 1rem;
   line-height: normal;
-  margin-right: 2.0625rem;
+  margin-right: 1.0625rem;
 }
 .knowledgeFieldCon .knowledgeDetails .knowledgeDetails-left .knowledgeDetails-left-con .grey {
   color: #7b7b7b;
@@ -213,12 +220,14 @@
   color: #3396fb;
 }
 .knowledgeFieldCon .knowledgeDetails .knowledgeDetails-left .hypertextContent {
-  background: #f6f6f6;
   padding: 1.875rem;
   margin: 0 1.875rem;
   flex: 1;
   font-size: 1rem;
 }
+.knowledgeFieldCon .knowledgeDetails .knowledgeDetails-left .hypertextContent img {
+  cursor: pointer;
+}
 .knowledgeFieldCon .knowledgeDetails .knowledgeDetails-left .knowledgeDetails-left-bottom {
   padding: 1.25rem 0;
 }
@@ -254,6 +263,10 @@
   color: #3878ff;
   cursor: pointer;
 }
+.knowledgeFieldCon .knowledgeDetails .knowledgeDetails-right .knowledgeDetails-right-title a {
+  color: #7B7B7B;
+  cursor: pointer;
+}
 .knowledgeFieldCon .knowledgeDetails .knowledgeDetails-right .line {
   width: 100%;
   height: 1px;
@@ -332,7 +345,7 @@
   z-index: 2;
 }
 .knowledgeFieldCon .linkButtonss {
-  color: #3396fb;
+  color: #7b7b7b;
 }
 .knowledgeFieldCon .dividingLine {
   height: 0.0625rem;
@@ -414,6 +427,47 @@
   color: #fff;
   border-color: #3396fb;
 }
+.knowledgeFieldCon .modal {
+  display: none;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.7);
+  justify-content: center;
+  align-items: center;
+}
+.knowledgeFieldCon .modal .layout {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+}
+.knowledgeFieldCon .modal .modalImage {
+  width: 50%;
+  display: flex;
+  align-items: center;
+}
+.knowledgeFieldCon .modal .modalImage img {
+  width: 100%;
+}
+.knowledgeFieldCon .modal .prev,
+.knowledgeFieldCon .modal .next {
+  width: 1.875rem;
+  cursor: pointer;
+  background: none;
+  border: 0;
+}
+.knowledgeFieldCon .modal .prev img,
+.knowledgeFieldCon .modal .next img {
+  width: 100%;
+}
+.knowledgeFieldCon .modal button:disabled {
+  background: rgba(0, 0, 0, 0.2);
+  cursor: not-allowed;
+}
 body {
   background: #7b7b7b;
 }

+ 79 - 17
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/css/knowledgeField.less

@@ -17,7 +17,7 @@
       display: flex;
       align-items: center;
       justify-content: space-between;
-      padding: 0 1.5rem;
+      padding: 0 3.125rem;
       border-bottom: 0.0625rem solid #ededed;
       .knowledgeInput {
         width: 25rem;
@@ -62,10 +62,11 @@
     }
 
     .knowledgeField-content {
-      padding: 0 1.5625rem;
+      padding: 0 3.25rem;
       margin: 1.875rem 0;
-      overflow-y: auto;
-      height: 60vh;
+      // overflow-y: auto;
+      // height: 60vh;
+      min-height: 60vh;
 
       .knowledgeField-content-item {
         display: flex;
@@ -81,36 +82,46 @@
           margin-right: 1.25rem;
         }
         .textContent {
-          width: 100.5rem;
-          div {
+          width: 97.5rem;
+          .textContentTitle {
             color: #000000;
             font-family: Microsoft YaHei UI;
             font-weight: regular;
-            font-size: 20px;
+            font-size: 1.25rem;
             line-height: normal;
             letter-spacing: 0px;
-            padding-bottom: 0.875rem;
+            padding-bottom: .625rem;
+          }
+          .textContentUnderstand {
+            display: flex;
+            align-items: center;
+            .textContentUnderstandText {
+              font-size: 0.875rem;
+              color: #7B7B7B;
+              padding-right: .625rem;
+            }
           }
           p {
             color: #7b7b7b;
             font-family: Microsoft YaHei UI;
             font-weight: regular;
-            font-size: 16px;
-            height: 2.5rem;
-            line-height: normal;
+            font-size: 1rem;
+            line-height: 1.65;
+            height: 3.5625rem;
+            // line-height: normal;
             letter-spacing: 0px;
             display: -webkit-box; /* 必须设置为弹性盒模型 */
             -webkit-box-orient: vertical; /* 设置盒子的排列方式为垂直 */
             overflow: hidden; /* 隐藏超出的文本 */
             -webkit-line-clamp: 2; /* 限制显示2行 */
             text-overflow: ellipsis; /* 超出的部分显示省略号 */
-            margin-bottom: 0.625rem;
+            // margin-bottom: 0.625rem;
           }
           span {
             color: #3396fb;
             font-family: Microsoft YaHei UI;
             font-weight: regular;
-            font-size: 16px;
+            font-size: 1rem;
             line-height: normal;
             letter-spacing: 0px;
             cursor: pointer;
@@ -181,7 +192,8 @@
             margin-right: 1rem;
           }
           span {
-            color: #000000;
+            // color: #000000;
+            color: #7b7b7b;
           }
         }
         .readUse {
@@ -208,7 +220,8 @@
           font-weight: regular;
           font-size: 1rem;
           line-height: normal;
-          margin-right: 2.0625rem;
+          // margin-right: 2.0625rem;
+          margin-right: 1.0625rem;
         }
         .grey {
           color: #7b7b7b;
@@ -219,12 +232,15 @@
       }
 
       .hypertextContent {
-        background: #f6f6f6;
+        // background: #f6f6f6;
         padding: 1.875rem;
         // overflow-y: auto;
         margin: 0 1.875rem;
         flex: 1;
         font-size: 1rem;
+        img {
+          cursor: pointer;
+        }
       }
 
       .knowledgeDetails-left-bottom {
@@ -263,6 +279,10 @@
           color: #3878ff;
           cursor: pointer;
         }
+        a {
+          color: #7B7B7B;
+          cursor: pointer;
+        }
       }
       .line {
         width: 100%;
@@ -344,7 +364,8 @@
   }
 
   .linkButtonss {
-    color: #3396fb;
+    // color: #3396fb;
+    color: #7b7b7b;
   }
 
   .dividingLine {
@@ -434,6 +455,47 @@
       border-color: #3396fb;
     }
   }
+
+  .modal {
+    display: none;
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.7);
+    justify-content: center;
+    align-items: center;
+    .layout {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      justify-content: space-around;
+      align-items: center;
+    }
+    .modalImage {
+      width: 50%; 
+      display: flex;
+      align-items: center;
+      img {
+        width: 100%;
+      }
+    }
+    .prev, .next {
+      width: 1.875rem;
+      cursor: pointer;
+      background: none;
+      border: 0;
+      img {
+        width: 100%;
+      }
+    }
+
+    button:disabled {
+      background: rgba(0, 0, 0, 0.2);
+      cursor: not-allowed;
+    }
+  }
 }
 
 body {

BIN
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/image/bannar11.png


+ 0 - 0
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/index.html


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików