index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. <template>
  2. <div class="assistant">
  3. <div class="assistant-title">
  4. 深圳口岸服务网
  5. <span>“i口岸”通关小助理</span>
  6. </div>
  7. <div class="assistant-main">
  8. <div class="assistant-main-list">
  9. <div class="assistant-main-list-tips">
  10. <div class="__hover" @click="state.showHelp = true">使用帮助</div>
  11. <div class="__hover" @click="state.showAgreement = true">用户协议</div>
  12. <div class="__hover" @click="state.showDisclaimers = true">免责声明</div>
  13. </div>
  14. <div class="assistant-main-list-ask">
  15. <div class="title_1">
  16. 提问记录
  17. <div class="clear __hover" @click="onClearAsk">
  18. <img src="@/views/smart-ask-answer/assistant/imgs/clear.png"/>清空
  19. </div>
  20. </div>
  21. <div class="list_1">
  22. <template v-for="(item, index) in state.askList">
  23. <div class="item">
  24. <span class="__hover" @click="ref_chat.setText(item)">{{item}}</span>
  25. <div class="del __hover" @click="onDelAsk(index)">删除</div>
  26. </div>
  27. </template>
  28. </div>
  29. </div>
  30. <div class="assistant-main-list-hot">
  31. <div class="assistant-main-list-hot-theme">
  32. <div class="title_1">热门主题</div>
  33. <div class="list">
  34. <template v-for="item in state.hotList.theme">
  35. <div class="item __hover" :class="{active: state.hotList.themeId == item.id}" @click="initQuestion(item.id)">{{item.themeName}}</div>
  36. </template>
  37. </div>
  38. </div>
  39. <div class="assistant-main-list-hot-question">
  40. <div class="title_1">热点问题</div>
  41. <div class="list_1">
  42. <template v-for="item in state.hotList.question">
  43. <div class="item">
  44. <span class="__hover" @click="ref_chat.setText(item.hotContent)">{{item.hotContent}}</span>
  45. </div>
  46. </template>
  47. </div>
  48. </div>
  49. </div>
  50. <div class="assistant-main-list-advise" v-loading="state.adviseList.loading">
  51. <div class="title_1">
  52. 智能推荐
  53. <div class="options">
  54. <template v-for="(item, index) in state.adviseList.options">
  55. <div v-if="index > 0" class="split"/>
  56. <div class="__hover" @click="state.adviseList.value = item.value">{{item.label}}</div>
  57. </template>
  58. </div>
  59. </div>
  60. <div class="list_1">
  61. <template v-for="item in state.adviseList[state.adviseList.value]">
  62. <div class="item">
  63. <span class="__hover" @click="ref_chat.setText(item)">{{item}}</span>
  64. </div>
  65. </template>
  66. </div>
  67. </div>
  68. </div>
  69. <div class="assistant-main-content">
  70. <chatCom ref="ref_chat" @getText="getText"/>
  71. </div>
  72. </div>
  73. <CzrDialog
  74. :show="state.showHelp"
  75. width="560px"
  76. :show-submit="false"
  77. :show-close="false"
  78. :hiddenStyle="true"
  79. >
  80. <div class="dialog">
  81. <div class="dialog-title" style="background: linear-gradient(90deg, #677AFD, #8695FD);">
  82. <img src="@/views/smart-ask-answer/assistant/imgs/icon-1.png"/>使用帮助<SvgIcon name="czr_close_1" color="#ffffff" size="16" class="__hover" @click="state.showHelp = false"/>
  83. </div>
  84. <div class="dialog-content help">
  85. <div><div>我学习了<em>口岸知识</em>,能帮您解决口岸相关问题。</div></div>
  86. <div><div>提问字数应控制在<em>200字以内</em>,简要描述业务相关问题,避免出现<em>事例说明</em>和具体<em>个人信息</em>。</div></div>
  87. <div><div>提问范围应在<em>业务以内</em>,避免与业务无关的内容。</div></div>
  88. <div><div>提问描述应<em>完整简明</em>,避免仅输入“去哪里办理?”、“要带什么材料”等问法。</div></div>
  89. <div><div>提问内容尽量避免出现<em>字母、数字、特殊符号</em>等非简体中文文字内容。</div></div>
  90. <div><div>提问避免上<em>上下文分割</em>,避免多次重复提问同一个问题。</div></div>
  91. </div>
  92. </div>
  93. </CzrDialog>
  94. <CzrDialog
  95. :show="state.showAgreement"
  96. width="560px"
  97. height="560px"
  98. :show-submit="false"
  99. :show-close="false"
  100. :hiddenStyle="true"
  101. >
  102. <div class="dialog">
  103. <div class="dialog-title" style="background: linear-gradient(90deg, #2780FD, #579BFC);">
  104. <img src="@/views/smart-ask-answer/assistant/imgs/icon-2.png"/>用户协议<SvgIcon name="czr_close_1" color="#ffffff" size="16" class="__hover" @click="state.showAgreement = false"/>
  105. </div>
  106. <div class="dialog-content agreement">
  107. <div>
  108. <div>尊敬的用户:</div>
  109. <div>欢迎您使用深圳口岸服务网智能问答(以下简称“本系统”)。在本协议中,用户统一被称为“您”,请您务必仔细阅读并充分理解本协议内容。若您不同意本协议及其各项条款,请立即停止使用本系统。若您继续使用本系统,则视为您已经理解、同意并自愿接受本协议的所有内容。 本协议的条款将不定期根据现实情况作出调整及更新,不再另行通知,请您自行保持关注。您在更新的协议条款发布之后继续使用本平台,即视为您已接受修改后的协议。 在本协议中,您需确认,代表您使用本系统的用户已获得充分且合法的授权,且该用户有权代表您接受并履行本协议所规定的各项义务。同时,您应明确知晓并同意,本系统仅向年满18周岁且具备完全民事行为能力的自然人授予使用权限,未成年人及无完全民事行为能力人请在监护人帮助下使用本系统。</div>
  110. <div class="title">一、服务使用和信息内容规范</div>
  111. <div>(一) 内容合法性与合规性</div>
  112. <div>您郑重承诺,在使用本系统时,将严格遵守国家法律法规,不得从事任何违法或违反本协议的活动,严禁发布虚假信息或不当信息。对于违反本规定的内容,本系统将依法采取相应处理措施,包括但不限于不予正常显示、发出警告、限制平台功能使用、封禁账号等。在使用本系统的过程中,您有责任确保所输入的内容不得违反任何法律法规,严禁侵犯他人合法权益(包括但不限于知识产权及其他民事权利),并且应当严格遵守社会公序良俗。在输入内容之前,请仔细检查,避免输入敏感信息或机密信息。</div>
  113. <div>(二) 内容发布与传播规范</div>
  114. <div>若您需要对外发布或传播本系统所生成的内容,应当确保此类发布或传播行为符合法律规定的标识要求。 本系统致力于为用户生成高质量的内容,并采取了一系列安全措施对不当内容进行过滤。然而,鉴于AI技术的固有特性,本系统无法完全保证所生成内容的合法性、准确性或适用性。因此,您有义务自行对内容进行审查,并对自身基于该内容所实施的行为负责。本系统对内容不承担任何法律责任,亦不会因您使用内容或违反本协议的行为而承担任何法律责任。 当您对外发布本系统生成的内容时,您应当对所发布内容的真实性负责。</div>
  115. <div>(三) 内容使用注意事项</div>
  116. <div>本系统所输出的内容仅供参考,不宜将其作为专业建议或用于商业用途。在可能产生重大影响的情形下,建议您向权威机构进行咨询。您应自行承担因依赖本系统输出内容而产生的一切风险和后果。 除非本协议有明确规定或法律法规另有要求,本系统不会将您的输入内容或输出内容用于AI模型训练或其他任何用途。 您应当确保所有经您授权使用本系统的用户均严格遵守本协议的各项规定。</div>
  117. <div class="title">二、有限责任</div>
  118. <div>(一) 服务质量与连续性</div>
  119. <div>本系统将依据现有的技术水平和条件为您提供服务,并尽力保障服务的连贯性和安全性。但需明确的是,本系统不保证服务的可用性、可靠性或连续性。为了持续提升服务质量,我们可能会不定期对系统进行更新、维护或暂停服务,在此过程中本系统无需对由此给您造成的任何影响承担责任。</div>
  120. <div>(二) 用户责任与赔偿</div>
  121. <div>您应确保所输入内容的授权来源合法有效,若因输入内容引发任何纠纷或造成损失,均由您自行承担。若给本系统造成损失的,您应当依法予以赔偿。 若您对本系统输出的内容存在异议,请及时向本系统反馈。本系统将认真对待并妥善处理,但对于因您传播敏感信息或存在歧义内容而引发的侵权、纠纷或损失,本系统不承担任何责任。</div>
  122. <div>本系统将依法对违法内容进行处理,但不保证能够及时发现并处理所有违法内容。您应当对输入和输出内容的合法性负责。对于因非故意或重大过失导致的数据问题,本系统不承担任何法律责任。 本系统对任何间接性、后果性、惩戒性、偶然性或特殊性损害均不承担责任。 在使用本系统过程中,您应当遵守国家相关法律法规。</div>
  123. </div>
  124. </div>
  125. </div>
  126. </CzrDialog>
  127. <CzrDialog
  128. :show="state.showDisclaimers"
  129. width="560px"
  130. height="560px"
  131. :show-submit="false"
  132. :show-close="false"
  133. :hiddenStyle="true"
  134. >
  135. <div class="dialog">
  136. <div class="dialog-title" style="background: linear-gradient(90deg, #F95955, #FE817E);">
  137. <img src="@/views/smart-ask-answer/assistant/imgs/icon-3.png"/>免责声明<SvgIcon name="czr_close_1" color="#ffffff" size="16" class="__hover" @click="state.showDisclaimers = false"/>
  138. </div>
  139. <div class="dialog-content disclaimers">
  140. <div>
  141. <div>尊敬的用户:</div>
  142. <div>您好!深圳口岸服务网智能问答是一款旨在为用户提供精准、便捷的自动答复服务的工具,为确保服务的合规性与信息的准确性,特此发布以下内容:</div>
  143. <div class="title">一、内容合规声明:</div>
  144. <div>深圳口岸服务网智能问答严格遵守《生成式人工智能服务管理办法》等相关规定,确保使用具有合法来源的数据和基础模型,所提供的答复内容合法、客观、真实。所有通过本助手生成的信息均经过严格的训练和筛选,不含有任何违法、虚假或误导性的内容,我们也将持续监控并优化服务,以应对可能出现的合规风险。</div>
  145. <div class="title">二、免责声明:</div>
  146. <div>1.深圳口岸服务网智能问答答复内容是通过人工智能技术生成,所提供的信息仅供参考。若有存在某些歧义或不够准确的答复情况,建议您访问来源链接中的原始文件,并以原文内容为最终依据。</div>
  147. <div>2.当深圳口岸服务网智能问答的自动答复中包含链接至其他网站时,请您以所链接网页上的具体内容为准。</div>
  148. <div>3.对基于深圳口岸服务网智能问答答复内容进行截图、转载等操作的用户,我们提醒您务必尊重并保护第三方的知识产权及其他合法权益。若在此过程中涉及侵犯任何第三方的合法权益,相关法律责任将由用户本人承担。本网站不承担由此产生的任何法律责任。</div>
  149. <div>感谢您使用深圳口岸服务网智能问答,期待为您提供更优质的服务。</div>
  150. </div>
  151. </div>
  152. </div>
  153. </CzrDialog>
  154. </div>
  155. </template>
  156. <script setup lang="ts">
  157. import {computed, getCurrentInstance, onMounted, reactive, ref, watch} from "vue";
  158. import CzrDialog from "@/components/czr-ui/CzrDialog.vue";
  159. import chatCom from './chat.vue'
  160. import {
  161. cmsAiQueryHotReclist,
  162. cmsAiQueryHotThemelist,
  163. cmsAiQueryQuestionReclist, matterQueryMatterlist, policyInfoQueryPolicyInfolist
  164. } from "@/views/smart-ask-answer/assistant/cms/api";
  165. const askSplit = 'd95839a9-1b75-8ba3-06e7-8fc46aff233b'
  166. const askKey = 'assistant_askList'
  167. const state: any = reactive({
  168. showHelp: false,
  169. showAgreement: false,
  170. showDisclaimers: false,
  171. askList: localStorage.getItem(askKey) ? localStorage.getItem(askKey).split(askSplit) : [],
  172. hotList: {
  173. theme: [],
  174. themeId: '',
  175. question: [],
  176. },
  177. adviseList: {
  178. loading: false,
  179. value: 'question',
  180. options: [
  181. {label: '相关问题', value: 'question'},
  182. {label: '相关政策', value: 'policy'},
  183. {label: '相关事项', value: 'item'},
  184. ],
  185. question: [],
  186. policy: [],
  187. item: [],
  188. },
  189. })
  190. const ref_chat = ref()
  191. const getText = (text: string) => {
  192. setAskList(text)
  193. initRelation(text)
  194. }
  195. const setAskList = (text: string) => {
  196. const nowAsk = localStorage.getItem(askKey) ? localStorage.getItem(askKey).split(askSplit) : []
  197. nowAsk.unshift(text)
  198. localStorage.setItem(askKey, nowAsk.slice(0, 10).join(askSplit))
  199. state.askList = nowAsk
  200. }
  201. const onDelAsk = (index) => {
  202. state.askList.splice(index, 1)
  203. localStorage.setItem(askKey, state.askList.join(askSplit))
  204. }
  205. const onClearAsk = () => {
  206. state.askList = []
  207. localStorage.setItem(askKey, state.askList.join(askSplit))
  208. }
  209. const initTheme = () => {
  210. const params = {
  211. data: {
  212. pageIndex: 1,
  213. pageSize: 10,
  214. }
  215. }
  216. cmsAiQueryHotThemelist(params).then(res => {
  217. state.hotList.theme = res?.data?.list || []
  218. if (state.hotList.theme.length > 0) {
  219. initQuestion(state.hotList.theme[0].id)
  220. }
  221. })
  222. }
  223. const initQuestion = (id) => {
  224. state.hotList.themeId = id
  225. const params = {
  226. data: {
  227. pageIndex: 1,
  228. pageSize: 10,
  229. condition: {
  230. themeId: id
  231. }
  232. }
  233. }
  234. cmsAiQueryHotReclist(params).then(res => {
  235. state.hotList.question = res?.data?.list || []
  236. })
  237. }
  238. const initRelation = (text = '') => {
  239. const params1 = {
  240. data: {
  241. pageIndex: 1,
  242. pageSize: 10,
  243. condition: {
  244. questionContent: text
  245. }
  246. }
  247. }
  248. cmsAiQueryQuestionReclist(params1).then(res => {
  249. state.adviseList.question = res?.data?.list.map(v => v.questionContent) || []
  250. })
  251. const params2 = {
  252. data: {
  253. pageIndex: 1,
  254. pageSize: 10,
  255. condition: {
  256. mattersName: text
  257. }
  258. }
  259. }
  260. matterQueryMatterlist(params2).then(res => {
  261. state.adviseList.item = res?.data?.list.map(v => v.mattersName) || []
  262. })
  263. const params3 = {
  264. data: {
  265. pageIndex: 1,
  266. pageSize: 10,
  267. condition: {
  268. contentTitle: text
  269. }
  270. }
  271. }
  272. policyInfoQueryPolicyInfolist(params3).then(res => {
  273. state.adviseList.policy = res?.data?.list.map(v => v.contentTitle) || []
  274. })
  275. }
  276. onMounted(() => {
  277. initTheme()
  278. initRelation()
  279. })
  280. </script>
  281. <style lang="scss" scoped>
  282. .title_1 {
  283. font-family: Microsoft YaHei;
  284. font-weight: bold;
  285. font-size: 24px;
  286. color: #111111;
  287. display: flex;
  288. align-items: center;
  289. justify-content: space-between;
  290. }
  291. .list_1 {
  292. margin-top: auto;
  293. width: 100%;
  294. height: 126px;
  295. display: flex;
  296. flex-direction: column;
  297. //overflow: hidden;
  298. overflow-y: auto;
  299. .item {
  300. border-bottom: 1px dashed #D8DAE5;
  301. display: flex;
  302. align-items: center;
  303. font-family: Microsoft YaHei;
  304. font-weight: 400;
  305. font-size: 16px;
  306. color: #111111;
  307. >span {
  308. min-height: 47px;
  309. display: flex;
  310. align-items: center;
  311. flex: 1;
  312. }
  313. &:before {
  314. content: '';
  315. width: 6px;
  316. height: 6px;
  317. background: #D32521;
  318. margin-right: 8px;
  319. }
  320. &:last-child {
  321. border-bottom: none;
  322. }
  323. .del {
  324. margin-left: auto;
  325. font-family: Microsoft YaHei;
  326. font-weight: 400;
  327. font-size: 14px;
  328. color: #1D64FD;
  329. }
  330. }
  331. }
  332. .assistant {
  333. background-color: #f4f6f9;
  334. width: 100%;
  335. height: 100%;
  336. display: flex;
  337. flex-direction: column;
  338. justify-content: space-around;
  339. align-items: center;
  340. .assistant-title {
  341. margin-top: 1rem;
  342. font-family: AlibabaPuHuiTi;
  343. font-weight: bold;
  344. font-size: 50px;
  345. color: #111111;
  346. letter-spacing: 5px;
  347. >span {
  348. font-size: 46px;
  349. color: #FFFFFF;
  350. background: linear-gradient(90deg, #F83C37, #5086FD);
  351. border-radius: 8px;
  352. padding: 6px 16px 6px 0;
  353. }
  354. }
  355. .assistant-main {
  356. display: flex;
  357. gap: 36px;
  358. .assistant-main-list {
  359. width: 579px;
  360. display: flex;
  361. flex-direction: column;
  362. align-items: center;
  363. gap: 24px;
  364. .assistant-main-list-tips {
  365. width: 100%;
  366. display: flex;
  367. justify-content: space-between;
  368. >div {
  369. width: 177px;
  370. height: 56px;
  371. border-radius: 8px;
  372. display: flex;
  373. align-items: center;
  374. justify-content: center;
  375. font-family: Microsoft YaHei;
  376. font-weight: 400;
  377. font-size: 18px;
  378. color: #FFFFFF;
  379. gap: 12px;
  380. &:before {
  381. content: '';
  382. width: 25px;
  383. height: 25px;
  384. }
  385. &:nth-child(1) {
  386. background: linear-gradient(0deg, #677AFD, #8695FD);
  387. &:before {
  388. background-image: url("@/views/smart-ask-answer/assistant/imgs/icon-1.png");
  389. }
  390. }
  391. &:nth-child(2) {
  392. background: linear-gradient(0deg, #2780FD, #579BFC);
  393. &:before {
  394. background-image: url("@/views/smart-ask-answer/assistant/imgs/icon-2.png");
  395. }
  396. }
  397. &:nth-child(3) {
  398. background: linear-gradient(0deg, #F95955, #FE817E);
  399. &:before {
  400. background-image: url("@/views/smart-ask-answer/assistant/imgs/icon-3.png");
  401. }
  402. }
  403. }
  404. }
  405. .assistant-main-list-ask, .assistant-main-list-hot, .assistant-main-list-advise {
  406. width: 100%;
  407. flex: 1;
  408. background: #FFFFFF;
  409. border-radius: 16px;
  410. padding: 24px;
  411. overflow: hidden;
  412. display: flex;
  413. flex-direction: column;
  414. }
  415. .assistant-main-list-ask {
  416. .title_1 {
  417. .clear {
  418. width: 68px;
  419. height: 28px;
  420. background: rgba(211,37,33,0);
  421. border-radius: 4px;
  422. border: 1px solid #1D64FD;
  423. display: flex;
  424. align-items: center;
  425. justify-content: center;
  426. font-family: Microsoft YaHei;
  427. font-weight: 400;
  428. font-size: 14px;
  429. color: #1D64FD;
  430. >img {
  431. margin-right: 4px;
  432. }
  433. }
  434. }
  435. }
  436. .assistant-main-list-hot {
  437. flex-direction: row;
  438. .assistant-main-list-hot-theme {
  439. width: 222px;
  440. .list {
  441. margin-top: 22px;
  442. display: flex;
  443. flex-wrap: wrap;
  444. align-content: flex-start;
  445. height: 118px;
  446. gap: 8px;
  447. .item {
  448. height: 34px;
  449. background: linear-gradient(90deg, #418EFA, #8795FD);
  450. border-radius: 4px;
  451. display: flex;
  452. align-items: center;
  453. justify-content: center;
  454. font-family: Microsoft YaHei;
  455. font-weight: 400;
  456. font-size: 14px;
  457. color: #FFFFFF;
  458. padding: 0 14px;
  459. }
  460. }
  461. }
  462. .assistant-main-list-hot-question {
  463. flex: 1;
  464. margin-left: 24px;
  465. position: relative;
  466. &:before {
  467. content: '';
  468. width: 1px;
  469. height: 163px;
  470. background: #C8D8F0;
  471. position: absolute;
  472. left: -24px;
  473. }
  474. .list_1 {
  475. margin-top: 14px;
  476. }
  477. }
  478. }
  479. .assistant-main-list-advise {
  480. .title_1 {
  481. .options {
  482. display: flex;
  483. align-items: center;
  484. gap: 20px;
  485. font-family: Microsoft YaHei;
  486. font-weight: 400;
  487. font-size: 16px;
  488. color: #1D64FD;
  489. .split {
  490. width: 1px;
  491. height: 14px;
  492. background: #1D64FD;
  493. }
  494. }
  495. }
  496. }
  497. }
  498. .assistant-main-content {
  499. width: 825px;
  500. height: 764px;
  501. }
  502. }
  503. }
  504. .dialog {
  505. width: 100%;
  506. height: 100%;
  507. display: flex;
  508. flex-direction: column;
  509. box-shadow: 0px 8px 20px 0px rgba(197,199,211,0.5);
  510. .dialog-title {
  511. height: 72px;
  512. border-radius: 16px 16px 0px 0px;
  513. display: flex;
  514. align-items: center;
  515. padding: 0 24px;
  516. font-family: Microsoft YaHei;
  517. font-weight: bold;
  518. font-size: 24px;
  519. color: #FFFFFF;
  520. >img {
  521. margin-right: 12px;
  522. width: 28px;
  523. height: 28px;
  524. }
  525. .svg-icon {
  526. margin-left: auto;
  527. }
  528. }
  529. .dialog-content {
  530. flex: 1;
  531. background-color: #ffffff;
  532. border-radius: 0 0 16px 16px;
  533. &.help {
  534. padding: 0 24px;
  535. >div {
  536. padding: 16px 0;
  537. border-bottom: 1px dashed #D8DAE5;
  538. display: flex;
  539. align-items: center;
  540. position: relative;
  541. &:before {
  542. content: '';
  543. min-width: 6px;
  544. min-height: 6px;
  545. background: #D32521;
  546. position: absolute;
  547. top: 26px;
  548. }
  549. &:last-child {
  550. border-bottom: none;
  551. }
  552. >div {
  553. margin-left: 14px;
  554. font-weight: 500;
  555. font-size: 16px;
  556. color: #111111;
  557. line-height: 26px;
  558. text-align: justify;
  559. >em {
  560. font-weight: bold;
  561. }
  562. }
  563. }
  564. }
  565. &.agreement, &.disclaimers {
  566. padding: 20px 12px 20px 38px;
  567. overflow: hidden;
  568. >div {
  569. width: 100%;
  570. height: 100%;
  571. overflow-y: auto;
  572. padding-right: 20px;
  573. text-align: justify;
  574. >div {
  575. font-weight: 400;
  576. font-size: 14px;
  577. color: #111111;
  578. line-height: 30px;
  579. text-indent: 2ch;
  580. &:first-child {
  581. text-indent: 0;
  582. }
  583. &.title {
  584. font-weight: bold;
  585. text-indent: 0;
  586. }
  587. }
  588. }
  589. }
  590. }
  591. }
  592. </style>