gitextract_o3btxkwl/ ├── .gitignore ├── LICENSE ├── README.md ├── talkieai-server/ │ ├── app/ │ │ ├── __init__.py │ │ ├── ai/ │ │ │ ├── __init__.py │ │ │ ├── impl/ │ │ │ │ ├── __init__.py │ │ │ │ ├── chat_gpt_ai.py │ │ │ │ └── zhipu_ai.py │ │ │ ├── interfaces.py │ │ │ └── models.py │ │ ├── api/ │ │ │ ├── __init__.py │ │ │ ├── account_routes.py │ │ │ ├── message_routes.py │ │ │ ├── session_routes.py │ │ │ ├── sys_routes.py │ │ │ └── topics_route.py │ │ ├── config.py │ │ ├── core/ │ │ │ ├── __init__.py │ │ │ ├── auth.py │ │ │ ├── azure_voice.py │ │ │ ├── db_cache.py │ │ │ ├── exceptions.py │ │ │ ├── language.py │ │ │ ├── logging.py │ │ │ └── utils.py │ │ ├── db/ │ │ │ ├── __init__.py │ │ │ ├── account_entities.py │ │ │ ├── chat_entities.py │ │ │ ├── sys_entities.py │ │ │ └── topic_entities.py │ │ ├── main.py │ │ ├── models/ │ │ │ ├── __init__.py │ │ │ ├── account_models.py │ │ │ ├── chat_models.py │ │ │ ├── response.py │ │ │ ├── sys_models.py │ │ │ └── topic_models.py │ │ └── services/ │ │ ├── __init__.py │ │ ├── account_service.py │ │ ├── chat_service.py │ │ ├── sys_service.py │ │ └── topic_service.py │ ├── data/ │ │ ├── azure.json │ │ ├── azure_style_label.json │ │ ├── default_topic_data.json │ │ ├── language_demo_map.json │ │ └── sys_language.json │ ├── requirements.txt │ └── start.sh └── talkieai-uniapp/ ├── index.html ├── package.json ├── src/ │ ├── App.vue │ ├── api/ │ │ ├── account.ts │ │ ├── chat.ts │ │ ├── sys.ts │ │ └── topic.ts │ ├── axios/ │ │ ├── api.ts │ │ ├── axiosServer.ts │ │ └── axiosService.ts │ ├── components/ │ │ ├── AudioPlayer.vue │ │ ├── Checkbox.vue │ │ ├── Collect.vue │ │ ├── CommonHeader.vue │ │ ├── FunctionalText.vue │ │ ├── GithubLink.vue │ │ ├── Loading.vue │ │ ├── LoadingRound.vue │ │ ├── Rare2.vue │ │ ├── Rate.vue │ │ ├── Speech.vue │ │ ├── WordAnalysisPopup.vue │ │ ├── audioPlayerExecuter.ts │ │ └── speechExecuter.ts │ ├── config/ │ │ └── env.ts │ ├── env.d.ts │ ├── global/ │ │ └── globalCount.hooks.ts │ ├── less/ │ │ └── global.less │ ├── main.ts │ ├── manifest.json │ ├── models/ │ │ ├── chat.ts │ │ ├── models.ts │ │ └── sys.ts │ ├── pages/ │ │ ├── chat/ │ │ │ ├── components/ │ │ │ │ ├── CommonAudioPlayer.vue │ │ │ │ ├── MessageContent.vue │ │ │ │ ├── MessageGrammar.vue │ │ │ │ ├── MessageGrammarPopup.vue │ │ │ │ ├── MessagePronunciation.vue │ │ │ │ ├── MessageSpeech.vue │ │ │ │ ├── PhonemeBox.vue │ │ │ │ ├── Prompt.vue │ │ │ │ ├── PromptPopup.vue │ │ │ │ ├── TextPronunciation.vue │ │ │ │ ├── TranslationPopup.vue │ │ │ │ └── WordDetail.vue │ │ │ ├── index.vue │ │ │ └── settings.vue │ │ ├── contact/ │ │ │ ├── index.vue │ │ │ └── less/ │ │ │ └── index.less │ │ ├── feedback/ │ │ │ ├── index.vue │ │ │ └── less/ │ │ │ └── index.less │ │ ├── index/ │ │ │ ├── components/ │ │ │ │ └── Topics.vue │ │ │ ├── index.vue │ │ │ └── switchRole.vue │ │ ├── login/ │ │ │ ├── index.vue │ │ │ └── service.ts │ │ ├── my/ │ │ │ ├── index.vue │ │ │ ├── learnLanguage.vue │ │ │ └── less/ │ │ │ └── index.less │ │ ├── practice/ │ │ │ ├── components/ │ │ │ │ ├── Single.vue │ │ │ │ └── Statement.vue │ │ │ └── index.vue │ │ └── topic/ │ │ ├── completion.vue │ │ ├── history.vue │ │ ├── index.vue │ │ ├── phrase.vue │ │ └── topicCreate.vue │ ├── pages.json │ ├── shime-uni.d.ts │ ├── uni.scss │ ├── uni_modules/ │ │ ├── uni-badge/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-badge/ │ │ │ │ └── uni-badge.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-calendar/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-calendar/ │ │ │ │ ├── calendar.js │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ ├── uni-calendar-item.vue │ │ │ │ ├── uni-calendar.vue │ │ │ │ └── util.js │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-card/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-card/ │ │ │ │ └── uni-card.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-collapse/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-collapse/ │ │ │ │ │ └── uni-collapse.vue │ │ │ │ └── uni-collapse-item/ │ │ │ │ └── uni-collapse-item.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-combox/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-combox/ │ │ │ │ └── uni-combox.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-countdown/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-countdown/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ └── uni-countdown.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-data-checkbox/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-data-checkbox/ │ │ │ │ └── uni-data-checkbox.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-data-picker/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-data-picker/ │ │ │ │ │ ├── keypress.js │ │ │ │ │ └── uni-data-picker.vue │ │ │ │ └── uni-data-pickerview/ │ │ │ │ ├── uni-data-picker.js │ │ │ │ └── uni-data-pickerview.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-data-select/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-data-select/ │ │ │ │ └── uni-data-select.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-dateformat/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-dateformat/ │ │ │ │ ├── date-format.js │ │ │ │ └── uni-dateformat.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-datetime-picker/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-datetime-picker/ │ │ │ │ ├── calendar-item.vue │ │ │ │ ├── calendar.vue │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ ├── time-picker.vue │ │ │ │ ├── uni-datetime-picker.vue │ │ │ │ └── util.js │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-drawer/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-drawer/ │ │ │ │ ├── keypress.js │ │ │ │ └── uni-drawer.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-easyinput/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-easyinput/ │ │ │ │ ├── common.js │ │ │ │ └── uni-easyinput.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-fab/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-fab/ │ │ │ │ └── uni-fab.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-fav/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-fav/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ └── uni-fav.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-file-picker/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-file-picker/ │ │ │ │ ├── choose-and-upload-file.js │ │ │ │ ├── uni-file-picker.vue │ │ │ │ ├── upload-file.vue │ │ │ │ ├── upload-image.vue │ │ │ │ └── utils.js │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-forms/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-forms/ │ │ │ │ │ ├── uni-forms.vue │ │ │ │ │ ├── utils.js │ │ │ │ │ └── validate.js │ │ │ │ └── uni-forms-item/ │ │ │ │ └── uni-forms-item.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-goods-nav/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-goods-nav/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ └── uni-goods-nav.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-grid/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-grid/ │ │ │ │ │ └── uni-grid.vue │ │ │ │ └── uni-grid-item/ │ │ │ │ └── uni-grid-item.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-group/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-group/ │ │ │ │ └── uni-group.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-icons/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-icons/ │ │ │ │ ├── icons.js │ │ │ │ ├── uni-icons.vue │ │ │ │ └── uniicons.css │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-indexed-list/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-indexed-list/ │ │ │ │ ├── uni-indexed-list-item.vue │ │ │ │ └── uni-indexed-list.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-link/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-link/ │ │ │ │ └── uni-link.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-list/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-list/ │ │ │ │ │ ├── uni-list.vue │ │ │ │ │ ├── uni-refresh.vue │ │ │ │ │ └── uni-refresh.wxs │ │ │ │ ├── uni-list-ad/ │ │ │ │ │ └── uni-list-ad.vue │ │ │ │ ├── uni-list-chat/ │ │ │ │ │ ├── uni-list-chat.scss │ │ │ │ │ └── uni-list-chat.vue │ │ │ │ └── uni-list-item/ │ │ │ │ └── uni-list-item.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-load-more/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-load-more/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ └── uni-load-more.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-nav-bar/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-nav-bar/ │ │ │ │ ├── uni-nav-bar.vue │ │ │ │ └── uni-status-bar.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-notice-bar/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-notice-bar/ │ │ │ │ └── uni-notice-bar.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-number-box/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-number-box/ │ │ │ │ └── uni-number-box.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-pagination/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-pagination/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── es.json │ │ │ │ │ ├── fr.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ └── uni-pagination.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-popup/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-popup/ │ │ │ │ │ ├── i18n/ │ │ │ │ │ │ ├── en.json │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ │ └── zh-Hant.json │ │ │ │ │ ├── keypress.js │ │ │ │ │ ├── popup.js │ │ │ │ │ └── uni-popup.vue │ │ │ │ ├── uni-popup-dialog/ │ │ │ │ │ ├── keypress.js │ │ │ │ │ └── uni-popup-dialog.vue │ │ │ │ ├── uni-popup-message/ │ │ │ │ │ └── uni-popup-message.vue │ │ │ │ └── uni-popup-share/ │ │ │ │ └── uni-popup-share.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-rate/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-rate/ │ │ │ │ └── uni-rate.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-row/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-col/ │ │ │ │ │ └── uni-col.vue │ │ │ │ └── uni-row/ │ │ │ │ └── uni-row.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-scss/ │ │ │ ├── changelog.md │ │ │ ├── index.scss │ │ │ ├── package.json │ │ │ ├── readme.md │ │ │ ├── styles/ │ │ │ │ ├── index.scss │ │ │ │ ├── setting/ │ │ │ │ │ ├── _border.scss │ │ │ │ │ ├── _color.scss │ │ │ │ │ ├── _radius.scss │ │ │ │ │ ├── _space.scss │ │ │ │ │ ├── _styles.scss │ │ │ │ │ ├── _text.scss │ │ │ │ │ └── _variables.scss │ │ │ │ └── tools/ │ │ │ │ └── functions.scss │ │ │ ├── theme.scss │ │ │ └── variables.scss │ │ ├── uni-search-bar/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-search-bar/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ ├── index.js │ │ │ │ │ ├── zh-Hans.json │ │ │ │ │ └── zh-Hant.json │ │ │ │ └── uni-search-bar.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-section/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-section/ │ │ │ │ └── uni-section.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-segmented-control/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-segmented-control/ │ │ │ │ └── uni-segmented-control.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-steps/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-steps/ │ │ │ │ └── uni-steps.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-swipe-action/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-swipe-action/ │ │ │ │ │ └── uni-swipe-action.vue │ │ │ │ └── uni-swipe-action-item/ │ │ │ │ ├── bindingx.js │ │ │ │ ├── isPC.js │ │ │ │ ├── mpalipay.js │ │ │ │ ├── mpother.js │ │ │ │ ├── mpwxs.js │ │ │ │ ├── render.js │ │ │ │ ├── uni-swipe-action-item.vue │ │ │ │ └── wx.wxs │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-swiper-dot/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-swiper-dot/ │ │ │ │ └── uni-swiper-dot.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-table/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ ├── uni-table/ │ │ │ │ │ └── uni-table.vue │ │ │ │ ├── uni-tbody/ │ │ │ │ │ └── uni-tbody.vue │ │ │ │ ├── uni-td/ │ │ │ │ │ └── uni-td.vue │ │ │ │ ├── uni-th/ │ │ │ │ │ ├── filter-dropdown.vue │ │ │ │ │ └── uni-th.vue │ │ │ │ ├── uni-thead/ │ │ │ │ │ └── uni-thead.vue │ │ │ │ └── uni-tr/ │ │ │ │ ├── table-checkbox.vue │ │ │ │ └── uni-tr.vue │ │ │ ├── i18n/ │ │ │ │ ├── en.json │ │ │ │ ├── es.json │ │ │ │ ├── fr.json │ │ │ │ ├── index.js │ │ │ │ ├── zh-Hans.json │ │ │ │ └── zh-Hant.json │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-tag/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-tag/ │ │ │ │ └── uni-tag.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-title/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-title/ │ │ │ │ └── uni-title.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-tooltip/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-tooltip/ │ │ │ │ └── uni-tooltip.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ ├── uni-transition/ │ │ │ ├── changelog.md │ │ │ ├── components/ │ │ │ │ └── uni-transition/ │ │ │ │ ├── createAnimation.js │ │ │ │ └── uni-transition.vue │ │ │ ├── package.json │ │ │ └── readme.md │ │ └── uni-ui/ │ │ ├── changelog.md │ │ ├── components/ │ │ │ └── uni-ui/ │ │ │ └── uni-ui.vue │ │ ├── package.json │ │ └── readme.md │ └── utils/ │ ├── bus.ts │ └── utils.ts ├── tsconfig.json └── vite.config.ts