From 1b555a0ab0527478cdf2b0c31c0ea8aea70f8adc Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期四, 15 六月 2023 10:52:39 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into yxh01

---
 src/assets/styles/index.scss                            |    0 
 src/assets/icons/svg/eye.svg                            |    0 
 src/api/smartor/ivrtasksms.js                           |    0 
 src/api/smartor/svyexception.js                         |    0 
 src/views/components/icons/index.vue                    |    0 
 src/layout/index.vue                                    |    0 
 src/views/smartor/ivrtaskcalldetail/index.vue           |    0 
 src/views/system/user/authRole.vue                      |    0 
 src/api/system/notice.js                                |    0 
 src/assets/icons/svg/cascader.svg                       |    0 
 src/views/tool/build/CodeTypeDialog.vue                 |    0 
 src/views/dashboard/BarChart.vue                        |    0 
 src/api/smartor/smsparam.js                             |    0 
 src/assets/icons/svg/tool.svg                           |    0 
 src/api/login.js                                        |    0 
 src/assets/icons/svg/radio.svg                          |    0 
 src/assets/401_images/401.gif                           |    0 
 src/utils/generator/config.js                           |    0 
 src/utils/generator/html.js                             |    0 
 src/components/SizeSelect/index.vue                     |   61 
 src/views/smartor/svytopic/maint.vue                    |    0 
 bin/run-web.bat                                         |    0 
 src/utils/dict/DictData.js                              |    0 
 src/api/tool/gen.js                                     |    0 
 src/assets/styles/element-variables.scss                |    2 
 src/views/patient/patient/profile/resetPwd.vue          |    0 
 src/assets/icons/svg/time.svg                           |    0 
 src/components/TopNav/index.vue                         |   63 
 src/api/smartor/schemeplan.js                           |    0 
 src/directive/permission/hasPermi.js                    |    0 
 src/views/smartor/svyfinishoption/index.vue             |    0 
 src/assets/icons/svg/upload.svg                         |    0 
 src/assets/icons/svg/theme.svg                          |    0 
 src/api/smartor/ivrtemplatetarget.js                    |    0 
 src/assets/icons/svg/guide.svg                          |    0 
 src/views/error/401.vue                                 |    0 
 src/smartor/dataobject/dw_svytopic_maint.vue            |    0 
 src/views/tool/gen/editTable.vue                        |    0 
 src/views/tool/gen/importTable.vue                      |    0 
 src/assets/icons/svg/job.svg                            |    0 
 src/api/smartor/ivrtarget.js                            |    0 
 src/api/smartor/patinhosp.js                            |    0 
 src/api/smartor/svyfinishtopic.js                       |    0 
 src/assets/icons/svg/checkbox.svg                       |    0 
 src/views/patient/patient/authRole.vue                  |    0 
 public/index.html                                       |    0 
 src/views/system/dept/index.vue                         |    0 
 src/utils/generator/render.js                           |    0 
 src/api/smartor/schemetaskrepeatconfig.js               |    0 
 src/views/smartor/ivrlibscriptmodel/index.vue           |    0 
 src/views/smartor/ivrtemplatetarget/index.vue           |    0 
 src/api/smartor/smsrecords.js                           |    0 
 src/views/smartor/schemetriggerrule/index.vue           |    0 
 src/views/knowledge/questionnaire/examine/index.vue     |  310 +
 src/views/smartor/svytitle/index.vue                    |    0 
 src/plugins/download.js                                 |    0 
 src/assets/icons/svg/language.svg                       |    0 
 src/assets/icons/svg/github.svg                         |    0 
 src/components/PageTools/index.vue                      |   42 
 src/views/smartor/ivrlibascript/index.vue               |    0 
 src/views/dashboard/PieChart.vue                        |    0 
 src/assets/styles/btn.scss                              |    0 
 src/views/dashboard/mixins/resize.js                    |    0 
 src/views/smartor/ivrtaskcallrecord/index.vue           |    0 
 src/assets/icons/svg/row.svg                            |    0 
 src/assets/icons/svg/link.svg                           |    0 
 src/utils/generator/icon.json                           |    0 
 src/assets/icons/svg/druid.svg                          |    0 
 src/views/register.vue                                  |  121 
 src/api/system/category.js                              |    0 
 src/layout/components/Sidebar/Logo.vue                  |  128 
 bin/package.bat                                         |    0 
 src/assets/icons/svg/input.svg                          |    0 
 src/assets/icons/svg/validCode.svg                      |    0 
 src/views/smartor/ivrextemplate/index.vue               |    0 
 src/assets/icons/svg/icon.svg                           |    0 
 src/smartor/dataobject/dw_patouthosp_base.vue           |    0 
 src/views/tool/gen/basicInfoForm.vue                    |    0 
 src/views/knowledge/questionbank/index.vue              |  987 +++++
 src/assets/icons/svg/rate.svg                           |    0 
 src/api/smartor/schemeautofinshrule.js                  |    0 
 src/components/Pagination/index.vue                     |    3 
 src/assets/icons/svg/phone.svg                          |    0 
 src/assets/icons/svg/size.svg                           |    0 
 src/assets/icons/svg/system.svg                         |    0 
 src/api/smartor/svytitle.js                             |    0 
 src/constant/employees.js                               |  429 ++
 src/api/smartor/ivrscripttarget.js                      |    0 
 src/assets/images/dark.svg                              |    0 
 src/api/monitor/job.js                                  |    0 
 src/components/RuoYi/Git/index.vue                      |    0 
 src/api/smartor/ivrscenecategory.js                     |    0 
 src/plugins/tab.js                                      |    0 
 src/api/knowledge/questionbank.js                       |   11 
 src/utils/errorCode.js                                  |    0 
 src/components/HeaderSearch/index.vue                   |    1 
 src/api/smartor/svyfinishoption.js                      |    0 
 src/views/smartor/ivrglobalconfig/index.vue             |    0 
 src/assets/icons/svg/international.svg                  |    0 
 src/views/smartor/ivrquestionlib/QuestionMaint.vue      |    0 
 src/api/smartor/ivrintent.js                            |    0 
 src/api/smartor/ivrtaskcalldetail.js                    |    0 
 src/components/RightPanel/index.vue                     |    0 
 src/views/monitor/job/index.vue                         |    2 
 src/assets/icons/svg/pdf.svg                            |    0 
 src/views/smartor/hecategory/index.vue                  |    0 
 src/api/smartor/ivrlibintent.js                         |    0 
 src/components/RightToolbar/index.vue                   |   42 
 src/views/monitor/online/index.vue                      |    0 
 src/views/smartor/ivrtasksms/index.vue                  |    0 
 src/views/tool/swagger/index.vue                        |    0 
 src/views/tool/gen/genInfoForm.vue                      |    0 
 src/assets/icons/svg/search.svg                         |    0 
 src/layout/components/IframeToggle/index.vue            |    0 
 package.json                                            |   10 
 src/views/smartor/smsrecords/index.vue                  |    0 
 src/components/IconSelect/requireIcons.js               |    0 
 src/components/Crontab/index.vue                        |    0 
 src/api/knowledge/questionnaire.js                      |   11 
 vue.config.js                                           |    0 
 src/views/smartor/ivrlibscript/index.vue                |    0 
 src/assets/icons/svg/shopping.svg                       |    0 
 src/assets/common/head.jpg                              |    0 
 src/api/smartor/ivrflownode.js                          |    0 
 src/assets/icons/svg/button.svg                         |    0 
 src/views/smartor/patouthosp/index.vue                  |    0 
 src/assets/icons/svg/peoples.svg                        |    0 
 src/store/modules/settings.js                           |    2 
 src/assets/icons/svg/tab.svg                            |    0 
 src/api/smartor/patphysical.js                          |    0 
 src/api/smartor/schemecalldetail.js                     |    0 
 src/views/smartor/ivrexecuteconfig/index.vue            |    0 
 src/assets/icons/svg/online.svg                         |    0 
 src/views/monitor/job/log.vue                           |    0 
 src/components/ImageUpload/index.vue                    |   61 
 src/views/dashboard/PanelGroup.vue                      |    0 
 src/smartor/dataobject/dw_patouthosp_list.vue           |    0 
 src/assets/icons/svg/404.svg                            |    0 
 src/store/modules/user.js                               |    0 
 src/store/index.js                                      |    0 
 src/views/smartor/ivrtask/index.vue                     |    0 
 src/api/system/dict/data.js                             |    0 
 src/assets/icons/svg/tree-table.svg                     |    0 
 src/assets/icons/svg/documentation.svg                  |    0 
 src/assets/common/leftnavBg.png                         |    0 
 src/layout/components/Sidebar/Link.vue                  |    0 
 src/components/ParentView/index.vue                     |    0 
 src/plugins/index.js                                    |    0 
 src/utils/index.js                                      |    0 
 src/api/monitor/cache.js                                |    0 
 src/api/smartor/ivrrecall.js                            |    0 
 src/directive/module/clipboard.js                       |    0 
 src/assets/icons/svg/people.svg                         |    0 
 src/views/monitor/cache/list.vue                        |    0 
 src/views/redirect.vue                                  |    0 
 src/api/smartor/ivrscript.js                            |    0 
 src/views/smartor/ivrflownode/index.vue                 |    0 
 src/views/smartor/ivrrecall/index.vue                   |    0 
 src/components/Crontab/month.vue                        |    0 
 src/views/system/menu/index.vue                         |    0 
 src/api/smartor/ivrtask.js                              |    0 
 src/directive/index.js                                  |    0 
 src/api/smartor/svytopic.js                             |    0 
 src/assets/icons/svg/server.svg                         |    0 
 src/layout/components/Sidebar/index.vue                 |   79 
 src/api/smartor/ivrextemplate.js                        |    0 
 src/components/UploadImg/index.vue                      |  116 
 src/api/smartor/patouthosp.js                           |    0 
 src/api/system/user.js                                  |    2 
 src/assets/icons/svg/table.svg                          |    0 
 src/assets/styles/sidebar.scss                          |    7 
 src/assets/styles/element-ui.scss                       |    0 
 src/utils/dict/DictConverter.js                         |    0 
 src/views/knowledge/education/index.vue                 |  816 ++++
 src/assets/icons/svg/redis-list.svg                     |    0 
 src/views/patient/patient/profile/userAvatar.vue        |    0 
 src/assets/icons/svg/star.svg                           |    0 
 src/assets/icons/svg/code.svg                           |    0 
 src/smartor/dataobject/dw_patinhosp_base.vue            |    0 
 src/views/index.vue                                     |    0 
 src/assets/icons/svg/fullscreen.svg                     |    0 
 src/assets/icons/index.js                               |    0 
 src/assets/icons/svg/dashboard.svg                      |    0 
 src/views/system/user/profile/userAvatar.vue            |    0 
 src/api/smartor/ivrlibscriptmodel.js                    |    0 
 src/components/Screenfull/index.vue                     |    1 
 src/views/index_v1.vue                                  |    0 
 src/assets/icons/svg/date.svg                           |    0 
 src/api/system/dept.js                                  |    0 
 src/api/system/tag.js                                   |   44 
 src/views/system/role/authUser.vue                      |    0 
 src/views/smartor/ivrlibintentcategory/index.vue        |    0 
 public/favicon.ico                                      |    0 
 .editorconfig                                           |    0 
 src/assets/icons/svg/nested.svg                         |    0 
 src/components/PanThumb/index.vue                       |    1 
 src/views/tool/build/index.vue                          |    0 
 src/permission.js                                       |    0 
 src/assets/icons/svg/monitor.svg                        |    0 
 src/utils/scroll-to.js                                  |    0 
 src/api/smartor/ivrtaskcall.js                          |    0 
 src/views/system/user/profile/index.vue                 |    0 
 src/assets/styles/transition.scss                       |    0 
 src/assets/icons/svg/time-range.svg                     |    0 
 src/api/patient/homepage.js                             |   72 
 README.md                                               |    0 
 src/plugins/modal.js                                    |    0 
 src/api/smartor/svyresult.js                            |    0 
 src/main.js                                             |   17 
 src/components/DictData/index.js                        |    0 
 src/api/smartor/svyfinish.js                            |    0 
 src/layout/components/TagsView/ScrollPane.vue           |    0 
 src/layout/components/index.js                          |    0 
 src/views/smartor/ivrintent/index.vue                   |    0 
 src/views/smartor/svyfinishtopic/index.vue              |    0 
 src/views/smartor/schemetaskrecord/index.vue            |    0 
 src/api/smartor/hecategory.js                           |    0 
 src/views/tool/build/RightPanel.vue                     |    0 
 src/layout/components/Navbar.vue                        |    0 
 src/smartor/dataobject/dw_patarchive_base.vue           |    0 
 src/views/smartor/ivrscenecategory/index.vue            |    0 
 src/layout/components/Sidebar/SidebarItem.vue           |    0 
 src/views/knowledge/education/compilequer/index.vue     |  866 +++++
 public/html/ie.html                                     |    0 
 src/assets/icons/svg/redis.svg                          |    0 
 src/views/smartor/patinhosp/index.vue                   |    0 
 src/components/DictTag/index.vue                        |    4 
 src/views/smartor/schemetaskrepeatconfig/index.vue      |    0 
 src/api/smartor/smstemplet.js                           |    0 
 src/assets/icons/svg/swagger.svg                        |    0 
 src/store/modules/permission.js                         |    0 
 src/utils/validate.js                                   |    0 
 src/utils/permission.js                                 |    0 
 src/store/modules/dict.js                               |    0 
 src/views/dashboard/LineChart.vue                       |    0 
 src/views/smartor/svytopic/index1.vue                   |    0 
 src/api/system/post.js                                  |    0 
 src/assets/icons/svg/tree.svg                           |    0 
 src/directive/permission/hasRole.js                     |    0 
 src/views/components/icons/element-icons.js             |    0 
 src/api/smartor/smsaccount.js                           |    0 
 src/assets/icons/svg/select.svg                         |    0 
 src/views/smartor/ivrlibintent/index.vue                |    0 
 src/assets/icons/svg/component.svg                      |    0 
 src/assets/icons/svg/clipboard.svg                      |    0 
 src/assets/icons/svg/download.svg                       |    0 
 src/views/patient/patient/index.vue                     |  993 +++++
 src/assets/images/light.svg                             |    0 
 src/utils/generator/drawingDefault.js                   |    0 
 public/robots.txt                                       |    0 
 src/views/smartor/ivrscript/index.vue                   |    0 
 src/views/monitor/operlog/index.vue                     |    0 
 src/views/smartor/ivrscriptmodel/index.vue              |    0 
 src/views/tool/build/IconsDialog.vue                    |    0 
 src/views/tool/build/DraggableItem.vue                  |    0 
 src/smartor/dataobject/dw_svytopicoption_maint.vue      |    0 
 src/api/monitor/jobLog.js                               |    0 
 src/views/smartor/svytopic/index.vue                    |    0 
 src/views/monitor/cache/index.vue                       |    0 
 src/views/error/404.vue                                 |    0 
 src/directive/dialog/dragHeight.js                      |    0 
 src/settings.js                                         |    0 
 src/views/smartor/schemetaskconfig/index.vue            |    0 
 src/assets/icons/svg/user.svg                           |    0 
 src/components/Breadcrumb/index.vue                     |   83 
 src/filters/index.js                                    |    5 
 .env.development                                        |    0 
 src/assets/icons/svg/form.svg                           |    0 
 src/store/modules/tagsView.js                           |    0 
 src/views/smartor/schemelibrary/index.vue               |    0 
 src/views/patient/patient/profile/index.vue             |  767 ++++
 src/assets/icons/svg/chart.svg                          |    0 
 src/assets/icons/svg/switch.svg                         |    0 
 src/assets/styles/mixin.scss                            |    0 
 src/views/smartor/svycategory/index.vue                 |    0 
 src/views/system/role/index.vue                         |    0 
 src/views/smartor/svyresult/index.vue                   |    0 
 src/assets/icons/svg/log.svg                            |    0 
 src/utils/ruoyi.js                                      |    0 
 src/api/smartor/schemecategory.js                       |    0 
 src/assets/icons/svg/date-range.svg                     |    0 
 src/components/UploadExcel/index.vue                    |  169 +
 src/views/monitor/server/index.vue                      |    0 
 src/views/smartor/schemeautofinshrule/index.vue         |    0 
 src/api/smartor/ivrscene.js                             |    0 
 src/directives/index.js                                 |   22 
 src/views/system/dict/data.vue                          |    0 
 src/directive/dialog/drag.js                            |    0 
 src/api/smartor/schemetaskrecord.js                     |    0 
 src/layout/mixin/ResizeHandler.js                       |    0 
 src/assets/icons/svg/qq.svg                             |    0 
 src/views/smartor/smstemplet/index.vue                  |    0 
 babel.config.js                                         |    0 
 src/views/system/user/profile/userInfo.vue              |    0 
 src/components/iFrame/index.vue                         |    1 
 src/components/ThemePicker/index.vue                    |    1 
 src/api/smartor/ivrlibintentcategory.js                 |    0 
 src/components/RuoYi/Doc/index.vue                      |    0 
 src/views/smartor/schemecalldetail/index.vue            |    0 
 src/api/smartor/ivrscriptmodel.js                       |    0 
 src/plugins/auth.js                                     |    0 
 src/assets/icons/svg/dict.svg                           |    0 
 src/views/smartor/svyfinish/index.vue                   |    0 
 src/api/smartor/ivrlibscriptcategory.js                 |    0 
 src/assets/icons/svg/wechat.svg                         |    0 
 .eslintrc.js                                            |    0 
 src/api/smartor/schemelibrary.js                        |    0 
 src/assets/icons/svg/number.svg                         |    0 
 src/views/smartor/patarchive/index0.vue                 |    0 
 src/assets/icons/svg/exit-fullscreen.svg                |    0 
 src/router/index.js                                     |    0 
 src/layout/components/Sidebar/FixiOSBug.js              |    0 
 src/assets/icons/svg/money.svg                          |    0 
 src/api/smartor/ivrtemplate.js                          |    0 
 src/api/smartor/svycategory.js                          |    0 
 src/components/FileUpload/index.vue                     |   57 
 src/views/system/dict/index.vue                         |    0 
 src/assets/404_images/404.png                           |    0 
 src/api/monitor/online.js                               |    0 
 src/components/Crontab/year.vue                         |    0 
 .gitignore                                              |    0 
 src/utils/generator/css.js                              |    0 
 src/views/monitor/druid/index.vue                       |    0 
 src/api/smartor/svytopicoption.js                       |    0 
 src/views/smartor/svytitle/index0.vue                   |    0 
 src/views/smartor/ivrlibscriptcategory/index.vue        |    0 
 src/views/system/label/index.vue                        |  730 ++++
 src/views/system/role/selectUser.vue                    |    0 
 src/views/smartor/ivrflow/index.vue                     |    0 
 src/assets/icons/svg/education.svg                      |    0 
 src/api/smartor/ivrlibascript.js                        |    0 
 src/smartor/components/dataview/xformview/xformview.vue |    0 
 src/assets/404_images/404_cloud.png                     |    0 
 src/api/knowledge/education.js                          |   62 
 src/components/SvgIcon/index.vue                        |   67 
 src/components/Crontab/day.vue                          |    0 
 src/views/smartor/ivrtemplatescript/index.vue           |    0 
 src/api/monitor/server.js                               |    0 
 src/components/IconSelect/index.vue                     |   82 
 src/views/system/user/index.vue                         |    0 
 src/views/login.vue                                     |  108 
 src/api/smartor/helibrary.js                            |    0 
 src/App.vue                                             |    0 
 src/assets/images/login-background.jpg                  |    0 
 src/api/smartor/ivrflow.js                              |    0 
 src/assets/icons/svg/message.svg                        |    0 
 src/utils/dict/Dict.js                                  |    0 
 src/assets/icons/svg/drag.svg                           |    0 
 src/views/knowledge/questionnaire/compilequer/index.vue | 1006 +++++
 src/assets/icons/svg/textarea.svg                       |    0 
 src/assets/icons/svgo.yml                               |    0 
 bin/fix.txt                                             |    0 
 src/views/smartor/smsparam/index.vue                    |    0 
 src/views/monitor/logininfor/index.vue                  |    0 
 src/assets/styles/ruoyi.scss                            |    0 
 src/assets/icons/svg/list.svg                           |    0 
 src/views/smartor/ivrscene/index.vue                    |    0 
 src/views/smartor/smsaccount/index.vue                  |    0 
 src/assets/icons/svg/eye-open.svg                       |    0 
 src/api/system/menu.js                                  |    0 
 src/views/smartor/ivrtarget/index.vue                   |    0 
 src/views/knowledge/education/examine/index.vue         |  304 +
 src/views/smartor/helibrary/index.vue                   |    0 
 src/components/Hamburger/index.vue                      |    1 
 src/views/tool/gen/index.vue                            |    0 
 src/views/smartor/schemetask/index.vue                  |    0 
 src/views/knowledge/questionnaire/index.vue             |  780 ++++
 src/assets/icons/svg/password.svg                       |    0 
 src/components/ImagePreview/index.vue                   |    1 
 src/api/smartor/schemetriggerscene.js                   |    0 
 src/views/smartor/svyexception/index.vue                |    0 
 src/api/smartor/patarchive.js                           |    0 
 src/views/patient/patient/profile/userInfo.vue          |    0 
 src/views/smartor/schemeplan/index.vue                  |    0 
 src/smartor/dataobject/dw_svytopicoption_list.vue       |    0 
 src/assets/icons/svg/question.svg                       |    0 
 src/assets/icons/svg/zip.svg                            |    0 
 src/components/Crontab/hour.vue                         |    0 
 src/components/index.js                                 |   11 
 src/views/smartor/patarchive/index.vue                  |    0 
 src/components/Crontab/result.vue                       |    0 
 src/assets/icons/svg/edit.svg                           |    0 
 src/api/smartor/ivrtemplatescript.js                    |    0 
 src/api/system/label.js                                 |   62 
 src/smartor/dataobject/dw_svytopic_view.vue             |    0 
 src/components/Editor/index.vue                         |    1 
 src/api/monitor/logininfor.js                           |    0 
 src/directive/dialog/dragWidth.js                       |    0 
 src/assets/icons/svg/skill.svg                          |    0 
 src/views/system/category/index.vue                     |    0 
 src/views/smartor/ivrscripttarget/index.vue             |    0 
 src/store/modules/app.js                                |    0 
 src/assets/icons/svg/excel.svg                          |    0 
 src/assets/styles/variables.scss                        |   10 
 src/assets/images/profile.jpg                           |    0 
 src/api/smartor/ivrextemplatescript.js                  |    0 
 src/layout/components/TagsView/index.vue                |    0 
 src/smartor/components/dataview/xgridview/xgridview.vue |    0 
 src/views/smartor/ivrtaskcall/index.vue                 |    0 
 src/utils/request.js                                    |    0 
 build/index.js                                          |    0 
 src/views/system/user/profile/resetPwd.vue              |    0 
 src/layout/components/AppMain.vue                       |    0 
 .eslintignore                                           |    0 
 src/assets/icons/svg/post.svg                           |    0 
 src/views/smartor/ivrtemplate/index.vue                 |    0 
 src/views/smartor/svytitle/index1.vue                   |    0 
 src/components/Crontab/second.vue                       |    0 
 src/assets/icons/svg/build.svg                          |    0 
 src/api/system/config.js                                |    0 
 src/api/smartor/ivrflownodebranch.js                    |    0 
 src/utils/auth.js                                       |    0 
 src/views/dashboard/RaddarChart.vue                     |    0 
 src/layout/components/InnerLink/index.vue               |    0 
 src/api/system/dict/type.js                             |    0 
 src/views/import/index.vue                              |   55 
 src/store/getters.js                                    |    0 
 src/api/smartor/ivrlibscript.js                         |    0 
 src/api/smartor/ivrglobalconfig.js                      |    0 
 src/utils/dict/index.js                                 |    0 
 src/views/system/post/index.vue                         |    0 
 src/api/smartor/schemetask.js                           |    0 
 src/assets/icons/svg/example.svg                        |    0 
 src/utils/generator/js.js                               |    0 
 src/layout/components/Sidebar/Item.vue                  |    0 
 src/views/smartor/svytopicoption/index.vue              |    0 
 src/assets/icons/svg/logininfor.svg                     |    0 
 src/views/smartor/schemecategory/index.vue              |    0 
 src/api/smartor/ivrtaskcallrecord.js                    |    0 
 src/views/smartor/patphysical/index.vue                 |    0 
 .env.production                                         |    0 
 src/views/system/notice/index.vue                       |    0 
 src/layout/components/Settings/index.vue                |  322 +
 bin/build.bat                                           |    0 
 src/assets/icons/svg/lock.svg                           |    0 
 src/views/system/config/index.vue                       |    0 
 src/api/system/role.js                                  |    0 
 src/views/smartor/schemetriggerscene/index.vue          |    0 
 src/smartor/dataobject/dw_patarchive_list.vue           |    0 
 src/utils/jsencrypt.js                                  |    0 
 src/api/smartor/schemetaskconfig.js                     |    0 
 src/components/Crontab/min.vue                          |    0 
 .env.staging                                            |    0 
 src/views/smartor/ivrflownodebranch/index.vue           |    0 
 src/assets/icons/svg/bug.svg                            |    0 
 src/views/tool/build/TreeNodeDialog.vue                 |    0 
 src/api/smartor/ivrexecuteconfig.js                     |    0 
 src/api/monitor/operlog.js                              |    0 
 src/assets/icons/svg/email.svg                          |    0 
 src/views/smartor/svytopicoption/index1.vue             |    0 
 src/utils/dict/DictOptions.js                           |    0 
 src/assets/icons/svg/color.svg                          |    0 
 src/assets/icons/svg/slider.svg                         |    0 
 src/views/smartor/ivrextemplatescript/index.vue         |    0 
 src/assets/logo/logo.png                                |    0 
 src/api/menu.js                                         |    0 
 src/views/components/icons/svg-icons.js                 |    0 
 src/utils/dict/DictMeta.js                              |    0 
 /dev/null                                               |   57 
 src/plugins/cache.js                                    |    0 
 src/components/Crontab/week.vue                         |    0 
 src/api/smartor/schemetriggerrule.js                    |    0 
 src/smartor/dataobject/dw_patinhosp_list.vue            |    0 
 463 files changed, 9,845 insertions(+), 223 deletions(-)

diff --git a/ruoyi-ui/.editorconfig b/.editorconfig
similarity index 100%
rename from ruoyi-ui/.editorconfig
rename to .editorconfig
diff --git a/ruoyi-ui/.env.development b/.env.development
similarity index 100%
rename from ruoyi-ui/.env.development
rename to .env.development
diff --git a/ruoyi-ui/.env.production b/.env.production
similarity index 100%
rename from ruoyi-ui/.env.production
rename to .env.production
diff --git a/ruoyi-ui/.env.staging b/.env.staging
similarity index 100%
rename from ruoyi-ui/.env.staging
rename to .env.staging
diff --git a/ruoyi-ui/.eslintignore b/.eslintignore
similarity index 100%
rename from ruoyi-ui/.eslintignore
rename to .eslintignore
diff --git a/ruoyi-ui/.eslintrc.js b/.eslintrc.js
similarity index 100%
rename from ruoyi-ui/.eslintrc.js
rename to .eslintrc.js
diff --git a/ruoyi-ui/.gitignore b/.gitignore
similarity index 100%
rename from ruoyi-ui/.gitignore
rename to .gitignore
diff --git a/ruoyi-ui/README.md b/README.md
similarity index 100%
rename from ruoyi-ui/README.md
rename to README.md
diff --git a/ruoyi-ui/babel.config.js b/babel.config.js
similarity index 100%
rename from ruoyi-ui/babel.config.js
rename to babel.config.js
diff --git a/ruoyi-ui/bin/build.bat b/bin/build.bat
similarity index 100%
rename from ruoyi-ui/bin/build.bat
rename to bin/build.bat
diff --git a/ruoyi-ui/bin/fix.txt b/bin/fix.txt
similarity index 100%
rename from ruoyi-ui/bin/fix.txt
rename to bin/fix.txt
diff --git a/ruoyi-ui/bin/package.bat b/bin/package.bat
similarity index 100%
rename from ruoyi-ui/bin/package.bat
rename to bin/package.bat
diff --git a/ruoyi-ui/bin/run-web.bat b/bin/run-web.bat
similarity index 100%
rename from ruoyi-ui/bin/run-web.bat
rename to bin/run-web.bat
diff --git a/ruoyi-ui/build/index.js b/build/index.js
similarity index 100%
rename from ruoyi-ui/build/index.js
rename to build/index.js
diff --git a/ruoyi-ui/package.json b/package.json
similarity index 91%
rename from ruoyi-ui/package.json
rename to package.json
index c1cd574..70a1102 100644
--- a/ruoyi-ui/package.json
+++ b/package.json
@@ -40,9 +40,11 @@
     "axios": "0.24.0",
     "clipboard": "2.0.8",
     "core-js": "3.25.3",
-    "echarts": "5.4.0",
+    "cos-js-sdk-v5": "^1.4.18",
+    "dayjs": "^1.11.7",
+    "echarts": "^5.4.2",
     "element-ui": "2.15.12",
-    "file-saver": "2.0.5",
+    "file-saver": "^2.0.5",
     "fuse.js": "6.4.3",
     "highlight.js": "9.18.5",
     "js-beautify": "1.13.0",
@@ -59,7 +61,8 @@
     "vue-meta": "2.4.0",
     "vue-router": "3.4.9",
     "vuedraggable": "2.24.3",
-    "vuex": "3.6.0"
+    "vuex": "3.6.0",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "4.4.6",
@@ -77,6 +80,7 @@
     "sass": "1.32.13",
     "sass-loader": "10.1.1",
     "script-ext-html-webpack-plugin": "2.1.5",
+    "script-loader": "^0.7.2",
     "svg-sprite-loader": "5.1.1",
     "vue-template-compiler": "2.6.12"
   },
diff --git a/ruoyi-ui/public/favicon.ico b/public/favicon.ico
similarity index 100%
rename from ruoyi-ui/public/favicon.ico
rename to public/favicon.ico
Binary files differ
diff --git a/ruoyi-ui/public/html/ie.html b/public/html/ie.html
similarity index 100%
rename from ruoyi-ui/public/html/ie.html
rename to public/html/ie.html
diff --git a/ruoyi-ui/public/index.html b/public/index.html
similarity index 100%
rename from ruoyi-ui/public/index.html
rename to public/index.html
diff --git a/ruoyi-ui/public/robots.txt b/public/robots.txt
similarity index 100%
rename from ruoyi-ui/public/robots.txt
rename to public/robots.txt
diff --git a/ruoyi-ui/src/components/Breadcrumb/index.vue b/ruoyi-ui/src/components/Breadcrumb/index.vue
deleted file mode 100644
index 1696f54..0000000
--- a/ruoyi-ui/src/components/Breadcrumb/index.vue
+++ /dev/null
@@ -1,74 +0,0 @@
-<template>
-  <el-breadcrumb class="app-breadcrumb" separator="/">
-    <transition-group name="breadcrumb">
-      <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
-        <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span>
-        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
-      </el-breadcrumb-item>
-    </transition-group>
-  </el-breadcrumb>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      levelList: null
-    }
-  },
-  watch: {
-    $route(route) {
-      // if you go to the redirect page, do not update the breadcrumbs
-      if (route.path.startsWith('/redirect/')) {
-        return
-      }
-      this.getBreadcrumb()
-    }
-  },
-  created() {
-    this.getBreadcrumb()
-  },
-  methods: {
-    getBreadcrumb() {
-      // only show routes with meta.title
-      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
-      const first = matched[0]
-
-      if (!this.isDashboard(first)) {
-        matched = [{ path: '/index', meta: { title: '棣栭〉' }}].concat(matched)
-      }
-
-      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
-    },
-    isDashboard(route) {
-      const name = route && route.name
-      if (!name) {
-        return false
-      }
-      return name.trim() === 'Index'
-    },
-    handleLink(item) {
-      const { redirect, path } = item
-      if (redirect) {
-        this.$router.push(redirect)
-        return
-      }
-      this.$router.push(path)
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.app-breadcrumb.el-breadcrumb {
-  display: inline-block;
-  font-size: 14px;
-  line-height: 50px;
-  margin-left: 8px;
-
-  .no-redirect {
-    color: #97a8be;
-    cursor: text;
-  }
-}
-</style>
diff --git a/ruoyi-ui/src/components/IconSelect/index.vue b/ruoyi-ui/src/components/IconSelect/index.vue
deleted file mode 100644
index b0ec9fa..0000000
--- a/ruoyi-ui/src/components/IconSelect/index.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-<!-- @author zhengjie -->
-<template>
-  <div class="icon-body">
-    <el-input v-model="name" style="position: relative;" clearable placeholder="璇疯緭鍏ュ浘鏍囧悕绉�" @clear="filterIcons" @input.native="filterIcons">
-      <i slot="suffix" class="el-icon-search el-input__icon" />
-    </el-input>
-    <div class="icon-list">
-      <div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)">
-        <svg-icon :icon-class="item" style="height: 30px;width: 16px;" />
-        <span>{{ item }}</span>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import icons from './requireIcons'
-export default {
-  name: 'IconSelect',
-  data() {
-    return {
-      name: '',
-      iconList: icons
-    }
-  },
-  methods: {
-    filterIcons() {
-      this.iconList = icons
-      if (this.name) {
-        this.iconList = this.iconList.filter(item => item.includes(this.name))
-      }
-    },
-    selectedIcon(name) {
-      this.$emit('selected', name)
-      document.body.click()
-    },
-    reset() {
-      this.name = ''
-      this.iconList = icons
-    }
-  }
-}
-</script>
-
-<style rel="stylesheet/scss" lang="scss" scoped>
-  .icon-body {
-    width: 100%;
-    padding: 10px;
-    .icon-list {
-      height: 200px;
-      overflow-y: scroll;
-      div {
-        height: 30px;
-        line-height: 30px;
-        margin-bottom: -5px;
-        cursor: pointer;
-        width: 33%;
-        float: left;
-      }
-      span {
-        display: inline-block;
-        vertical-align: -0.15em;
-        fill: currentColor;
-        overflow: hidden;
-      }
-    }
-  }
-</style>
diff --git a/ruoyi-ui/src/components/SizeSelect/index.vue b/ruoyi-ui/src/components/SizeSelect/index.vue
deleted file mode 100644
index 069b5de..0000000
--- a/ruoyi-ui/src/components/SizeSelect/index.vue
+++ /dev/null
@@ -1,56 +0,0 @@
-<template>
-  <el-dropdown trigger="click" @command="handleSetSize">
-    <div>
-      <svg-icon class-name="size-icon" icon-class="size" />
-    </div>
-    <el-dropdown-menu slot="dropdown">
-      <el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value">
-        {{ item.label }}
-      </el-dropdown-item>
-    </el-dropdown-menu>
-  </el-dropdown>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      sizeOptions: [
-        { label: 'Default', value: 'default' },
-        { label: 'Medium', value: 'medium' },
-        { label: 'Small', value: 'small' },
-        { label: 'Mini', value: 'mini' }
-      ]
-    }
-  },
-  computed: {
-    size() {
-      return this.$store.getters.size
-    }
-  },
-  methods: {
-    handleSetSize(size) {
-      this.$ELEMENT.size = size
-      this.$store.dispatch('app/setSize', size)
-      this.refreshView()
-      this.$message({
-        message: 'Switch Size Success',
-        type: 'success'
-      })
-    },
-    refreshView() {
-      // In order to make the cached page re-rendered
-      this.$store.dispatch('tagsView/delAllCachedViews', this.$route)
-
-      const { fullPath } = this.$route
-
-      this.$nextTick(() => {
-        this.$router.replace({
-          path: '/redirect' + fullPath
-        })
-      })
-    }
-  }
-
-}
-</script>
diff --git a/ruoyi-ui/src/components/SvgIcon/index.vue b/ruoyi-ui/src/components/SvgIcon/index.vue
deleted file mode 100644
index e4bf5ad..0000000
--- a/ruoyi-ui/src/components/SvgIcon/index.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-<template>
-  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
-  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
-    <use :xlink:href="iconName" />
-  </svg>
-</template>
-
-<script>
-import { isExternal } from '@/utils/validate'
-
-export default {
-  name: 'SvgIcon',
-  props: {
-    iconClass: {
-      type: String,
-      required: true
-    },
-    className: {
-      type: String,
-      default: ''
-    }
-  },
-  computed: {
-    isExternal() {
-      return isExternal(this.iconClass)
-    },
-    iconName() {
-      return `#icon-${this.iconClass}`
-    },
-    svgClass() {
-      if (this.className) {
-        return 'svg-icon ' + this.className
-      } else {
-        return 'svg-icon'
-      }
-    },
-    styleExternalIcon() {
-      return {
-        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
-        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
-      }
-    }
-  }
-}
-</script>
-
-<style scoped>
-.svg-icon {
-  width: 1em;
-  height: 1em;
-  vertical-align: -0.15em;
-  fill: currentColor;
-  overflow: hidden;
-}
-
-.svg-external-icon {
-  background-color: currentColor;
-  mask-size: cover!important;
-  display: inline-block;
-}
-</style>
diff --git a/ruoyi-ui/src/layout/components/Settings/index.vue b/ruoyi-ui/src/layout/components/Settings/index.vue
deleted file mode 100644
index 8b49842..0000000
--- a/ruoyi-ui/src/layout/components/Settings/index.vue
+++ /dev/null
@@ -1,260 +0,0 @@
-<template>
-  <el-drawer size="280px" :visible="visible" :with-header="false" :append-to-body="true" :show-close="false">
-    <div class="drawer-container">
-      <div>
-        <div class="setting-drawer-content">
-          <div class="setting-drawer-title">
-            <h3 class="drawer-title">涓婚椋庢牸璁剧疆</h3>
-          </div>
-          <div class="setting-drawer-block-checbox">
-            <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-dark')">
-              <img src="@/assets/images/dark.svg" alt="dark">
-              <div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
-                <i aria-label="鍥炬爣: check" class="anticon anticon-check">
-                  <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class="">
-                    <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"/>
-                  </svg>
-                </i>
-              </div>
-            </div>
-            <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-light')">
-              <img src="@/assets/images/light.svg" alt="light">
-              <div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
-                <i aria-label="鍥炬爣: check" class="anticon anticon-check">
-                  <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class="">
-                    <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"/>
-                  </svg>
-                </i>
-              </div>
-            </div>
-          </div>
-
-          <div class="drawer-item">
-            <span>涓婚棰滆壊</span>
-            <theme-picker style="float: right;height: 26px;margin: -3px 8px 0 0;" @change="themeChange" />
-          </div>
-        </div>
-
-        <el-divider/>
-
-        <h3 class="drawer-title">绯荤粺甯冨眬閰嶇疆</h3>
-      
-        <div class="drawer-item">
-          <span>寮�鍚� TopNav</span>
-          <el-switch v-model="topNav" class="drawer-switch" />
-        </div>
-
-        <div class="drawer-item">
-          <span>寮�鍚� Tags-Views</span>
-          <el-switch v-model="tagsView" class="drawer-switch" />
-        </div>
-
-        <div class="drawer-item">
-          <span>鍥哄畾 Header</span>
-          <el-switch v-model="fixedHeader" class="drawer-switch" />
-        </div>
-
-        <div class="drawer-item">
-          <span>鏄剧ず Logo</span>
-          <el-switch v-model="sidebarLogo" class="drawer-switch" />
-        </div>
-
-        <div class="drawer-item">
-          <span>鍔ㄦ�佹爣棰�</span>
-          <el-switch v-model="dynamicTitle" class="drawer-switch" />
-        </div>
-
-        <el-divider/>
-
-        <el-button size="small" type="primary" plain icon="el-icon-document-add" @click="saveSetting">淇濆瓨閰嶇疆</el-button>
-        <el-button size="small" plain icon="el-icon-refresh" @click="resetSetting">閲嶇疆閰嶇疆</el-button>
-      </div>
-    </div>
-  </el-drawer>
-</template>
-
-<script>
-import ThemePicker from '@/components/ThemePicker'
-
-export default {
-  components: { ThemePicker },
-  data() {
-    return {
-      theme: this.$store.state.settings.theme,
-      sideTheme: this.$store.state.settings.sideTheme
-    };
-  },
-  computed: {
-    visible: {
-      get() {
-        return this.$store.state.settings.showSettings
-      }
-    },
-    fixedHeader: {
-      get() {
-        return this.$store.state.settings.fixedHeader
-      },
-      set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'fixedHeader',
-          value: val
-        })
-      }
-    },
-    topNav: {
-      get() {
-        return this.$store.state.settings.topNav
-      },
-      set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'topNav',
-          value: val
-        })
-        if (!val) {
-          this.$store.dispatch('app/toggleSideBarHide', false);
-          this.$store.commit("SET_SIDEBAR_ROUTERS", this.$store.state.permission.defaultRoutes);
-        }
-      }
-    },
-    tagsView: {
-      get() {
-        return this.$store.state.settings.tagsView
-      },
-      set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'tagsView',
-          value: val
-        })
-      }
-    },
-    sidebarLogo: {
-      get() {
-        return this.$store.state.settings.sidebarLogo
-      },
-      set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'sidebarLogo',
-          value: val
-        })
-      }
-    },
-    dynamicTitle: {
-      get() {
-        return this.$store.state.settings.dynamicTitle
-      },
-      set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'dynamicTitle',
-          value: val
-        })
-      }
-    },
-  },
-  methods: {
-    themeChange(val) {
-      this.$store.dispatch('settings/changeSetting', {
-        key: 'theme',
-        value: val
-      })
-      this.theme = val;
-    },
-    handleTheme(val) {
-      this.$store.dispatch('settings/changeSetting', {
-        key: 'sideTheme',
-        value: val
-      })
-      this.sideTheme = val;
-    },
-    saveSetting() {
-      this.$modal.loading("姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�...");
-      this.$cache.local.set(
-        "layout-setting",
-        `{
-            "topNav":${this.topNav},
-            "tagsView":${this.tagsView},
-            "fixedHeader":${this.fixedHeader},
-            "sidebarLogo":${this.sidebarLogo},
-            "dynamicTitle":${this.dynamicTitle},
-            "sideTheme":"${this.sideTheme}",
-            "theme":"${this.theme}"
-          }`
-      );
-      setTimeout(this.$modal.closeLoading(), 1000)
-    },
-    resetSetting() {
-      this.$modal.loading("姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�...");
-      this.$cache.local.remove("layout-setting")
-      setTimeout("window.location.reload()", 1000)
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-  .setting-drawer-content {
-    .setting-drawer-title {
-      margin-bottom: 12px;
-      color: rgba(0, 0, 0, .85);
-      font-size: 14px;
-      line-height: 22px;
-      font-weight: bold;
-    }
-
-    .setting-drawer-block-checbox {
-      display: flex;
-      justify-content: flex-start;
-      align-items: center;
-      margin-top: 10px;
-      margin-bottom: 20px;
-
-      .setting-drawer-block-checbox-item {
-        position: relative;
-        margin-right: 16px;
-        border-radius: 2px;
-        cursor: pointer;
-
-        img {
-          width: 48px;
-          height: 48px;
-        }
-
-        .setting-drawer-block-checbox-selectIcon {
-          position: absolute;
-          top: 0;
-          right: 0;
-          width: 100%;
-          height: 100%;
-          padding-top: 15px;
-          padding-left: 24px;
-          color: #1890ff;
-          font-weight: 700;
-          font-size: 14px;
-        }
-      }
-    }
-  }
-
-  .drawer-container {
-    padding: 20px;
-    font-size: 14px;
-    line-height: 1.5;
-    word-wrap: break-word;
-
-    .drawer-title {
-      margin-bottom: 12px;
-      color: rgba(0, 0, 0, .85);
-      font-size: 14px;
-      line-height: 22px;
-    }
-
-    .drawer-item {
-      color: rgba(0, 0, 0, .65);
-      font-size: 14px;
-      padding: 12px 0;
-    }
-
-    .drawer-switch {
-      float: right
-    }
-  }
-</style>
diff --git a/ruoyi-ui/src/layout/components/Sidebar/Logo.vue b/ruoyi-ui/src/layout/components/Sidebar/Logo.vue
deleted file mode 100644
index c4c2d20..0000000
--- a/ruoyi-ui/src/layout/components/Sidebar/Logo.vue
+++ /dev/null
@@ -1,93 +0,0 @@
-<template>
-  <div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
-    <transition name="sidebarLogoFade">
-      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
-        <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
-      </router-link>
-      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
-        <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
-      </router-link>
-    </transition>
-  </div>
-</template>
-
-<script>
-import logoImg from '@/assets/logo/logo.png'
-import variables from '@/assets/styles/variables.scss'
-
-export default {
-  name: 'SidebarLogo',
-  props: {
-    collapse: {
-      type: Boolean,
-      required: true
-    }
-  },
-  computed: {
-    variables() {
-      return variables;
-    },
-    sideTheme() {
-      return this.$store.state.settings.sideTheme
-    }
-  },
-  data() {
-    return {
-      title: '鏅烘収闅忚绠$悊绯荤粺',
-      logo: logoImg
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.sidebarLogoFade-enter-active {
-  transition: opacity 1.5s;
-}
-
-.sidebarLogoFade-enter,
-.sidebarLogoFade-leave-to {
-  opacity: 0;
-}
-
-.sidebar-logo-container {
-  position: relative;
-  width: 100%;
-  height: 50px;
-  line-height: 50px;
-  background: #2b2f3a;
-  text-align: center;
-  overflow: hidden;
-
-  & .sidebar-logo-link {
-    height: 100%;
-    width: 100%;
-
-    & .sidebar-logo {
-      width: 32px;
-      height: 32px;
-      vertical-align: middle;
-      margin-right: 12px;
-    }
-
-    & .sidebar-title {
-      display: inline-block;
-      margin: 0;
-      color: #fff;
-      font-weight: 600;
-      line-height: 50px;
-      font-size: 14px;
-      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
-      vertical-align: middle;
-    }
-  }
-
-  &.collapse {
-    .sidebar-logo {
-      margin-right: 0px;
-    }
-  }
-}
-</style>
diff --git a/ruoyi-ui/src/layout/components/Sidebar/index.vue b/ruoyi-ui/src/layout/components/Sidebar/index.vue
deleted file mode 100644
index 51d0839..0000000
--- a/ruoyi-ui/src/layout/components/Sidebar/index.vue
+++ /dev/null
@@ -1,57 +0,0 @@
-<template>
-    <div :class="{'has-logo':showLogo}" :style="{ backgroundColor: settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
-        <logo v-if="showLogo" :collapse="isCollapse" />
-        <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
-            <el-menu
-                :default-active="activeMenu"
-                :collapse="isCollapse"
-                :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground"
-                :text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor"
-                :unique-opened="true"
-                :active-text-color="settings.theme"
-                :collapse-transition="false"
-                mode="vertical"
-            >
-                <sidebar-item
-                    v-for="(route, index) in sidebarRouters"
-                    :key="route.path  + index"
-                    :item="route"
-                    :base-path="route.path"
-                />
-            </el-menu>
-        </el-scrollbar>
-    </div>
-</template>
-
-<script>
-import { mapGetters, mapState } from "vuex";
-import Logo from "./Logo";
-import SidebarItem from "./SidebarItem";
-import variables from "@/assets/styles/variables.scss";
-
-export default {
-    components: { SidebarItem, Logo },
-    computed: {
-        ...mapState(["settings"]),
-        ...mapGetters(["sidebarRouters", "sidebar"]),
-        activeMenu() {
-            const route = this.$route;
-            const { meta, path } = route;
-            // if set path, the sidebar will highlight the path you set
-            if (meta.activeMenu) {
-                return meta.activeMenu;
-            }
-            return path;
-        },
-        showLogo() {
-            return this.$store.state.settings.sidebarLogo;
-        },
-        variables() {
-            return variables;
-        },
-        isCollapse() {
-            return !this.sidebar.opened;
-        }
-    }
-};
-</script>
diff --git a/ruoyi-ui/src/App.vue b/src/App.vue
similarity index 100%
rename from ruoyi-ui/src/App.vue
rename to src/App.vue
diff --git a/src/api/knowledge/education.js b/src/api/knowledge/education.js
new file mode 100644
index 0000000..077319f
--- /dev/null
+++ b/src/api/knowledge/education.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";//澶勭悊瀛楃涓�,und,null杞崲涓�'';
+
+// 淇敼瀹f暀鍒嗙被
+export function amendtag(data) {
+  return request({
+    url: '/smartor/hecategory',
+    method: 'put',
+    data: data
+  })
+};
+// 鏂板瀹f暀鍒嗙被
+export function addapitag(data) {
+    return request({
+      url: '/smartor/hecategory',
+      method: 'post',
+      data: data
+    })
+  };
+
+/**
+ * 
+ * @param {鏍囩id} userId 
+ * 鑾峰彇瀹f暀璇︽儏
+ * @returns 
+ */
+export function detailstag(userId) {
+    return request({
+      url: '/smartor/hecategory/'+ userId,
+      method: 'get',
+    })
+  };
+
+
+  /**
+   * 
+   * @param {鏍囩id} userId 
+   * 鍒犻櫎鏍囩
+   * @returns 
+   */
+export function deletetag(userId) {
+    return request({
+      url: '/smartor/hecategory/' + userId,
+      method: 'delete',
+    })
+  };
+  // 瀵煎嚭鏍囩鍒楄〃
+export function exporttag(data) {
+    return request({
+      url: '/smartor/hecategory/export',
+      method: 'post',
+      data: data
+    })
+  };
+  // 鏌ヨ鏍囩鍒楄〃
+export function listtag(query) {
+    return request({
+      url: '/smartor/hecategory/list',
+      method: 'get',
+      params: query
+    })
+  };
\ No newline at end of file
diff --git a/src/api/knowledge/questionbank.js b/src/api/knowledge/questionbank.js
new file mode 100644
index 0000000..66c03f7
--- /dev/null
+++ b/src/api/knowledge/questionbank.js
@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";//澶勭悊瀛楃涓�,und,null杞崲涓�'';
+
+// 鏌ヨ棰樺簱鍒楄〃
+export function listpatient(query) {
+  return request({
+    url: '/smartor/patarchive/list',
+    method: 'get',
+    params: query
+  })
+};
\ No newline at end of file
diff --git a/src/api/knowledge/questionnaire.js b/src/api/knowledge/questionnaire.js
new file mode 100644
index 0000000..1edcc38
--- /dev/null
+++ b/src/api/knowledge/questionnaire.js
@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";//澶勭悊瀛楃涓�,und,null杞崲涓�'';
+
+// 鏌ヨ闂嵎鍒楄〃
+export function listpatient(query) {
+  return request({
+    url: '/smartor/patarchive/list',
+    method: 'get',
+    params: query
+  })
+};
\ No newline at end of file
diff --git a/ruoyi-ui/src/api/login.js b/src/api/login.js
similarity index 100%
rename from ruoyi-ui/src/api/login.js
rename to src/api/login.js
diff --git a/ruoyi-ui/src/api/menu.js b/src/api/menu.js
similarity index 100%
rename from ruoyi-ui/src/api/menu.js
rename to src/api/menu.js
diff --git a/ruoyi-ui/src/api/monitor/cache.js b/src/api/monitor/cache.js
similarity index 100%
rename from ruoyi-ui/src/api/monitor/cache.js
rename to src/api/monitor/cache.js
diff --git a/ruoyi-ui/src/api/monitor/job.js b/src/api/monitor/job.js
similarity index 100%
rename from ruoyi-ui/src/api/monitor/job.js
rename to src/api/monitor/job.js
diff --git a/ruoyi-ui/src/api/monitor/jobLog.js b/src/api/monitor/jobLog.js
similarity index 100%
rename from ruoyi-ui/src/api/monitor/jobLog.js
rename to src/api/monitor/jobLog.js
diff --git a/ruoyi-ui/src/api/monitor/logininfor.js b/src/api/monitor/logininfor.js
similarity index 100%
rename from ruoyi-ui/src/api/monitor/logininfor.js
rename to src/api/monitor/logininfor.js
diff --git a/ruoyi-ui/src/api/monitor/online.js b/src/api/monitor/online.js
similarity index 100%
rename from ruoyi-ui/src/api/monitor/online.js
rename to src/api/monitor/online.js
diff --git a/ruoyi-ui/src/api/monitor/operlog.js b/src/api/monitor/operlog.js
similarity index 100%
rename from ruoyi-ui/src/api/monitor/operlog.js
rename to src/api/monitor/operlog.js
diff --git a/ruoyi-ui/src/api/monitor/server.js b/src/api/monitor/server.js
similarity index 100%
rename from ruoyi-ui/src/api/monitor/server.js
rename to src/api/monitor/server.js
diff --git a/src/api/patient/homepage.js b/src/api/patient/homepage.js
new file mode 100644
index 0000000..6f3bf90
--- /dev/null
+++ b/src/api/patient/homepage.js
@@ -0,0 +1,72 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";//澶勭悊瀛楃涓�,und,null杞崲涓�'';
+
+// 鏌ヨ鎮h�呭垪琛�
+export function listpatient(query) {
+  return request({
+    url: '/smartor/patarchive/list',
+    method: 'get',
+    params: query
+  })
+};
+// 鐢ㄦ埛淇℃伅鏌ヨ鎮h�呭垪琛�
+export function messagelistpatient(data) {
+  return request({
+    url: '/smartor/patarchive/patInfoByContion',
+    method: 'post',
+    data: data
+  })
+};
+// 鏍囩鏌ヨ鎮h�呭垪琛�
+export function taglistpatient(data) {
+  return request({
+    url: '/smartor/patarchive/patTagByContion',
+    method: 'post',
+    data: data
+  })
+};
+// 淇敼鎮h�呮。妗�
+export function alterpatient(data) {
+  return request({
+    url: '/smartor/patarchive',
+    method: 'put',
+    data: data
+  })
+};
+// 鏂板鎮h��
+export function addpatient(data) {
+  return request({
+    url: '/smartor/patarchive',
+    method: 'post',
+    data: data
+  })
+};
+// 鎮h�呰鎯�
+export function particularpatient(userId) {
+  return request({
+    url: '/smartor/patarchive/' + userId,
+    method: 'get',
+  })
+};
+// 鍒犻櫎鎮h�呭垪琛�
+export function deletepatient(userId) {
+  return request({
+    url: '/smartor/patarchive/' + userId,
+    method: 'delete',
+  })
+};
+
+// 瀵煎嚭鎮h�呴敊璇俊鎭�
+export function Exporterrorpatient(userId) {
+  return request({
+    url: '/smartor/patarchive/patTagByContion/'+userId,
+    method: 'get',
+  })
+};
+// 瀵煎叆鎮h�呮枃浠跺鐞�
+export function toleadpatient(userId) {
+  return request({
+    url: '/smartor/patarchive/patTagByContion/'+userId,
+    method: 'get',
+  })
+};
diff --git a/ruoyi-ui/src/api/smartor/hecategory.js b/src/api/smartor/hecategory.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/hecategory.js
rename to src/api/smartor/hecategory.js
diff --git a/ruoyi-ui/src/api/smartor/helibrary.js b/src/api/smartor/helibrary.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/helibrary.js
rename to src/api/smartor/helibrary.js
diff --git a/ruoyi-ui/src/api/smartor/ivrexecuteconfig.js b/src/api/smartor/ivrexecuteconfig.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrexecuteconfig.js
rename to src/api/smartor/ivrexecuteconfig.js
diff --git a/ruoyi-ui/src/api/smartor/ivrextemplate.js b/src/api/smartor/ivrextemplate.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrextemplate.js
rename to src/api/smartor/ivrextemplate.js
diff --git a/ruoyi-ui/src/api/smartor/ivrextemplatescript.js b/src/api/smartor/ivrextemplatescript.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrextemplatescript.js
rename to src/api/smartor/ivrextemplatescript.js
diff --git a/ruoyi-ui/src/api/smartor/ivrflow.js b/src/api/smartor/ivrflow.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrflow.js
rename to src/api/smartor/ivrflow.js
diff --git a/ruoyi-ui/src/api/smartor/ivrflownode.js b/src/api/smartor/ivrflownode.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrflownode.js
rename to src/api/smartor/ivrflownode.js
diff --git a/ruoyi-ui/src/api/smartor/ivrflownodebranch.js b/src/api/smartor/ivrflownodebranch.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrflownodebranch.js
rename to src/api/smartor/ivrflownodebranch.js
diff --git a/ruoyi-ui/src/api/smartor/ivrglobalconfig.js b/src/api/smartor/ivrglobalconfig.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrglobalconfig.js
rename to src/api/smartor/ivrglobalconfig.js
diff --git a/ruoyi-ui/src/api/smartor/ivrintent.js b/src/api/smartor/ivrintent.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrintent.js
rename to src/api/smartor/ivrintent.js
diff --git a/ruoyi-ui/src/api/smartor/ivrlibascript.js b/src/api/smartor/ivrlibascript.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrlibascript.js
rename to src/api/smartor/ivrlibascript.js
diff --git a/ruoyi-ui/src/api/smartor/ivrlibintent.js b/src/api/smartor/ivrlibintent.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrlibintent.js
rename to src/api/smartor/ivrlibintent.js
diff --git a/ruoyi-ui/src/api/smartor/ivrlibintentcategory.js b/src/api/smartor/ivrlibintentcategory.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrlibintentcategory.js
rename to src/api/smartor/ivrlibintentcategory.js
diff --git a/ruoyi-ui/src/api/smartor/ivrlibscript.js b/src/api/smartor/ivrlibscript.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrlibscript.js
rename to src/api/smartor/ivrlibscript.js
diff --git a/ruoyi-ui/src/api/smartor/ivrlibscriptcategory.js b/src/api/smartor/ivrlibscriptcategory.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrlibscriptcategory.js
rename to src/api/smartor/ivrlibscriptcategory.js
diff --git a/ruoyi-ui/src/api/smartor/ivrlibscriptmodel.js b/src/api/smartor/ivrlibscriptmodel.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrlibscriptmodel.js
rename to src/api/smartor/ivrlibscriptmodel.js
diff --git a/ruoyi-ui/src/api/smartor/ivrrecall.js b/src/api/smartor/ivrrecall.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrrecall.js
rename to src/api/smartor/ivrrecall.js
diff --git a/ruoyi-ui/src/api/smartor/ivrscene.js b/src/api/smartor/ivrscene.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrscene.js
rename to src/api/smartor/ivrscene.js
diff --git a/ruoyi-ui/src/api/smartor/ivrscenecategory.js b/src/api/smartor/ivrscenecategory.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrscenecategory.js
rename to src/api/smartor/ivrscenecategory.js
diff --git a/ruoyi-ui/src/api/smartor/ivrscript.js b/src/api/smartor/ivrscript.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrscript.js
rename to src/api/smartor/ivrscript.js
diff --git a/ruoyi-ui/src/api/smartor/ivrscriptmodel.js b/src/api/smartor/ivrscriptmodel.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrscriptmodel.js
rename to src/api/smartor/ivrscriptmodel.js
diff --git a/ruoyi-ui/src/api/smartor/ivrscripttarget.js b/src/api/smartor/ivrscripttarget.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrscripttarget.js
rename to src/api/smartor/ivrscripttarget.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtarget.js b/src/api/smartor/ivrtarget.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtarget.js
rename to src/api/smartor/ivrtarget.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtask.js b/src/api/smartor/ivrtask.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtask.js
rename to src/api/smartor/ivrtask.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtaskcall.js b/src/api/smartor/ivrtaskcall.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtaskcall.js
rename to src/api/smartor/ivrtaskcall.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtaskcalldetail.js b/src/api/smartor/ivrtaskcalldetail.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtaskcalldetail.js
rename to src/api/smartor/ivrtaskcalldetail.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtaskcallrecord.js b/src/api/smartor/ivrtaskcallrecord.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtaskcallrecord.js
rename to src/api/smartor/ivrtaskcallrecord.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtasksms.js b/src/api/smartor/ivrtasksms.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtasksms.js
rename to src/api/smartor/ivrtasksms.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtemplate.js b/src/api/smartor/ivrtemplate.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtemplate.js
rename to src/api/smartor/ivrtemplate.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtemplatescript.js b/src/api/smartor/ivrtemplatescript.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtemplatescript.js
rename to src/api/smartor/ivrtemplatescript.js
diff --git a/ruoyi-ui/src/api/smartor/ivrtemplatetarget.js b/src/api/smartor/ivrtemplatetarget.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/ivrtemplatetarget.js
rename to src/api/smartor/ivrtemplatetarget.js
diff --git a/ruoyi-ui/src/api/smartor/patarchive.js b/src/api/smartor/patarchive.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/patarchive.js
rename to src/api/smartor/patarchive.js
diff --git a/ruoyi-ui/src/api/smartor/patinhosp.js b/src/api/smartor/patinhosp.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/patinhosp.js
rename to src/api/smartor/patinhosp.js
diff --git a/ruoyi-ui/src/api/smartor/patouthosp.js b/src/api/smartor/patouthosp.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/patouthosp.js
rename to src/api/smartor/patouthosp.js
diff --git a/ruoyi-ui/src/api/smartor/patphysical.js b/src/api/smartor/patphysical.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/patphysical.js
rename to src/api/smartor/patphysical.js
diff --git a/ruoyi-ui/src/api/smartor/schemeautofinshrule.js b/src/api/smartor/schemeautofinshrule.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemeautofinshrule.js
rename to src/api/smartor/schemeautofinshrule.js
diff --git a/ruoyi-ui/src/api/smartor/schemecalldetail.js b/src/api/smartor/schemecalldetail.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemecalldetail.js
rename to src/api/smartor/schemecalldetail.js
diff --git a/ruoyi-ui/src/api/smartor/schemecategory.js b/src/api/smartor/schemecategory.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemecategory.js
rename to src/api/smartor/schemecategory.js
diff --git a/ruoyi-ui/src/api/smartor/schemelibrary.js b/src/api/smartor/schemelibrary.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemelibrary.js
rename to src/api/smartor/schemelibrary.js
diff --git a/ruoyi-ui/src/api/smartor/schemeplan.js b/src/api/smartor/schemeplan.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemeplan.js
rename to src/api/smartor/schemeplan.js
diff --git a/ruoyi-ui/src/api/smartor/schemetask.js b/src/api/smartor/schemetask.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemetask.js
rename to src/api/smartor/schemetask.js
diff --git a/ruoyi-ui/src/api/smartor/schemetaskconfig.js b/src/api/smartor/schemetaskconfig.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemetaskconfig.js
rename to src/api/smartor/schemetaskconfig.js
diff --git a/ruoyi-ui/src/api/smartor/schemetaskrecord.js b/src/api/smartor/schemetaskrecord.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemetaskrecord.js
rename to src/api/smartor/schemetaskrecord.js
diff --git a/ruoyi-ui/src/api/smartor/schemetaskrepeatconfig.js b/src/api/smartor/schemetaskrepeatconfig.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemetaskrepeatconfig.js
rename to src/api/smartor/schemetaskrepeatconfig.js
diff --git a/ruoyi-ui/src/api/smartor/schemetriggerrule.js b/src/api/smartor/schemetriggerrule.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemetriggerrule.js
rename to src/api/smartor/schemetriggerrule.js
diff --git a/ruoyi-ui/src/api/smartor/schemetriggerscene.js b/src/api/smartor/schemetriggerscene.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/schemetriggerscene.js
rename to src/api/smartor/schemetriggerscene.js
diff --git a/ruoyi-ui/src/api/smartor/smsaccount.js b/src/api/smartor/smsaccount.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/smsaccount.js
rename to src/api/smartor/smsaccount.js
diff --git a/ruoyi-ui/src/api/smartor/smsparam.js b/src/api/smartor/smsparam.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/smsparam.js
rename to src/api/smartor/smsparam.js
diff --git a/ruoyi-ui/src/api/smartor/smsrecords.js b/src/api/smartor/smsrecords.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/smsrecords.js
rename to src/api/smartor/smsrecords.js
diff --git a/ruoyi-ui/src/api/smartor/smstemplet.js b/src/api/smartor/smstemplet.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/smstemplet.js
rename to src/api/smartor/smstemplet.js
diff --git a/ruoyi-ui/src/api/smartor/svycategory.js b/src/api/smartor/svycategory.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svycategory.js
rename to src/api/smartor/svycategory.js
diff --git a/ruoyi-ui/src/api/smartor/svyexception.js b/src/api/smartor/svyexception.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svyexception.js
rename to src/api/smartor/svyexception.js
diff --git a/ruoyi-ui/src/api/smartor/svyfinish.js b/src/api/smartor/svyfinish.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svyfinish.js
rename to src/api/smartor/svyfinish.js
diff --git a/ruoyi-ui/src/api/smartor/svyfinishoption.js b/src/api/smartor/svyfinishoption.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svyfinishoption.js
rename to src/api/smartor/svyfinishoption.js
diff --git a/ruoyi-ui/src/api/smartor/svyfinishtopic.js b/src/api/smartor/svyfinishtopic.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svyfinishtopic.js
rename to src/api/smartor/svyfinishtopic.js
diff --git a/ruoyi-ui/src/api/smartor/svyresult.js b/src/api/smartor/svyresult.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svyresult.js
rename to src/api/smartor/svyresult.js
diff --git a/ruoyi-ui/src/api/smartor/svytitle.js b/src/api/smartor/svytitle.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svytitle.js
rename to src/api/smartor/svytitle.js
diff --git a/ruoyi-ui/src/api/smartor/svytopic.js b/src/api/smartor/svytopic.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svytopic.js
rename to src/api/smartor/svytopic.js
diff --git a/ruoyi-ui/src/api/smartor/svytopicoption.js b/src/api/smartor/svytopicoption.js
similarity index 100%
rename from ruoyi-ui/src/api/smartor/svytopicoption.js
rename to src/api/smartor/svytopicoption.js
diff --git a/ruoyi-ui/src/api/system/category.js b/src/api/system/category.js
similarity index 100%
rename from ruoyi-ui/src/api/system/category.js
rename to src/api/system/category.js
diff --git a/ruoyi-ui/src/api/system/config.js b/src/api/system/config.js
similarity index 100%
rename from ruoyi-ui/src/api/system/config.js
rename to src/api/system/config.js
diff --git a/ruoyi-ui/src/api/system/dept.js b/src/api/system/dept.js
similarity index 100%
rename from ruoyi-ui/src/api/system/dept.js
rename to src/api/system/dept.js
diff --git a/ruoyi-ui/src/api/system/dict/data.js b/src/api/system/dict/data.js
similarity index 100%
rename from ruoyi-ui/src/api/system/dict/data.js
rename to src/api/system/dict/data.js
diff --git a/ruoyi-ui/src/api/system/dict/type.js b/src/api/system/dict/type.js
similarity index 100%
rename from ruoyi-ui/src/api/system/dict/type.js
rename to src/api/system/dict/type.js
diff --git a/src/api/system/label.js b/src/api/system/label.js
new file mode 100644
index 0000000..6e68fc6
--- /dev/null
+++ b/src/api/system/label.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";//澶勭悊瀛楃涓�,und,null杞崲涓�'';
+
+// 淇敼鏍囩
+export function amendtag(data) {
+  return request({
+    url: '/base/tag',
+    method: 'put',
+    data: data
+  })
+};
+// 鏂板鏍囩
+export function addapitag(data) {
+    return request({
+      url: '/base/tag',
+      method: 'post',
+      data: data
+    })
+  };
+
+/**
+ * 
+ * @param {鏍囩id} userId 
+ * 鑾峰彇鏍囩璇︽儏
+ * @returns 
+ */
+export function detailstag(userId) {
+    return request({
+      url: '/base/tag/'+ userId,
+      method: 'get',
+    })
+  };
+
+  
+  /**
+   * 
+   * @param {鏍囩id} userId 
+   * 鍒犻櫎鏍囩
+   * @returns 
+   */
+export function deletetag(userId) {
+    return request({
+      url: '/base/tag/' + userId,
+      method: 'delete',
+    })
+  };
+  // 瀵煎嚭鏍囩鍒楄〃
+export function exporttag(data) {
+    return request({
+      url: '/base/tag/export',
+      method: 'post',
+      data: data
+    })
+  };
+  // 鏌ヨ鏍囩鍒楄〃
+export function listtag(query) {
+    return request({
+      url: '/base/tag/list',
+      method: 'get',
+      params: query
+    })
+  };
\ No newline at end of file
diff --git a/ruoyi-ui/src/api/system/menu.js b/src/api/system/menu.js
similarity index 100%
rename from ruoyi-ui/src/api/system/menu.js
rename to src/api/system/menu.js
diff --git a/ruoyi-ui/src/api/system/notice.js b/src/api/system/notice.js
similarity index 100%
rename from ruoyi-ui/src/api/system/notice.js
rename to src/api/system/notice.js
diff --git a/ruoyi-ui/src/api/system/post.js b/src/api/system/post.js
similarity index 100%
rename from ruoyi-ui/src/api/system/post.js
rename to src/api/system/post.js
diff --git a/ruoyi-ui/src/api/system/role.js b/src/api/system/role.js
similarity index 100%
rename from ruoyi-ui/src/api/system/role.js
rename to src/api/system/role.js
diff --git a/src/api/system/tag.js b/src/api/system/tag.js
new file mode 100644
index 0000000..d7d085e
--- /dev/null
+++ b/src/api/system/tag.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鏍囩鍒楄〃
+export function listTag(query) {
+  return request({
+    url: '/system/tag/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鏍囩璇︾粏
+export function getTag(tagid) {
+  return request({
+    url: '/system/tag/' + tagid,
+    method: 'get'
+  })
+}
+
+// 鏂板鏍囩
+export function addTag(data) {
+  return request({
+    url: '/system/tag',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鏍囩
+export function updateTag(data) {
+  return request({
+    url: '/system/tag',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鏍囩
+export function delTag(tagid) {
+  return request({
+    url: '/system/tag/' + tagid,
+    method: 'delete'
+  })
+}
diff --git a/ruoyi-ui/src/api/system/user.js b/src/api/system/user.js
similarity index 96%
rename from ruoyi-ui/src/api/system/user.js
rename to src/api/system/user.js
index f2f76ef..d1f05a8 100644
--- a/ruoyi-ui/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -1,5 +1,5 @@
 import request from '@/utils/request'
-import { parseStrEmpty } from "@/utils/ruoyi";
+import { parseStrEmpty } from "@/utils/ruoyi";//澶勭悊瀛楃涓�
 
 // 鏌ヨ鐢ㄦ埛鍒楄〃
 export function listUser(query) {
diff --git a/ruoyi-ui/src/api/tool/gen.js b/src/api/tool/gen.js
similarity index 100%
rename from ruoyi-ui/src/api/tool/gen.js
rename to src/api/tool/gen.js
diff --git a/ruoyi-ui/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
similarity index 100%
rename from ruoyi-ui/src/assets/401_images/401.gif
rename to src/assets/401_images/401.gif
Binary files differ
diff --git a/ruoyi-ui/src/assets/404_images/404.png b/src/assets/404_images/404.png
similarity index 100%
rename from ruoyi-ui/src/assets/404_images/404.png
rename to src/assets/404_images/404.png
Binary files differ
diff --git a/ruoyi-ui/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png
similarity index 100%
rename from ruoyi-ui/src/assets/404_images/404_cloud.png
rename to src/assets/404_images/404_cloud.png
Binary files differ
diff --git a/src/assets/common/head.jpg b/src/assets/common/head.jpg
new file mode 100644
index 0000000..d961795
--- /dev/null
+++ b/src/assets/common/head.jpg
Binary files differ
diff --git a/src/assets/common/leftnavBg.png b/src/assets/common/leftnavBg.png
new file mode 100644
index 0000000..a9e1dca
--- /dev/null
+++ b/src/assets/common/leftnavBg.png
Binary files differ
diff --git a/ruoyi-ui/src/assets/icons/index.js b/src/assets/icons/index.js
similarity index 100%
rename from ruoyi-ui/src/assets/icons/index.js
rename to src/assets/icons/index.js
diff --git a/ruoyi-ui/src/assets/icons/svg/404.svg b/src/assets/icons/svg/404.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/404.svg
rename to src/assets/icons/svg/404.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/bug.svg b/src/assets/icons/svg/bug.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/bug.svg
rename to src/assets/icons/svg/bug.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/build.svg b/src/assets/icons/svg/build.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/build.svg
rename to src/assets/icons/svg/build.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/button.svg b/src/assets/icons/svg/button.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/button.svg
rename to src/assets/icons/svg/button.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/cascader.svg b/src/assets/icons/svg/cascader.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/cascader.svg
rename to src/assets/icons/svg/cascader.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/chart.svg
rename to src/assets/icons/svg/chart.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/checkbox.svg b/src/assets/icons/svg/checkbox.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/checkbox.svg
rename to src/assets/icons/svg/checkbox.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/clipboard.svg b/src/assets/icons/svg/clipboard.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/clipboard.svg
rename to src/assets/icons/svg/clipboard.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/code.svg b/src/assets/icons/svg/code.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/code.svg
rename to src/assets/icons/svg/code.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/color.svg b/src/assets/icons/svg/color.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/color.svg
rename to src/assets/icons/svg/color.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/component.svg b/src/assets/icons/svg/component.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/component.svg
rename to src/assets/icons/svg/component.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/dashboard.svg b/src/assets/icons/svg/dashboard.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/dashboard.svg
rename to src/assets/icons/svg/dashboard.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/date-range.svg b/src/assets/icons/svg/date-range.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/date-range.svg
rename to src/assets/icons/svg/date-range.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/date.svg b/src/assets/icons/svg/date.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/date.svg
rename to src/assets/icons/svg/date.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/dict.svg b/src/assets/icons/svg/dict.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/dict.svg
rename to src/assets/icons/svg/dict.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/documentation.svg b/src/assets/icons/svg/documentation.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/documentation.svg
rename to src/assets/icons/svg/documentation.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/download.svg b/src/assets/icons/svg/download.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/download.svg
rename to src/assets/icons/svg/download.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/drag.svg b/src/assets/icons/svg/drag.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/drag.svg
rename to src/assets/icons/svg/drag.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/druid.svg b/src/assets/icons/svg/druid.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/druid.svg
rename to src/assets/icons/svg/druid.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/edit.svg b/src/assets/icons/svg/edit.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/edit.svg
rename to src/assets/icons/svg/edit.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/education.svg b/src/assets/icons/svg/education.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/education.svg
rename to src/assets/icons/svg/education.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/email.svg b/src/assets/icons/svg/email.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/email.svg
rename to src/assets/icons/svg/email.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/example.svg b/src/assets/icons/svg/example.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/example.svg
rename to src/assets/icons/svg/example.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/excel.svg b/src/assets/icons/svg/excel.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/excel.svg
rename to src/assets/icons/svg/excel.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/exit-fullscreen.svg b/src/assets/icons/svg/exit-fullscreen.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/exit-fullscreen.svg
rename to src/assets/icons/svg/exit-fullscreen.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/eye-open.svg b/src/assets/icons/svg/eye-open.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/eye-open.svg
rename to src/assets/icons/svg/eye-open.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/eye.svg b/src/assets/icons/svg/eye.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/eye.svg
rename to src/assets/icons/svg/eye.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/form.svg b/src/assets/icons/svg/form.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/form.svg
rename to src/assets/icons/svg/form.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/fullscreen.svg b/src/assets/icons/svg/fullscreen.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/fullscreen.svg
rename to src/assets/icons/svg/fullscreen.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/github.svg b/src/assets/icons/svg/github.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/github.svg
rename to src/assets/icons/svg/github.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/guide.svg b/src/assets/icons/svg/guide.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/guide.svg
rename to src/assets/icons/svg/guide.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/icon.svg b/src/assets/icons/svg/icon.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/icon.svg
rename to src/assets/icons/svg/icon.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/input.svg b/src/assets/icons/svg/input.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/input.svg
rename to src/assets/icons/svg/input.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/international.svg b/src/assets/icons/svg/international.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/international.svg
rename to src/assets/icons/svg/international.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/job.svg b/src/assets/icons/svg/job.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/job.svg
rename to src/assets/icons/svg/job.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/language.svg b/src/assets/icons/svg/language.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/language.svg
rename to src/assets/icons/svg/language.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/link.svg b/src/assets/icons/svg/link.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/link.svg
rename to src/assets/icons/svg/link.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/list.svg b/src/assets/icons/svg/list.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/list.svg
rename to src/assets/icons/svg/list.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/lock.svg b/src/assets/icons/svg/lock.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/lock.svg
rename to src/assets/icons/svg/lock.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/log.svg b/src/assets/icons/svg/log.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/log.svg
rename to src/assets/icons/svg/log.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/logininfor.svg b/src/assets/icons/svg/logininfor.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/logininfor.svg
rename to src/assets/icons/svg/logininfor.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/message.svg b/src/assets/icons/svg/message.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/message.svg
rename to src/assets/icons/svg/message.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/money.svg b/src/assets/icons/svg/money.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/money.svg
rename to src/assets/icons/svg/money.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/monitor.svg b/src/assets/icons/svg/monitor.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/monitor.svg
rename to src/assets/icons/svg/monitor.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/nested.svg b/src/assets/icons/svg/nested.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/nested.svg
rename to src/assets/icons/svg/nested.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/number.svg b/src/assets/icons/svg/number.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/number.svg
rename to src/assets/icons/svg/number.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/online.svg b/src/assets/icons/svg/online.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/online.svg
rename to src/assets/icons/svg/online.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/password.svg b/src/assets/icons/svg/password.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/password.svg
rename to src/assets/icons/svg/password.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/pdf.svg b/src/assets/icons/svg/pdf.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/pdf.svg
rename to src/assets/icons/svg/pdf.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/people.svg b/src/assets/icons/svg/people.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/people.svg
rename to src/assets/icons/svg/people.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/peoples.svg b/src/assets/icons/svg/peoples.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/peoples.svg
rename to src/assets/icons/svg/peoples.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/phone.svg b/src/assets/icons/svg/phone.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/phone.svg
rename to src/assets/icons/svg/phone.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/post.svg b/src/assets/icons/svg/post.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/post.svg
rename to src/assets/icons/svg/post.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/qq.svg b/src/assets/icons/svg/qq.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/qq.svg
rename to src/assets/icons/svg/qq.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/question.svg b/src/assets/icons/svg/question.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/question.svg
rename to src/assets/icons/svg/question.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/radio.svg b/src/assets/icons/svg/radio.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/radio.svg
rename to src/assets/icons/svg/radio.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/rate.svg b/src/assets/icons/svg/rate.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/rate.svg
rename to src/assets/icons/svg/rate.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/redis-list.svg b/src/assets/icons/svg/redis-list.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/redis-list.svg
rename to src/assets/icons/svg/redis-list.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/redis.svg b/src/assets/icons/svg/redis.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/redis.svg
rename to src/assets/icons/svg/redis.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/row.svg b/src/assets/icons/svg/row.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/row.svg
rename to src/assets/icons/svg/row.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/search.svg b/src/assets/icons/svg/search.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/search.svg
rename to src/assets/icons/svg/search.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/select.svg b/src/assets/icons/svg/select.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/select.svg
rename to src/assets/icons/svg/select.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/server.svg b/src/assets/icons/svg/server.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/server.svg
rename to src/assets/icons/svg/server.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/shopping.svg b/src/assets/icons/svg/shopping.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/shopping.svg
rename to src/assets/icons/svg/shopping.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/size.svg b/src/assets/icons/svg/size.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/size.svg
rename to src/assets/icons/svg/size.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/skill.svg b/src/assets/icons/svg/skill.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/skill.svg
rename to src/assets/icons/svg/skill.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/slider.svg b/src/assets/icons/svg/slider.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/slider.svg
rename to src/assets/icons/svg/slider.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/star.svg b/src/assets/icons/svg/star.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/star.svg
rename to src/assets/icons/svg/star.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/swagger.svg b/src/assets/icons/svg/swagger.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/swagger.svg
rename to src/assets/icons/svg/swagger.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/switch.svg b/src/assets/icons/svg/switch.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/switch.svg
rename to src/assets/icons/svg/switch.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/system.svg b/src/assets/icons/svg/system.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/system.svg
rename to src/assets/icons/svg/system.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/tab.svg b/src/assets/icons/svg/tab.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/tab.svg
rename to src/assets/icons/svg/tab.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/table.svg b/src/assets/icons/svg/table.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/table.svg
rename to src/assets/icons/svg/table.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/textarea.svg b/src/assets/icons/svg/textarea.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/textarea.svg
rename to src/assets/icons/svg/textarea.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/theme.svg b/src/assets/icons/svg/theme.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/theme.svg
rename to src/assets/icons/svg/theme.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/time-range.svg b/src/assets/icons/svg/time-range.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/time-range.svg
rename to src/assets/icons/svg/time-range.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/time.svg b/src/assets/icons/svg/time.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/time.svg
rename to src/assets/icons/svg/time.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/tool.svg b/src/assets/icons/svg/tool.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/tool.svg
rename to src/assets/icons/svg/tool.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/tree-table.svg b/src/assets/icons/svg/tree-table.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/tree-table.svg
rename to src/assets/icons/svg/tree-table.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/tree.svg b/src/assets/icons/svg/tree.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/tree.svg
rename to src/assets/icons/svg/tree.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/upload.svg b/src/assets/icons/svg/upload.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/upload.svg
rename to src/assets/icons/svg/upload.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/user.svg b/src/assets/icons/svg/user.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/user.svg
rename to src/assets/icons/svg/user.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/validCode.svg b/src/assets/icons/svg/validCode.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/validCode.svg
rename to src/assets/icons/svg/validCode.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/wechat.svg b/src/assets/icons/svg/wechat.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/wechat.svg
rename to src/assets/icons/svg/wechat.svg
diff --git a/ruoyi-ui/src/assets/icons/svg/zip.svg b/src/assets/icons/svg/zip.svg
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svg/zip.svg
rename to src/assets/icons/svg/zip.svg
diff --git a/ruoyi-ui/src/assets/icons/svgo.yml b/src/assets/icons/svgo.yml
similarity index 100%
rename from ruoyi-ui/src/assets/icons/svgo.yml
rename to src/assets/icons/svgo.yml
diff --git a/ruoyi-ui/src/assets/images/dark.svg b/src/assets/images/dark.svg
similarity index 100%
rename from ruoyi-ui/src/assets/images/dark.svg
rename to src/assets/images/dark.svg
diff --git a/ruoyi-ui/src/assets/images/light.svg b/src/assets/images/light.svg
similarity index 100%
rename from ruoyi-ui/src/assets/images/light.svg
rename to src/assets/images/light.svg
diff --git a/ruoyi-ui/src/assets/images/login-background.jpg b/src/assets/images/login-background.jpg
similarity index 100%
rename from ruoyi-ui/src/assets/images/login-background.jpg
rename to src/assets/images/login-background.jpg
Binary files differ
diff --git a/ruoyi-ui/src/assets/images/profile.jpg b/src/assets/images/profile.jpg
similarity index 100%
rename from ruoyi-ui/src/assets/images/profile.jpg
rename to src/assets/images/profile.jpg
Binary files differ
diff --git a/ruoyi-ui/src/assets/logo/logo.png b/src/assets/logo/logo.png
similarity index 100%
rename from ruoyi-ui/src/assets/logo/logo.png
rename to src/assets/logo/logo.png
Binary files differ
diff --git a/ruoyi-ui/src/assets/styles/btn.scss b/src/assets/styles/btn.scss
similarity index 100%
rename from ruoyi-ui/src/assets/styles/btn.scss
rename to src/assets/styles/btn.scss
diff --git a/ruoyi-ui/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss
similarity index 100%
rename from ruoyi-ui/src/assets/styles/element-ui.scss
rename to src/assets/styles/element-ui.scss
diff --git a/ruoyi-ui/src/assets/styles/element-variables.scss b/src/assets/styles/element-variables.scss
similarity index 96%
rename from ruoyi-ui/src/assets/styles/element-variables.scss
rename to src/assets/styles/element-variables.scss
index 1615ff2..1a7cce3 100644
--- a/ruoyi-ui/src/assets/styles/element-variables.scss
+++ b/src/assets/styles/element-variables.scss
@@ -4,7 +4,7 @@
 **/
 
 /* theme color */
-$--color-primary: #1890ff;
+$--color-primary: #3a80c2;
 $--color-success: #13ce66;
 $--color-warning: #ffba00;
 $--color-danger: #ff4949;
diff --git a/ruoyi-ui/src/assets/styles/index.scss b/src/assets/styles/index.scss
similarity index 100%
rename from ruoyi-ui/src/assets/styles/index.scss
rename to src/assets/styles/index.scss
diff --git a/ruoyi-ui/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss
similarity index 100%
rename from ruoyi-ui/src/assets/styles/mixin.scss
rename to src/assets/styles/mixin.scss
diff --git a/ruoyi-ui/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss
similarity index 100%
rename from ruoyi-ui/src/assets/styles/ruoyi.scss
rename to src/assets/styles/ruoyi.scss
diff --git a/ruoyi-ui/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
similarity index 95%
rename from ruoyi-ui/src/assets/styles/sidebar.scss
rename to src/assets/styles/sidebar.scss
index ed308b8..fdb8adb 100644
--- a/ruoyi-ui/src/assets/styles/sidebar.scss
+++ b/src/assets/styles/sidebar.scss
@@ -15,7 +15,8 @@
     -webkit-transition: width .28s;
     transition: width 0.28s;
     width: $base-sidebar-width !important;
-    background-color: $base-menu-background;
+    background: -webkit-linear-gradient(bottom, #3d6df8, #5b8cff);
+
     height: 100%;
     position: fixed;
     font-size: 0px;
@@ -33,7 +34,7 @@
     }
 
     .scrollbar-wrapper {
-      overflow-x: hidden !important;
+      background: url('~@/assets/common/leftnavBg.png') no-repeat 0 100%;
     }
 
     .el-scrollbar__bar.is-vertical {
@@ -46,7 +47,7 @@
 
     &.has-logo {
       .el-scrollbar {
-        height: calc(100% - 50px);
+        height: calc(100% - 28px);
       }
     }
 
diff --git a/ruoyi-ui/src/assets/styles/transition.scss b/src/assets/styles/transition.scss
similarity index 100%
rename from ruoyi-ui/src/assets/styles/transition.scss
rename to src/assets/styles/transition.scss
diff --git a/ruoyi-ui/src/assets/styles/variables.scss b/src/assets/styles/variables.scss
similarity index 90%
rename from ruoyi-ui/src/assets/styles/variables.scss
rename to src/assets/styles/variables.scss
index 34484d4..431299d 100644
--- a/ruoyi-ui/src/assets/styles/variables.scss
+++ b/src/assets/styles/variables.scss
@@ -3,22 +3,24 @@
 $light-blue:#3A71A8;
 $red:#C03639;
 $pink: #E65D6E;
-$green: #30B08F;
+$green: #5aecd9;
 $tiffany: #4AB7BD;
 $yellow:#FEC171;
 $panGreen: #30B08F;
+$menuActiveText:#4fa8db;
+
 
 // 榛樿鑿滃崟涓婚椋庢牸
-$base-menu-color:#bfcbd9;
+$base-menu-color:#f7f8f8;
 $base-menu-color-active:#f4f4f5;
-$base-menu-background:#304156;
+$base-menu-background:transparent;
 $base-logo-title-color: #ffffff;
 
 $base-menu-light-color:rgba(0,0,0,.70);
 $base-menu-light-background:#ffffff;
 $base-logo-light-title-color: #001529;
 
-$base-sub-menu-background:#1f2d3d;
+$base-sub-menu-background:#81bcec;
 $base-sub-menu-hover:#001528;
 
 // 鑷畾涔夋殫鑹茶彍鍗曢鏍�
diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..8e6be4c
--- /dev/null
+++ b/src/components/Breadcrumb/index.vue
@@ -0,0 +1,83 @@
+<!-- 椤堕儴璺緞 -->
+<template>
+  <el-breadcrumb class="app-breadcrumb" separator="/">
+    <transition-group name="breadcrumb">
+      <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
+        <span
+          v-if="item.redirect === 'noRedirect' || index == levelList.length - 1"
+          class="no-redirect"
+          >{{ item.meta.title }}</span
+        >
+        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
+      </el-breadcrumb-item>
+    </transition-group>
+  </el-breadcrumb>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      levelList: null,
+    };
+  },
+  watch: {
+    $route(route) {
+      // if you go to the redirect page, do not update the breadcrumbs
+      if (route.path.startsWith("/redirect/")) {
+        return;
+      }
+      this.getBreadcrumb();
+    },
+  },
+  created() {
+    this.getBreadcrumb();
+  },
+  methods: {
+    getBreadcrumb() {
+      // only show routes with meta.title
+      let matched = this.$route.matched.filter(
+        (item) => item.meta && item.meta.title
+      );
+      const first = matched[0];
+
+      if (!this.isDashboard(first)) {
+        matched = [{ path: "/index", meta: { title: "棣栭〉" } }].concat(matched);
+      }
+
+      this.levelList = matched.filter(
+        (item) => item.meta && item.meta.title && item.meta.breadcrumb !== false
+      );
+    },
+    isDashboard(route) {
+      const name = route && route.name;
+      if (!name) {
+        return false;
+      }
+      return name.trim() === "Index";
+    },
+    handleLink(item) {
+      const { redirect, path } = item;
+      if (redirect) {
+        this.$router.push(redirect);
+        return;
+      }
+      this.$router.push(path);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.app-breadcrumb.el-breadcrumb {
+  display: inline-block;
+  font-size: 14px;
+  line-height: 50px;
+  margin-left: 8px;
+
+  .no-redirect {
+    color: #97a8be;
+    cursor: text;
+  }
+}
+</style>
diff --git a/ruoyi-ui/src/components/Crontab/day.vue b/src/components/Crontab/day.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/day.vue
rename to src/components/Crontab/day.vue
diff --git a/ruoyi-ui/src/components/Crontab/hour.vue b/src/components/Crontab/hour.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/hour.vue
rename to src/components/Crontab/hour.vue
diff --git a/ruoyi-ui/src/components/Crontab/index.vue b/src/components/Crontab/index.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/index.vue
rename to src/components/Crontab/index.vue
diff --git a/ruoyi-ui/src/components/Crontab/min.vue b/src/components/Crontab/min.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/min.vue
rename to src/components/Crontab/min.vue
diff --git a/ruoyi-ui/src/components/Crontab/month.vue b/src/components/Crontab/month.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/month.vue
rename to src/components/Crontab/month.vue
diff --git a/ruoyi-ui/src/components/Crontab/result.vue b/src/components/Crontab/result.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/result.vue
rename to src/components/Crontab/result.vue
diff --git a/ruoyi-ui/src/components/Crontab/second.vue b/src/components/Crontab/second.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/second.vue
rename to src/components/Crontab/second.vue
diff --git a/ruoyi-ui/src/components/Crontab/week.vue b/src/components/Crontab/week.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/week.vue
rename to src/components/Crontab/week.vue
diff --git a/ruoyi-ui/src/components/Crontab/year.vue b/src/components/Crontab/year.vue
similarity index 100%
rename from ruoyi-ui/src/components/Crontab/year.vue
rename to src/components/Crontab/year.vue
diff --git a/ruoyi-ui/src/components/DictData/index.js b/src/components/DictData/index.js
similarity index 100%
rename from ruoyi-ui/src/components/DictData/index.js
rename to src/components/DictData/index.js
diff --git a/ruoyi-ui/src/components/DictTag/index.vue b/src/components/DictTag/index.vue
similarity index 93%
rename from ruoyi-ui/src/components/DictTag/index.vue
rename to src/components/DictTag/index.vue
index 4c196c4..1c71696 100644
--- a/ruoyi-ui/src/components/DictTag/index.vue
+++ b/src/components/DictTag/index.vue
@@ -36,7 +36,7 @@
   },
   computed: {
     values() {
-      if (this.value !== null && typeof this.value !== 'undefined') {
+      if (this.value !== null && typeof this.value !== "undefined") {
         return Array.isArray(this.value) ? this.value : [String(this.value)];
       } else {
         return [];
@@ -49,4 +49,4 @@
 .el-tag + .el-tag {
   margin-left: 10px;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/ruoyi-ui/src/components/Editor/index.vue b/src/components/Editor/index.vue
similarity index 99%
rename from ruoyi-ui/src/components/Editor/index.vue
rename to src/components/Editor/index.vue
index 6bb5a18..fccd83d 100644
--- a/ruoyi-ui/src/components/Editor/index.vue
+++ b/src/components/Editor/index.vue
@@ -1,3 +1,4 @@
+<!-- 涓婁紶鍥剧墖s -->
 <template>
   <div>
     <el-upload
diff --git a/ruoyi-ui/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
similarity index 81%
rename from ruoyi-ui/src/components/FileUpload/index.vue
rename to src/components/FileUpload/index.vue
index 6c583cf..cfc8070 100644
--- a/ruoyi-ui/src/components/FileUpload/index.vue
+++ b/src/components/FileUpload/index.vue
@@ -1,3 +1,4 @@
+<!-- 涓婁紶鏂囦欢 -->
 <template>
   <div class="upload-file">
     <el-upload
@@ -19,20 +20,38 @@
       <!-- 涓婁紶鎻愮ず -->
       <div class="el-upload__tip" slot="tip" v-if="showTip">
         璇蜂笂浼�
-        <template v-if="fileSize"> 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
-        <template v-if="fileType"> 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
+        <template v-if="fileSize">
+          澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b>
+        </template>
+        <template v-if="fileType">
+          鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
+        </template>
         鐨勬枃浠�
       </div>
     </el-upload>
 
     <!-- 鏂囦欢鍒楄〃 -->
-    <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
-      <li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
-        <el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
+    <transition-group
+      class="upload-file-list el-upload-list el-upload-list--text"
+      name="el-fade-in-linear"
+      tag="ul"
+    >
+      <li
+        :key="file.url"
+        class="el-upload-list__item ele-upload-list__item-content"
+        v-for="(file, index) in fileList"
+      >
+        <el-link
+          :href="`${baseUrl}${file.url}`"
+          :underline="false"
+          target="_blank"
+        >
           <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
         </el-link>
         <div class="ele-upload-list__item-content-action">
-          <el-link :underline="false" @click="handleDelete(index)" type="danger">鍒犻櫎</el-link>
+          <el-link :underline="false" @click="handleDelete(index)" type="danger"
+            >鍒犻櫎</el-link
+          >
         </div>
       </li>
     </transition-group>
@@ -65,8 +84,8 @@
     // 鏄惁鏄剧ず鎻愮ず
     isShowTip: {
       type: Boolean,
-      default: true
-    }
+      default: true,
+    },
   },
   data() {
     return {
@@ -86,9 +105,9 @@
         if (val) {
           let temp = 1;
           // 棣栧厛灏嗗�艰浆涓烘暟缁�
-          const list = Array.isArray(val) ? val : this.value.split(',');
+          const list = Array.isArray(val) ? val : this.value.split(",");
           // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁�
-          this.fileList = list.map(item => {
+          this.fileList = list.map((item) => {
             if (typeof item === "string") {
               item = { name: item, url: item };
             }
@@ -101,8 +120,8 @@
         }
       },
       deep: true,
-      immediate: true
-    }
+      immediate: true,
+    },
   },
   computed: {
     // 鏄惁鏄剧ず鎻愮ず
@@ -115,11 +134,13 @@
     handleBeforeUpload(file) {
       // 鏍℃鏂囦欢绫诲瀷
       if (this.fileType) {
-        const fileName = file.name.split('.');
+        const fileName = file.name.split(".");
         const fileExt = fileName[fileName.length - 1];
         const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
         if (!isTypeOk) {
-          this.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${this.fileType.join("/")}鏍煎紡鏂囦欢!`);
+          this.$modal.msgError(
+            `鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${this.fileType.join("/")}鏍煎紡鏂囦欢!`
+          );
           return false;
         }
       }
@@ -142,7 +163,7 @@
     // 涓婁紶澶辫触
     handleUploadError(err) {
       this.$modal.msgError("涓婁紶鏂囦欢澶辫触锛岃閲嶈瘯");
-      this.$modal.closeLoading()
+      this.$modal.closeLoading();
     },
     // 涓婁紶鎴愬姛鍥炶皟
     handleUploadSuccess(res, file) {
@@ -187,9 +208,9 @@
       for (let i in list) {
         strs += list[i].url + separator;
       }
-      return strs != '' ? strs.substr(0, strs.length - 1) : '';
-    }
-  }
+      return strs != "" ? strs.substr(0, strs.length - 1) : "";
+    },
+  },
 };
 </script>
 
diff --git a/ruoyi-ui/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue
similarity index 97%
rename from ruoyi-ui/src/components/Hamburger/index.vue
rename to src/components/Hamburger/index.vue
index 368b002..11e9435 100644
--- a/ruoyi-ui/src/components/Hamburger/index.vue
+++ b/src/components/Hamburger/index.vue
@@ -1,3 +1,4 @@
+<!-- svg鍥炬爣灏佽 -->
 <template>
   <div style="padding: 0 15px;" @click="toggleClick">
     <svg
diff --git a/ruoyi-ui/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue
similarity index 98%
rename from ruoyi-ui/src/components/HeaderSearch/index.vue
rename to src/components/HeaderSearch/index.vue
index c4d76bb..78fe2c0 100644
--- a/ruoyi-ui/src/components/HeaderSearch/index.vue
+++ b/src/components/HeaderSearch/index.vue
@@ -1,3 +1,4 @@
+<!-- 浣跨敤鍏ㄥ眬svgicon鍥炬爣 -->
 <template>
   <div :class="{'show':show}" class="header-search">
     <svg-icon class-name="search-icon" icon-class="search" @click.stop="click" />
diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..aa8d5a6
--- /dev/null
+++ b/src/components/IconSelect/index.vue
@@ -0,0 +1,82 @@
+<!-- @author zhengjie -->
+<!-- 鑷畾涔夊浘鏍囧悕绉板皝瑁� -->
+<template>
+  <div class="icon-body">
+    <el-input
+      v-model="name"
+      style="position: relative"
+      clearable
+      placeholder="璇疯緭鍏ュ浘鏍囧悕绉�"
+      @clear="filterIcons"
+      @input.native="filterIcons"
+    >
+      <i slot="suffix" class="el-icon-search el-input__icon" />
+    </el-input>
+    <div class="icon-list">
+      <div
+        v-for="(item, index) in iconList"
+        :key="index"
+        @click="selectedIcon(item)"
+      >
+        <svg-icon :icon-class="item" style="height: 30px; width: 16px" />
+        <span>{{ item }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import icons from "./requireIcons";
+export default {
+  name: "IconSelect",
+  data() {
+    return {
+      name: "",
+      iconList: icons,
+    };
+  },
+  methods: {
+    filterIcons() {
+      this.iconList = icons;
+      if (this.name) {
+        this.iconList = this.iconList.filter((item) =>
+          item.includes(this.name)
+        );
+      }
+    },
+    selectedIcon(name) {
+      this.$emit("selected", name);
+      document.body.click();
+    },
+    reset() {
+      this.name = "";
+      this.iconList = icons;
+    },
+  },
+};
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+.icon-body {
+  width: 100%;
+  padding: 10px;
+  .icon-list {
+    height: 200px;
+    overflow-y: scroll;
+    div {
+      height: 30px;
+      line-height: 30px;
+      margin-bottom: -5px;
+      cursor: pointer;
+      width: 33%;
+      float: left;
+    }
+    span {
+      display: inline-block;
+      vertical-align: -0.15em;
+      fill: currentColor;
+      overflow: hidden;
+    }
+  }
+}
+</style>
diff --git a/ruoyi-ui/src/components/IconSelect/requireIcons.js b/src/components/IconSelect/requireIcons.js
similarity index 100%
rename from ruoyi-ui/src/components/IconSelect/requireIcons.js
rename to src/components/IconSelect/requireIcons.js
diff --git a/ruoyi-ui/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue
similarity index 97%
rename from ruoyi-ui/src/components/ImagePreview/index.vue
rename to src/components/ImagePreview/index.vue
index 3c770c7..1423d80 100644
--- a/ruoyi-ui/src/components/ImagePreview/index.vue
+++ b/src/components/ImagePreview/index.vue
@@ -1,3 +1,4 @@
+<!-- image鍥剧墖瀹瑰櫒灏佽 -->
 <template>
   <el-image
     :src="`${realSrc}`"
diff --git a/ruoyi-ui/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue
similarity index 82%
rename from ruoyi-ui/src/components/ImageUpload/index.vue
rename to src/components/ImageUpload/index.vue
index b57a15e..f70e1fc 100644
--- a/ruoyi-ui/src/components/ImageUpload/index.vue
+++ b/src/components/ImageUpload/index.vue
@@ -1,3 +1,4 @@
+<!-- 涓婁紶鏂囦欢灏佽 -->
 <template>
   <div class="component-upload-image">
     <el-upload
@@ -15,16 +16,20 @@
       :headers="headers"
       :file-list="fileList"
       :on-preview="handlePictureCardPreview"
-      :class="{hide: this.fileList.length >= this.limit}"
+      :class="{ hide: this.fileList.length >= this.limit }"
     >
       <i class="el-icon-plus"></i>
     </el-upload>
-    
+
     <!-- 涓婁紶鎻愮ず -->
     <div class="el-upload__tip" slot="tip" v-if="showTip">
       璇蜂笂浼�
-      <template v-if="fileSize"> 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
-      <template v-if="fileType"> 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
+      <template v-if="fileSize">
+        澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b>
+      </template>
+      <template v-if="fileType">
+        鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
+      </template>
       鐨勬枃浠�
     </div>
 
@@ -55,7 +60,7 @@
     },
     // 澶у皬闄愬埗(MB)
     fileSize: {
-       type: Number,
+      type: Number,
       default: 5,
     },
     // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg']
@@ -66,8 +71,8 @@
     // 鏄惁鏄剧ず鎻愮ず
     isShowTip: {
       type: Boolean,
-      default: true
-    }
+      default: true,
+    },
   },
   data() {
     return {
@@ -81,7 +86,7 @@
       headers: {
         Authorization: "Bearer " + getToken(),
       },
-      fileList: []
+      fileList: [],
     };
   },
   watch: {
@@ -89,14 +94,14 @@
       handler(val) {
         if (val) {
           // 棣栧厛灏嗗�艰浆涓烘暟缁�
-          const list = Array.isArray(val) ? val : this.value.split(',');
+          const list = Array.isArray(val) ? val : this.value.split(",");
           // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁�
-          this.fileList = list.map(item => {
+          this.fileList = list.map((item) => {
             if (typeof item === "string") {
               if (item.indexOf(this.baseUrl) === -1) {
-                  item = { name: this.baseUrl + item, url: this.baseUrl + item };
+                item = { name: this.baseUrl + item, url: this.baseUrl + item };
               } else {
-                  item = { name: item, url: item };
+                item = { name: item, url: item };
               }
             }
             return item;
@@ -107,8 +112,8 @@
         }
       },
       deep: true,
-      immediate: true
-    }
+      immediate: true,
+    },
   },
   computed: {
     // 鏄惁鏄剧ず鎻愮ず
@@ -125,7 +130,7 @@
         if (file.name.lastIndexOf(".") > -1) {
           fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
         }
-        isImg = this.fileType.some(type => {
+        isImg = this.fileType.some((type) => {
           if (file.type.indexOf(type) > -1) return true;
           if (fileExtension && fileExtension.indexOf(type) > -1) return true;
           return false;
@@ -135,7 +140,9 @@
       }
 
       if (!isImg) {
-        this.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${this.fileType.join("/")}鍥剧墖鏍煎紡鏂囦欢!`);
+        this.$modal.msgError(
+          `鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${this.fileType.join("/")}鍥剧墖鏍煎紡鏂囦欢!`
+        );
         return false;
       }
       if (this.fileSize) {
@@ -167,8 +174,8 @@
     },
     // 鍒犻櫎鍥剧墖
     handleDelete(file) {
-      const findex = this.fileList.map(f => f.name).indexOf(file.name);
-      if(findex > -1) {
+      const findex = this.fileList.map((f) => f.name).indexOf(file.name);
+      if (findex > -1) {
         this.fileList.splice(findex, 1);
         this.$emit("input", this.listToString(this.fileList));
       }
@@ -202,25 +209,25 @@
           strs += list[i].url.replace(this.baseUrl, "") + separator;
         }
       }
-      return strs != '' ? strs.substr(0, strs.length - 1) : '';
-    }
-  }
+      return strs != "" ? strs.substr(0, strs.length - 1) : "";
+    },
+  },
 };
 </script>
 <style scoped lang="scss">
 // .el-upload--picture-card 鎺у埗鍔犲彿閮ㄥ垎
 ::v-deep.hide .el-upload--picture-card {
-    display: none;
+  display: none;
 }
 // 鍘绘帀鍔ㄧ敾鏁堟灉
 ::v-deep .el-list-enter-active,
 ::v-deep .el-list-leave-active {
-    transition: all 0s;
+  transition: all 0s;
 }
 
-::v-deep .el-list-enter, .el-list-leave-active {
-    opacity: 0;
-    transform: translateY(0);
+::v-deep .el-list-enter,
+.el-list-leave-active {
+  opacity: 0;
+  transform: translateY(0);
 }
 </style>
-
diff --git a/src/components/PageTools/index.vue b/src/components/PageTools/index.vue
new file mode 100644
index 0000000..5861bf4
--- /dev/null
+++ b/src/components/PageTools/index.vue
@@ -0,0 +1,42 @@
+<!-- tag鏍囩灏佽 -->
+<template>
+  <el-card class="box-card">
+    <el-row type="flex">
+      <el-col>
+        <el-tag v-if="isShowLeft">
+          <i :class="leftIon"></i>
+          <slot name="left-tag" />
+        </el-tag>
+      </el-col>
+      <el-col>
+        <el-row type="flex" justify="end">
+          <slot name="right" />
+        </el-row>
+      </el-col>
+    </el-row>
+  </el-card>
+</template>
+
+<script>
+export default {
+  name: "PageTools",
+  data() {
+    return {};
+  },
+  props: {
+    leftIon: {
+      type: String,
+      default: "el-icon-info",
+    },
+    isShowLeft: {
+      type: Boolean,
+      default: true,
+    },
+  },
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped></style>
diff --git a/ruoyi-ui/src/components/Pagination/index.vue b/src/components/Pagination/index.vue
similarity index 97%
rename from ruoyi-ui/src/components/Pagination/index.vue
rename to src/components/Pagination/index.vue
index 56f5a6b..3dc5b9f 100644
--- a/ruoyi-ui/src/components/Pagination/index.vue
+++ b/src/components/Pagination/index.vue
@@ -1,3 +1,5 @@
+
+<!-- 搴曢儴鍒嗛〉缁勪欢灏佽 -->
 <template>
   <div :class="{'hidden':hidden}" class="pagination-container">
     <el-pagination
@@ -16,6 +18,7 @@
 </template>
 
 <script>
+// 寰呭畾
 import { scrollTo } from '@/utils/scroll-to'
 
 export default {
diff --git a/ruoyi-ui/src/components/PanThumb/index.vue b/src/components/PanThumb/index.vue
similarity index 98%
rename from ruoyi-ui/src/components/PanThumb/index.vue
rename to src/components/PanThumb/index.vue
index 1bcf417..ee796e7 100644
--- a/ruoyi-ui/src/components/PanThumb/index.vue
+++ b/src/components/PanThumb/index.vue
@@ -1,3 +1,4 @@
+<!-- 鍥剧墖灞曠ず椤甸潰 -->
 <template>
   <div :style="{zIndex:zIndex,height:height,width:width}" class="pan-item">
     <div class="pan-info">
diff --git a/ruoyi-ui/src/components/ParentView/index.vue b/src/components/ParentView/index.vue
similarity index 100%
rename from ruoyi-ui/src/components/ParentView/index.vue
rename to src/components/ParentView/index.vue
diff --git a/ruoyi-ui/src/components/RightPanel/index.vue b/src/components/RightPanel/index.vue
similarity index 100%
rename from ruoyi-ui/src/components/RightPanel/index.vue
rename to src/components/RightPanel/index.vue
diff --git a/ruoyi-ui/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue
similarity index 69%
rename from ruoyi-ui/src/components/RightToolbar/index.vue
rename to src/components/RightToolbar/index.vue
index 527e07c..14dfa2d 100644
--- a/ruoyi-ui/src/components/RightToolbar/index.vue
+++ b/src/components/RightToolbar/index.vue
@@ -1,14 +1,42 @@
+<!-- 榧犳爣瑙﹀彂寮瑰嚭鎴� -->
 <template>
   <div class="top-right-btn" :style="style">
     <el-row>
-      <el-tooltip class="item" effect="dark" :content="showSearch ? '闅愯棌鎼滅储' : '鏄剧ず鎼滅储'" placement="top" v-if="search">
-        <el-button size="mini" circle icon="el-icon-search" @click="toggleSearch()" />
+      <el-tooltip
+        class="item"
+        effect="dark"
+        :content="showSearch ? '闅愯棌鎼滅储' : '鏄剧ず鎼滅储'"
+        placement="top"
+        v-if="search"
+      >
+        <el-button
+          size="mini"
+          circle
+          icon="el-icon-search"
+          @click="toggleSearch()"
+        />
       </el-tooltip>
       <el-tooltip class="item" effect="dark" content="鍒锋柊" placement="top">
-        <el-button size="mini" circle icon="el-icon-refresh" @click="refresh()" />
+        <el-button
+          size="mini"
+          circle
+          icon="el-icon-refresh"
+          @click="refresh()"
+        />
       </el-tooltip>
-      <el-tooltip class="item" effect="dark" content="鏄鹃殣鍒�" placement="top" v-if="columns">
-        <el-button size="mini" circle icon="el-icon-menu" @click="showColumn()" />
+      <el-tooltip
+        class="item"
+        effect="dark"
+        content="鏄鹃殣鍒�"
+        placement="top"
+        v-if="columns"
+      >
+        <el-button
+          size="mini"
+          circle
+          icon="el-icon-menu"
+          @click="showColumn()"
+        />
       </el-tooltip>
     </el-row>
     <el-dialog :title="title" :visible.sync="open" append-to-body>
@@ -37,7 +65,7 @@
   props: {
     showSearch: {
       type: Boolean,
-      default: true,
+      default: true, //required鏄惁蹇呴』锛屼负true娓叉煋鏃朵細鎶涘嚭typeError锛沝efault锛氶粯璁ゅ�硷紝
     },
     columns: {
       type: Array,
@@ -58,7 +86,7 @@
         ret.marginRight = `${this.gutter / 2}px`;
       }
       return ret;
-    }
+    },
   },
   created() {
     // 鏄鹃殣鍒楀垵濮嬮粯璁ら殣钘忓垪
diff --git a/ruoyi-ui/src/components/RuoYi/Doc/index.vue b/src/components/RuoYi/Doc/index.vue
similarity index 100%
rename from ruoyi-ui/src/components/RuoYi/Doc/index.vue
rename to src/components/RuoYi/Doc/index.vue
diff --git a/ruoyi-ui/src/components/RuoYi/Git/index.vue b/src/components/RuoYi/Git/index.vue
similarity index 100%
rename from ruoyi-ui/src/components/RuoYi/Git/index.vue
rename to src/components/RuoYi/Git/index.vue
diff --git a/ruoyi-ui/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue
similarity index 97%
rename from ruoyi-ui/src/components/Screenfull/index.vue
rename to src/components/Screenfull/index.vue
index d4e539c..1a81a5c 100644
--- a/ruoyi-ui/src/components/Screenfull/index.vue
+++ b/src/components/Screenfull/index.vue
@@ -1,3 +1,4 @@
+<!-- 鍥炬爣鐐瑰嚮鏀惧ぇ -->
 <template>
   <div>
     <svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" @click="click" />
diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..3cd013a
--- /dev/null
+++ b/src/components/SizeSelect/index.vue
@@ -0,0 +1,61 @@
+<!-- 涓嬫媺鑿滃崟灏佽 -->
+<template>
+  <el-dropdown trigger="click" @command="handleSetSize">
+    <div>
+      <svg-icon class-name="size-icon" icon-class="size" />
+    </div>
+    <el-dropdown-menu slot="dropdown">
+      <el-dropdown-item
+        v-for="item of sizeOptions"
+        :key="item.value"
+        :disabled="size === item.value"
+        :command="item.value"
+      >
+        {{ item.label }}
+      </el-dropdown-item>
+    </el-dropdown-menu>
+  </el-dropdown>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      sizeOptions: [
+        { label: "Default", value: "default" },
+        { label: "Medium", value: "medium" },
+        { label: "Small", value: "small" },
+        { label: "Mini", value: "mini" },
+      ],
+    };
+  },
+  computed: {
+    size() {
+      return this.$store.getters.size;
+    },
+  },
+  methods: {
+    handleSetSize(size) {
+      this.$ELEMENT.size = size;
+      this.$store.dispatch("app/setSize", size);
+      this.refreshView();
+      this.$message({
+        message: "Switch Size Success",
+        type: "success",
+      });
+    },
+    refreshView() {
+      // In order to make the cached page re-rendered
+      this.$store.dispatch("tagsView/delAllCachedViews", this.$route);
+
+      const { fullPath } = this.$route;
+
+      this.$nextTick(() => {
+        this.$router.replace({
+          path: "/redirect" + fullPath,
+        });
+      });
+    },
+  },
+};
+</script>
diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..97456a4
--- /dev/null
+++ b/src/components/SvgIcon/index.vue
@@ -0,0 +1,67 @@
+<!-- svg灏佽 -->
+<template>
+  <div
+    v-if="isExternal"
+    :style="styleExternalIcon"
+    class="svg-external-icon svg-icon"
+    v-on="$listeners"
+  />
+  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
+    <use :xlink:href="iconName" />
+  </svg>
+</template>
+
+<script>
+import { isExternal } from "@/utils/validate";
+
+export default {
+  name: "SvgIcon",
+  props: {
+    iconClass: {
+      type: String,
+      required: true,
+    },
+    className: {
+      type: String,
+      default: "",
+    },
+  },
+  computed: {
+    isExternal() {
+      return isExternal(this.iconClass);
+    },
+    iconName() {
+      return `#icon-${this.iconClass}`;
+    },
+    svgClass() {
+      if (this.className) {
+        return "svg-icon " + this.className;
+      } else {
+        return "svg-icon";
+      }
+    },
+    styleExternalIcon() {
+      return {
+        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
+        "-webkit-mask": `url(${this.iconClass}) no-repeat 50% 50%`,
+      };
+    },
+  },
+};
+</script>
+
+<style scoped>
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+
+.svg-external-icon {
+  background-color: currentColor;
+  mask-size: cover !important;
+  display: inline-block;
+}
+</style>
diff --git a/ruoyi-ui/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue
similarity index 99%
rename from ruoyi-ui/src/components/ThemePicker/index.vue
rename to src/components/ThemePicker/index.vue
index 1714e1f..aac3187 100644
--- a/ruoyi-ui/src/components/ThemePicker/index.vue
+++ b/src/components/ThemePicker/index.vue
@@ -1,3 +1,4 @@
+<!-- 棰滆壊閫夋嫨鍣� -->
 <template>
   <el-color-picker
     v-model="theme"
diff --git a/ruoyi-ui/src/components/TopNav/index.vue b/src/components/TopNav/index.vue
similarity index 72%
rename from ruoyi-ui/src/components/TopNav/index.vue
rename to src/components/TopNav/index.vue
index 5f0edbe..aec393d 100644
--- a/ruoyi-ui/src/components/TopNav/index.vue
+++ b/src/components/TopNav/index.vue
@@ -1,3 +1,4 @@
+<!-- 椤堕儴瀵艰埅灏佽 -->
 <template>
   <el-menu
     :default-active="activeMenu"
@@ -5,14 +6,22 @@
     @select="handleSelect"
   >
     <template v-for="(item, index) in topMenus">
-      <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber"
+      <el-menu-item
+        :style="{ '--theme': theme }"
+        :index="item.path"
+        :key="index"
+        v-if="index < visibleNumber"
         ><svg-icon :icon-class="item.meta.icon" />
         {{ item.meta.title }}</el-menu-item
       >
     </template>
 
     <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 -->
-    <el-submenu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber">
+    <el-submenu
+      :style="{ '--theme': theme }"
+      index="more"
+      v-if="topMenus.length > visibleNumber"
+    >
       <template slot="title">鏇村鑿滃崟</template>
       <template v-for="(item, index) in topMenus">
         <el-menu-item
@@ -31,7 +40,7 @@
 import { constantRoutes } from "@/router";
 
 // 闅愯棌渚ц竟鏍忚矾鐢�
-const hideList = ['/index', '/user/profile'];
+const hideList = ["/index", "/user/profile"];
 
 export default {
   data() {
@@ -39,7 +48,7 @@
       // 椤堕儴鏍忓垵濮嬫暟
       visibleNumber: 5,
       // 褰撳墠婵�娲昏彍鍗曠殑 index
-      currentIndex: undefined
+      currentIndex: undefined,
     };
   },
   computed: {
@@ -53,9 +62,9 @@
         if (menu.hidden !== true) {
           // 鍏煎椤堕儴鏍忎竴绾ц彍鍗曞唴閮ㄨ烦杞�
           if (menu.path === "/") {
-              topMenus.push(menu.children[0]);
+            topMenus.push(menu.children[0]);
           } else {
-              topMenus.push(menu);
+            topMenus.push(menu);
           }
         }
       });
@@ -71,11 +80,12 @@
       this.routers.map((router) => {
         for (var item in router.children) {
           if (router.children[item].parentPath === undefined) {
-            if(router.path === "/") {
+            if (router.path === "/") {
               router.children[item].path = "/" + router.children[item].path;
             } else {
-              if(!this.ishttp(router.children[item].path)) {
-                router.children[item].path = router.path + "/" + router.children[item].path;
+              if (!this.ishttp(router.children[item].path)) {
+                router.children[item].path =
+                  router.path + "/" + router.children[item].path;
               }
             }
             router.children[item].parentPath = router.path;
@@ -89,25 +99,29 @@
     activeMenu() {
       const path = this.$route.path;
       let activePath = path;
-      if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) {
+      if (
+        path !== undefined &&
+        path.lastIndexOf("/") > 0 &&
+        hideList.indexOf(path) === -1
+      ) {
         const tmpPath = path.substring(1, path.length);
         activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
         if (!this.$route.meta.link) {
-          this.$store.dispatch('app/toggleSideBarHide', false);
+          this.$store.dispatch("app/toggleSideBarHide", false);
         }
-      } else if(!this.$route.children) {
+      } else if (!this.$route.children) {
         activePath = path;
-        this.$store.dispatch('app/toggleSideBarHide', true);
+        this.$store.dispatch("app/toggleSideBarHide", true);
       }
       this.activeRoutes(activePath);
       return activePath;
     },
   },
   beforeMount() {
-    window.addEventListener('resize', this.setVisibleNumber)
+    window.addEventListener("resize", this.setVisibleNumber);
   },
   beforeDestroy() {
-    window.removeEventListener('resize', this.setVisibleNumber)
+    window.removeEventListener("resize", this.setVisibleNumber);
   },
   mounted() {
     this.setVisibleNumber();
@@ -121,18 +135,18 @@
     // 鑿滃崟閫夋嫨浜嬩欢
     handleSelect(key, keyPath) {
       this.currentIndex = key;
-      const route = this.routers.find(item => item.path === key);
+      const route = this.routers.find((item) => item.path === key);
       if (this.ishttp(key)) {
         // http(s):// 璺緞鏂扮獥鍙f墦寮�
         window.open(key, "_blank");
       } else if (!route || !route.children) {
         // 娌℃湁瀛愯矾鐢辫矾寰勫唴閮ㄦ墦寮�
         this.$router.push({ path: key });
-        this.$store.dispatch('app/toggleSideBarHide', true);
+        this.$store.dispatch("app/toggleSideBarHide", true);
       } else {
         // 鏄剧ず宸︿晶鑱斿姩鑿滃崟
         this.activeRoutes(key);
-        this.$store.dispatch('app/toggleSideBarHide', false);
+        this.$store.dispatch("app/toggleSideBarHide", false);
       }
     },
     // 褰撳墠婵�娲荤殑璺敱
@@ -145,15 +159,15 @@
           }
         });
       }
-      if(routes.length > 0) {
+      if (routes.length > 0) {
         this.$store.commit("SET_SIDEBAR_ROUTERS", routes);
       } else {
-        this.$store.dispatch('app/toggleSideBarHide', true);
+        this.$store.dispatch("app/toggleSideBarHide", true);
       }
     },
     ishttp(url) {
-      return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
-    }
+      return url.indexOf("http://") !== -1 || url.indexOf("https://") !== -1;
+    },
   },
 };
 </script>
@@ -168,8 +182,9 @@
   margin: 0 10px !important;
 }
 
-.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
-  border-bottom: 2px solid #{'var(--theme)'} !important;
+.topmenu-container.el-menu--horizontal > .el-menu-item.is-active,
+.el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
+  border-bottom: 2px solid #{"var(--theme)"} !important;
   color: #303133;
 }
 
diff --git a/src/components/UploadExcel/index.vue b/src/components/UploadExcel/index.vue
new file mode 100644
index 0000000..bf6d7a9
--- /dev/null
+++ b/src/components/UploadExcel/index.vue
@@ -0,0 +1,169 @@
+<!-- excel鏂囦欢涓婁紶 -->
+<template>
+  <div class="upload-excel">
+    <div class="btn-upload">
+      <el-button
+        :loading="loading"
+        size="mini"
+        type="primary"
+        @click="handleUpload"
+      >
+        鐐瑰嚮涓婁紶
+      </el-button>
+    </div>
+
+    <input
+      ref="excel-upload-input"
+      class="excel-upload-input"
+      type="file"
+      accept=".xlsx, .xls"
+      @change="handleClick"
+    />
+    <div
+      class="drop"
+      @drop="handleDrop"
+      @dragover="handleDragover"
+      @dragenter="handleDragover"
+    >
+      <i class="el-icon-upload" />
+      <span>灏嗘枃浠舵嫋鍒版澶�</span>
+    </div>
+  </div>
+</template>
+
+<script>
+import XLSX from "xlsx";
+export default {
+  name: "UploadExcel",
+  props: {
+    beforeUpload: Function, // eslint-disable-line
+    onSuccess: Function, // eslint-disable-line
+  },
+  data() {
+    return {
+      loading: false,
+      excelData: {
+        header: null,
+        results: null,
+      },
+    };
+  },
+  methods: {
+    generateData({ header, results }) {
+      this.excelData.header = header;
+      this.excelData.results = results;
+      this.onSuccess && this.onSuccess(this.excelData);
+    },
+    handleDrop(e) {
+      e.stopPropagation();
+      e.preventDefault();
+      if (this.loading) return;
+      const files = e.dataTransfer.files;
+      if (files.length !== 1) {
+        this.$message.error("Only support uploading one file!");
+        return;
+      }
+      const rawFile = files[0]; // only use files[0]
+      if (!this.isExcel(rawFile)) {
+        this.$message.error(
+          "Only supports upload .xlsx, .xls, .csv suffix files"
+        );
+        return false;
+      }
+      this.upload(rawFile);
+      e.stopPropagation();
+      e.preventDefault();
+    },
+    handleDragover(e) {
+      e.stopPropagation();
+      e.preventDefault();
+      e.dataTransfer.dropEffect = "copy";
+    },
+    handleUpload() {
+      this.$refs["excel-upload-input"].click();
+    },
+    handleClick(e) {
+      const files = e.target.files;
+      const rawFile = files[0]; // only use files[0]
+      if (!rawFile) return;
+      this.upload(rawFile);
+    },
+    upload(rawFile) {
+      this.$refs["excel-upload-input"].value = null; // fix can't select the same excel
+      if (!this.beforeUpload) {
+        this.readerData(rawFile);
+        return;
+      }
+      const before = this.beforeUpload(rawFile);
+      if (before) {
+        this.readerData(rawFile);
+      }
+    },
+    readerData(rawFile) {
+      this.loading = true;
+      return new Promise((resolve, reject) => {
+        const reader = new FileReader();
+        reader.onload = (e) => {
+          const data = e.target.result;
+          const workbook = XLSX.read(data, { type: "array" });
+          const firstSheetName = workbook.SheetNames[0];
+          const worksheet = workbook.Sheets[firstSheetName];
+          const header = this.getHeaderRow(worksheet);
+          const results = XLSX.utils.sheet_to_json(worksheet);
+          this.generateData({ header, results });
+          this.loading = false;
+          resolve();
+        };
+        reader.readAsArrayBuffer(rawFile);
+      });
+    },
+    getHeaderRow(sheet) {
+      const headers = [];
+      const range = XLSX.utils.decode_range(sheet["!ref"]);
+      let C;
+      const R = range.s.r;
+      /* start in the first row */
+      for (C = range.s.c; C <= range.e.c; ++C) {
+        /* walk every column in the range */
+        const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })];
+        /* find the cell in the first row */
+        let hdr = "UNKNOWN " + C; // <-- replace with your desired default
+        if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);
+        headers.push(hdr);
+      }
+      return headers;
+    },
+    isExcel(file) {
+      return /\.(xlsx|xls|csv)$/.test(file.name);
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.upload-excel {
+  display: flex;
+  justify-content: center;
+  margin-top: 100px;
+  .excel-upload-input {
+    display: none;
+    z-index: -9999;
+  }
+  .btn-upload,
+  .drop {
+    border: 1px dashed #bbb;
+    width: 350px;
+    height: 160px;
+    text-align: center;
+    line-height: 160px;
+  }
+  .drop {
+    line-height: 80px;
+    color: #bbb;
+    i {
+      font-size: 60px;
+      display: block;
+    }
+  }
+}
+</style>
diff --git a/src/components/UploadImg/index.vue b/src/components/UploadImg/index.vue
new file mode 100644
index 0000000..c294ed7
--- /dev/null
+++ b/src/components/UploadImg/index.vue
@@ -0,0 +1,116 @@
+<!-- 鍥剧墖涓婁紶灏佽 -->
+<template>
+  <div>
+    <el-upload
+      :file-list="filelist"
+      v-loading="loading"
+      element-loading-text="鎷煎懡鍔犺浇涓�"
+      element-loading-spinner="el-icon-loading"
+      element-loading-background="rgba(0, 0, 0, 0.8)"
+      action="https://jsonplaceholder.typicode.com/posts/"
+      :http-request="uoloadimg"
+      :on-change="onChange"
+      :on-remove="onRemove"
+      :on-preview="onPreview"
+      :before-upload="onBeforeUpload"
+      list-type="picture-card"
+      :limit="1"
+      :class="filelist.length === 1 ? 'father' : ''"
+      class="custom-upload"
+    >
+      <i class="el-icon-plus"></i>
+    </el-upload>
+    <el-dialog :visible.sync="fileonPreview">
+      <img :src="fileimg" alt="" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import COS from "cos-js-sdk-v5";
+var cos = new COS({
+  SecretId: "AKIDxlNmyua2FDwSjmeHGVVHxNYVghSyFhus",
+  SecretKey: "nPp8D5mKgomaBawHPI1avzuhJhqombCZ",
+});
+console.log(cos);
+export default {
+  name: "UploadImg",
+  data() {
+    return {
+      filelist: [],
+      fileimg: "",
+      fileonPreview: false,
+      loading: false,
+    };
+  },
+
+  created() {},
+
+  methods: {
+    // 鍙戦�佸浘鐗囦笂浼�
+    uoloadimg({ file }) {
+      this.loading = true;
+      cos.putObject(
+        {
+          Bucket: "hmhr-31-1313341522" /* 蹇呴』 */,
+          Region: "ap-shanghai" /* 瀛樺偍妗舵墍鍦ㄥ湴鍩燂紝蹇呴』瀛楁 */,
+          Key: file.name /* 蹇呴』 */,
+          StorageClass: "STANDARD",
+          Body: file, // 涓婁紶鏂囦欢瀵硅薄
+          onProgress: function (progressData) {
+            console.log(JSON.stringify(progressData));
+          },
+        },
+        (err, data) => {
+          this.loading = false;
+          if (err || data.statusCode != 200) {
+            return this.$$message.error("");
+          }
+          this.$emit("onSuccess", {
+            url: "https://" + data.Location,
+          });
+        }
+      );
+    },
+    // 瀛樺偍鍥剧墖鍒楄〃
+    onChange(file, filelist) {
+      this.filelist = filelist;
+    },
+    //鍒犻櫎
+    onRemove(file, filelist) {
+      this.filelist = filelist;
+    },
+    // 棰勮
+    onPreview(file) {
+      console.log(file);
+      this.fileonPreview = true;
+      this.fileimg = file.url;
+    },
+    // 涓婁紶鍓嶅垽鏂�
+    onBeforeUpload(file) {
+      console.log(file);
+      const types = ["image/jpeg", "image/png", "image/gif"];
+      if (!types.includes(file.type)) {
+        this.$message.error("璇烽�夋嫨" + types.join(", ") + "鏍煎紡鍥剧墖");
+        return false;
+      }
+      const maxSize = 1024 * 1024 * 2;
+      if (file.size > maxSize) {
+        this.$message.error("閫夋嫨鍥剧墖涓嶈秴杩�2mb");
+        return false;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.father .el-upload--picture-card {
+  display: none;
+}
+.custom-upload {
+  width: 148px;
+  height: 148px;
+  overflow: hidden;
+}
+</style>
diff --git a/ruoyi-ui/src/components/iFrame/index.vue b/src/components/iFrame/index.vue
similarity index 95%
rename from ruoyi-ui/src/components/iFrame/index.vue
rename to src/components/iFrame/index.vue
index 426857f..24a8ed5 100644
--- a/ruoyi-ui/src/components/iFrame/index.vue
+++ b/src/components/iFrame/index.vue
@@ -1,3 +1,4 @@
+<!-- 椤甸潰鍐呭祵鍏ュ皝瑁� -->
 <template>
   <div v-loading="loading" :style="'height:' + height">
     <iframe
diff --git a/src/components/index.js b/src/components/index.js
new file mode 100644
index 0000000..07d5b01
--- /dev/null
+++ b/src/components/index.js
@@ -0,0 +1,11 @@
+import PageTools from "@/components/PageTools"
+import UploadExcel from "@/components/UploadExcel"
+import UploadImg from "@/components/UploadImg"
+const component=[PageTools,UploadExcel,UploadImg]
+export default{
+    install(Vue){
+        component.forEach((component)=>{
+            Vue.component(component.name,component)
+        })
+    }
+}
\ No newline at end of file
diff --git a/src/constant/employees.js b/src/constant/employees.js
new file mode 100644
index 0000000..88bdd9d
--- /dev/null
+++ b/src/constant/employees.js
@@ -0,0 +1,429 @@
+// 鍛樺伐
+export default {
+  // 鑱樼敤褰㈠紡
+  hireType: [
+    {
+      id: 1,
+      value: '姝e紡'
+    },
+    {
+      id: 2,
+      value: '闈炴寮�'
+    }
+  ],
+  // 绠$悊褰㈠紡
+  subjection: [
+    {
+      id: '1',
+      value: '鎬婚儴'
+    },
+    {
+      id: '2',
+      value: '鍒嗗煄甯�'
+    }
+  ],
+  // 鍦ㄨ亴鐘舵��
+  workingState: [
+    {
+      id: '1',
+      value: '鍦ㄨ亴'
+    },
+    {
+      id: '2',
+      value: '绂昏亴'
+    }
+  ],
+  // 绂昏亴绫诲瀷
+  leaveType: [
+    {
+      id: '1',
+      value: '涓诲姩绂昏亴'
+    },
+    {
+      id: '2',
+      value: '琚姩绂昏亴'
+    },
+    {
+      id: '3',
+      value: '閫�浼�'
+    }
+  ],
+  // 鍑忓憳鏈�
+  attritionMonth: [
+    {
+      id: '1',
+      value: '绂昏亴鏃ユ湰鏈�'
+    },
+    {
+      id: '2',
+      value: '绂昏亴鏃ユ鏈�'
+    }
+  ],
+  // 鑱樼敤褰㈠紡
+  informaltype: [
+    {
+      id: '2',
+      value: '瀹炰範'
+    },
+    {
+      id: '3',
+      value: '鍔冲姟'
+    },
+    {
+      id: '4',
+      value: '椤鹃棶'
+    },
+    {
+      id: '5',
+      value: '杩旇仒'
+    },
+    {
+      id: '6',
+      value: '澶栧寘'
+    }
+  ],
+  // 鏈�楂樺鍘�
+  highestDegree: [
+    {
+      id: '1',
+      value: '鍒濅腑'
+    },
+    {
+      id: '2',
+      value: '楂樹腑'
+    },
+    {
+      id: '3',
+      value: '涓笓'
+    },
+    {
+      id: '4',
+      value: '澶т笓'
+    },
+    {
+      id: '5',
+      value: '鏈'
+    },
+    {
+      id: '6',
+      value: '纭曞+'
+    },
+    {
+      id: '7',
+      value: '鍗氬+'
+    },
+    {
+      id: '8',
+      value: '鍏朵粬'
+    }
+  ],
+  // 鍥藉/鍦板尯
+  isOverseas: [
+    {
+      id: '1',
+      value: '涓浗澶ч檰'
+    },
+    {
+      id: '2',
+      value: '娓境鍙板浗澶�'
+    }
+  ],
+  // 鎬у埆
+  gender: [
+    {
+      id: '1',
+      value: '鐢�'
+    },
+    {
+      id: '2',
+      value: '濂�'
+    }
+  ],
+  // 濠氬Щ鐘跺喌
+  maritaStatus: [
+    {
+      id: '1',
+      value: '鏈'
+    },
+    {
+      id: '2',
+      value: '宸插'
+    },
+    {
+      id: '3',
+      value: '绂诲紓'
+    }
+  ],
+  // 鐢熻倴
+  animalSymbol: [
+    {
+      id: '1',
+      value: '榧�'
+    },
+    {
+      id: '2',
+      value: '鐗�'
+    },
+    {
+      id: '3',
+      value: '铏�'
+    },
+    {
+      id: '4',
+      value: '鍏�'
+    },
+    {
+      id: '5',
+      value: '榫�'
+    },
+    {
+      id: '6',
+      value: '铔�'
+    },
+    {
+      id: '7',
+      value: '椹�'
+    },
+    {
+      id: '8',
+      value: '缇�'
+    },
+    {
+      id: '9',
+      value: '鐚�'
+    },
+    {
+      id: '10',
+      value: '楦�'
+    },
+    {
+      id: '11',
+      value: '鐙�'
+    },
+    {
+      id: '12',
+      value: '鐚�'
+    }
+  ],
+  // 鏄熷骇
+  constellation: [
+    {
+      code: 1,
+      value: '姘寸摱搴�'
+    },
+    {
+      code: 2,
+      value: '鍙岄奔搴�'
+    },
+    {
+      code: 3,
+      value: '鐧界緤搴�'
+    },
+    {
+      code: 4,
+      value: '閲戠墰搴�'
+    },
+    {
+      code: 5,
+      value: '鍙屽瓙搴�'
+    },
+    {
+      code: 6,
+      value: '宸ㄨ煿搴�'
+    },
+    {
+      code: 7,
+      value: '鐙瓙搴�'
+    },
+    {
+      code: 8,
+      value: '澶勫コ搴�'
+    },
+    {
+      code: 9,
+      value: '澶╃Г搴�'
+    },
+    {
+      code: 10,
+      value: '澶╄潕搴�'
+    },
+    {
+      code: 11,
+      value: '灏勬墜搴�'
+    },
+    {
+      code: 12,
+      value: '鎽╃警搴�'
+    }
+  ],
+  // 琛�鍨�
+  bloodType: [
+    {
+      id: '1',
+      value: 'A鍨�'
+    },
+    {
+      id: '2',
+      value: 'B鍨�'
+    },
+    {
+      id: '3',
+      value: 'O鍨�'
+    },
+    {
+      id: '4',
+      value: 'AB鍨�'
+    }
+  ],
+  // 瀛﹀巻
+  educationType: [
+    {
+      id: '1',
+      value: '缁熸嫑'
+    },
+    {
+      id: '2',
+      value: '鑷��'
+    },
+    {
+      id: '3',
+      value: '鎴愯��'
+    }
+  ],
+  // 杞
+  positiveType: [
+    {
+      id: '1',
+      value: '宸茶浆姝�'
+    },
+    {
+      id: '2',
+      value: '鏈浆姝�'
+    }
+  ],
+  // 鍚堝悓鏈熼檺
+  contractPeriod: [
+    {
+      id: '1',
+      value: '6鏈�'
+    },
+    {
+      id: '2',
+      value: '12鏈�'
+    },
+    {
+      id: '3',
+      value: '24鏈�'
+    },
+    {
+      id: '4',
+      value: '36鏈�'
+    },
+    {
+      id: '5',
+      value: '鍏朵粬'
+    }
+  ],
+  // 绛剧害娆℃暟
+  renewalCount: [
+    {
+      id: 1,
+      value: '0娆�'
+    },
+    {
+      id: 2,
+      value: '1娆�'
+    },
+    {
+      id: 3,
+      value: '2娆�'
+    },
+    {
+      id: 4,
+      value: '3娆�'
+    },
+    {
+      id: 5,
+      value: '4娆℃垨浠ヤ笂'
+    }
+  ],
+  // 绠�鍘嗘潵婧�
+  resumeSource: [
+    {
+      id: '1',
+      value: '鏅鸿仈鎷涜仒'
+    },
+    {
+      id: '2',
+      value: '鎷夊嬀缃�'
+    },
+    {
+      id: '3',
+      value: '鍓嶇▼鏃犲咖'
+    },
+    {
+      id: '4',
+      value: '鐚庤仒缃�'
+    },
+    {
+      id: '5',
+      value: '鏍″洯瀹h'
+    },
+    {
+      id: '6',
+      value: '鐚庡ご'
+    },
+    {
+      id: '7',
+      value: '鍐呴儴鎺ㄨ崘'
+    }
+  ],
+  // 绀炬嫑/鏍℃嫑
+  hireSourceType: [
+    {
+      id: '1',
+      value: '绀炬嫑'
+    },
+    {
+      id: '2',
+      value: '鏍℃嫑'
+    }
+  ],
+  // 鏂板姞
+  // 閮ㄩ棬
+  departments: [
+    {
+      id: '1',
+      value: '鎬昏鍔�'
+    },
+    {
+      id: '2',
+      value: '鐮旂┒闄�'
+    }
+  ],
+  // 鑱屼綅鐘舵��
+  stausInfos: [
+    {
+      id: '1',
+      value: '鍦ㄨ亴'
+    },
+    {
+      id: '2',
+      value: '鍏ヨ亴'
+    },
+    {
+      id: '3',
+      value: '绂昏亴'
+    }
+  ],
+  // 涓婁紶鏁版嵁琛ㄥご
+  importMapKeyPath: {
+    鍏ヨ亴鏃ユ湡: 'timeOfEntry',
+    濮撳悕: "username",
+    宸ュ彿: "workNumber",
+    鎵嬫満鍙�: "mobile",
+    杞鏃ユ湡: "correctionTime"
+}
+}
+
+
diff --git a/ruoyi-ui/src/directive/dialog/drag.js b/src/directive/dialog/drag.js
similarity index 100%
rename from ruoyi-ui/src/directive/dialog/drag.js
rename to src/directive/dialog/drag.js
diff --git a/ruoyi-ui/src/directive/dialog/dragHeight.js b/src/directive/dialog/dragHeight.js
similarity index 100%
rename from ruoyi-ui/src/directive/dialog/dragHeight.js
rename to src/directive/dialog/dragHeight.js
diff --git a/ruoyi-ui/src/directive/dialog/dragWidth.js b/src/directive/dialog/dragWidth.js
similarity index 100%
rename from ruoyi-ui/src/directive/dialog/dragWidth.js
rename to src/directive/dialog/dragWidth.js
diff --git a/ruoyi-ui/src/directive/index.js b/src/directive/index.js
similarity index 100%
rename from ruoyi-ui/src/directive/index.js
rename to src/directive/index.js
diff --git a/ruoyi-ui/src/directive/module/clipboard.js b/src/directive/module/clipboard.js
similarity index 100%
rename from ruoyi-ui/src/directive/module/clipboard.js
rename to src/directive/module/clipboard.js
diff --git a/ruoyi-ui/src/directive/permission/hasPermi.js b/src/directive/permission/hasPermi.js
similarity index 100%
rename from ruoyi-ui/src/directive/permission/hasPermi.js
rename to src/directive/permission/hasPermi.js
diff --git a/ruoyi-ui/src/directive/permission/hasRole.js b/src/directive/permission/hasRole.js
similarity index 100%
rename from ruoyi-ui/src/directive/permission/hasRole.js
rename to src/directive/permission/hasRole.js
diff --git a/src/directives/index.js b/src/directives/index.js
new file mode 100644
index 0000000..6dc4fc2
--- /dev/null
+++ b/src/directives/index.js
@@ -0,0 +1,22 @@
+export const imgError = {
+  // 褰撹缁戝畾鐨勫厓绱犳彃鍏ュ埌DOM涓�
+  inserted: function (el, { value }) {
+    // 鐩戝惉img/src鏄剧ず澶辫触鎯呭喌
+    if (!el.src) {
+      el.src = value
+    } else {
+      // 鑱氱劍
+      el.onerror = function () {
+        el.src = value
+      }
+    }
+  },
+  // 鎸囦护缁戝畾鐨勫厓绱犳洿鏂版椂鐢熸晥
+  updated(el,{ value}) {
+    if (!el.src) {
+      el.src=value
+    }
+  },
+}
+export const aa = {}
+export const bb = {}
diff --git a/src/filters/index.js b/src/filters/index.js
new file mode 100644
index 0000000..c16223a
--- /dev/null
+++ b/src/filters/index.js
@@ -0,0 +1,5 @@
+import dayjs from 'dayjs';
+// 杩囨护鍣�
+export const formatTime=(val)=>{
+    return dayjs(val).format('YYYY-MM-DD')
+  }
\ No newline at end of file
diff --git a/ruoyi-ui/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/AppMain.vue
rename to src/layout/components/AppMain.vue
diff --git a/ruoyi-ui/src/layout/components/IframeToggle/index.vue b/src/layout/components/IframeToggle/index.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/IframeToggle/index.vue
rename to src/layout/components/IframeToggle/index.vue
diff --git a/ruoyi-ui/src/layout/components/InnerLink/index.vue b/src/layout/components/InnerLink/index.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/InnerLink/index.vue
rename to src/layout/components/InnerLink/index.vue
diff --git a/ruoyi-ui/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/Navbar.vue
rename to src/layout/components/Navbar.vue
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
new file mode 100644
index 0000000..ac8860e
--- /dev/null
+++ b/src/layout/components/Settings/index.vue
@@ -0,0 +1,322 @@
+<template>
+  <el-drawer
+    size="280px"
+    :visible="visible"
+    :with-header="false"
+    :append-to-body="true"
+    :show-close="false"
+  >
+    <div class="drawer-container">
+      <div>
+        <div class="setting-drawer-content">
+          <div class="setting-drawer-title">
+            <h3 class="drawer-title">涓婚椋庢牸璁剧疆</h3>
+          </div>
+          <div class="setting-drawer-block-checbox">
+            <div
+              class="setting-drawer-block-checbox-item"
+              @click="handleTheme('theme-dark')"
+            >
+              <img src="@/assets/images/dark.svg" alt="dark" />
+              <div
+                v-if="sideTheme === 'theme-dark'"
+                class="setting-drawer-block-checbox-selectIcon"
+                style="display: block"
+              >
+                <i aria-label="鍥炬爣: check" class="anticon anticon-check">
+                  <svg
+                    viewBox="64 64 896 896"
+                    data-icon="check"
+                    width="1em"
+                    height="1em"
+                    :fill="theme"
+                    aria-hidden="true"
+                    focusable="false"
+                    class=""
+                  >
+                    <path
+                      d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"
+                    />
+                  </svg>
+                </i>
+              </div>
+            </div>
+            <div
+              class="setting-drawer-block-checbox-item"
+              @click="handleTheme('theme-light')"
+            >
+              <img src="@/assets/images/light.svg" alt="light" />
+              <div
+                v-if="sideTheme === 'theme-light'"
+                class="setting-drawer-block-checbox-selectIcon"
+                style="display: block"
+              >
+                <i aria-label="鍥炬爣: check" class="anticon anticon-check">
+                  <svg
+                    viewBox="64 64 896 896"
+                    data-icon="check"
+                    width="1em"
+                    height="1em"
+                    :fill="theme"
+                    aria-hidden="true"
+                    focusable="false"
+                    class=""
+                  >
+                    <path
+                      d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"
+                    />
+                  </svg>
+                </i>
+              </div>
+            </div>
+          </div>
+
+          <div class="drawer-item">
+            <span>涓婚棰滆壊</span>
+            <theme-picker
+              style="float: right; height: 26px; margin: -3px 8px 0 0"
+              @change="themeChange"
+            />
+          </div>
+        </div>
+
+        <el-divider />
+
+        <h3 class="drawer-title">绯荤粺甯冨眬閰嶇疆</h3>
+
+        <div class="drawer-item">
+          <span>寮�鍚� TopNav</span>
+          <el-switch v-model="topNav" class="drawer-switch" />
+        </div>
+
+        <div class="drawer-item">
+          <span>寮�鍚� Tags-Views</span>
+          <el-switch v-model="tagsView" class="drawer-switch" />
+        </div>
+
+        <div class="drawer-item">
+          <span>鍥哄畾 Header</span>
+          <el-switch v-model="fixedHeader" class="drawer-switch" />
+        </div>
+
+        <div class="drawer-item">
+          <span>鏄剧ず Logo</span>
+          <el-switch v-model="sidebarLogo" class="drawer-switch" />
+        </div>
+
+        <div class="drawer-item">
+          <span>鍔ㄦ�佹爣棰�</span>
+          <el-switch v-model="dynamicTitle" class="drawer-switch" />
+        </div>
+
+        <el-divider />
+
+        <el-button
+          size="small"
+          type="primary"
+          plain
+          icon="el-icon-document-add"
+          @click="saveSetting"
+          >淇濆瓨閰嶇疆</el-button
+        >
+        <el-button
+          size="small"
+          plain
+          icon="el-icon-refresh"
+          @click="resetSetting"
+          >閲嶇疆閰嶇疆</el-button
+        >
+      </div>
+    </div>
+  </el-drawer>
+</template>
+
+<script>
+import ThemePicker from "@/components/ThemePicker";
+
+export default {
+  components: { ThemePicker },
+  data() {
+    return {
+      theme: this.$store.state.settings.theme,
+      sideTheme: this.$store.state.settings.sideTheme,
+    };
+  },
+  computed: {
+    visible: {
+      get() {
+        return this.$store.state.settings.showSettings;
+      },
+    },
+    fixedHeader: {
+      get() {
+        return this.$store.state.settings.fixedHeader;
+      },
+      set(val) {
+        this.$store.dispatch("settings/changeSetting", {
+          key: "fixedHeader",
+          value: val,
+        });
+      },
+    },
+    topNav: {
+      get() {
+        return this.$store.state.settings.topNav;
+      },
+      set(val) {
+        this.$store.dispatch("settings/changeSetting", {
+          key: "topNav",
+          value: val,
+        });
+        if (!val) {
+          this.$store.dispatch("app/toggleSideBarHide", false);
+          this.$store.commit(
+            "SET_SIDEBAR_ROUTERS",
+            this.$store.state.permission.defaultRoutes
+          );
+        }
+      },
+    },
+    tagsView: {
+      get() {
+        return this.$store.state.settings.tagsView;
+      },
+      set(val) {
+        this.$store.dispatch("settings/changeSetting", {
+          key: "tagsView",
+          value: val,
+        });
+      },
+    },
+    sidebarLogo: {
+      get() {
+        return this.$store.state.settings.sidebarLogo;
+      },
+      set(val) {
+        this.$store.dispatch("settings/changeSetting", {
+          key: "sidebarLogo",
+          value: val,
+        });
+      },
+    },
+    dynamicTitle: {
+      get() {
+        return this.$store.state.settings.dynamicTitle;
+      },
+      set(val) {
+        this.$store.dispatch("settings/changeSetting", {
+          key: "dynamicTitle",
+          value: val,
+        });
+      },
+    },
+  },
+  methods: {
+    themeChange(val) {
+      this.$store.dispatch("settings/changeSetting", {
+        key: "theme",
+        value: val,
+      });
+      this.theme = val;
+    },
+    handleTheme(val) {
+      this.$store.dispatch("settings/changeSetting", {
+        key: "sideTheme",
+        value: val,
+      });
+      this.sideTheme = val;
+    },
+    saveSetting() {
+      this.$modal.loading("姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�...");
+      //瀛樺偍鏈湴鏁版嵁
+      this.$cache.local.set(
+        "layout-setting",
+        `{
+            "topNav":${this.topNav},
+            "tagsView":${this.tagsView},
+            "fixedHeader":${this.fixedHeader},
+            "sidebarLogo":${this.sidebarLogo},
+            "dynamicTitle":${this.dynamicTitle},
+            "sideTheme":"${this.sideTheme}",
+            "theme":"${this.theme}"
+          }`
+      );
+      setTimeout(this.$modal.closeLoading(), 1000);
+    },
+    resetSetting() {
+      this.$modal.loading("姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�...");
+      this.$cache.local.remove("layout-setting");
+      setTimeout("window.location.reload()", 1000);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.setting-drawer-content {
+  .setting-drawer-title {
+    margin-bottom: 12px;
+    color: rgba(0, 0, 0, 0.85);
+    font-size: 14px;
+    line-height: 22px;
+    font-weight: bold;
+  }
+
+  .setting-drawer-block-checbox {
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+    margin-top: 10px;
+    margin-bottom: 20px;
+
+    .setting-drawer-block-checbox-item {
+      position: relative;
+      margin-right: 16px;
+      border-radius: 2px;
+      cursor: pointer;
+
+      img {
+        width: 48px;
+        height: 48px;
+      }
+
+      .setting-drawer-block-checbox-selectIcon {
+        position: absolute;
+        top: 0;
+        right: 0;
+        width: 100%;
+        height: 100%;
+        padding-top: 15px;
+        padding-left: 24px;
+        color: #1890ff;
+        font-weight: 700;
+        font-size: 14px;
+      }
+    }
+  }
+}
+
+.drawer-container {
+  padding: 20px;
+  font-size: 14px;
+  line-height: 1.5;
+  word-wrap: break-word;
+
+  .drawer-title {
+    margin-bottom: 12px;
+    color: rgba(0, 0, 0, 0.85);
+    font-size: 14px;
+    line-height: 22px;
+  }
+
+  .drawer-item {
+    color: rgba(0, 0, 0, 0.65);
+    font-size: 14px;
+    padding: 12px 0;
+  }
+
+  .drawer-switch {
+    float: right;
+  }
+}
+</style>
diff --git a/ruoyi-ui/src/layout/components/Sidebar/FixiOSBug.js b/src/layout/components/Sidebar/FixiOSBug.js
similarity index 100%
rename from ruoyi-ui/src/layout/components/Sidebar/FixiOSBug.js
rename to src/layout/components/Sidebar/FixiOSBug.js
diff --git a/ruoyi-ui/src/layout/components/Sidebar/Item.vue b/src/layout/components/Sidebar/Item.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/Sidebar/Item.vue
rename to src/layout/components/Sidebar/Item.vue
diff --git a/ruoyi-ui/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/Sidebar/Link.vue
rename to src/layout/components/Sidebar/Link.vue
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..7245441
--- /dev/null
+++ b/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,128 @@
+<template>
+  <div
+    class="sidebar-logo-container"
+    :class="{ collapse: collapse }"
+    :style="{
+      backgroundColor:
+        sideTheme === 'theme-dark'
+          ? variables.menuBackground
+          : variables.menuLightBackground,
+    }"
+  >
+    <transition name="sidebarLogoFade">
+      <router-link
+        v-if="collapse"
+        key="collapse"
+        class="sidebar-logo-link"
+        to="/"
+      >
+        <img v-if="logo" :src="logo" class="sidebar-logo" />
+        <h1
+          v-else
+          class="sidebar-title"
+          :style="{
+            color:
+              sideTheme === 'theme-dark'
+                ? variables.logoTitleColor
+                : variables.logoLightTitleColor,
+          }"
+        >
+          {{ title }}
+        </h1>
+      </router-link>
+      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
+        <img v-if="logo" :src="logo" class="sidebar-logo" />
+        <h1
+          class="sidebar-title"
+          :style="{
+            color:
+              sideTheme === 'theme-dark'
+                ? variables.logoTitleColor
+                : variables.logoLightTitleColor,
+          }"
+        >
+          {{ title }}
+        </h1>
+      </router-link>
+    </transition>
+  </div>
+</template>
+
+<script>
+import logoImg from "@/assets/logo/logo.png";
+import variables from "@/assets/styles/variables.scss";
+
+export default {
+  name: "SidebarLogo",
+  props: {
+    collapse: {
+      type: Boolean,
+      required: true,
+    },
+  },
+  computed: {
+    variables() {
+      return variables;
+    },
+    sideTheme() {
+      return this.$store.state.settings.sideTheme;
+    },
+  },
+  data() {
+    return {
+      title: "鏅烘収闅忚绠$悊绯荤粺",
+      logo: logoImg,
+    };
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.sidebarLogoFade-enter-active {
+  transition: opacity 1.5s;
+}
+
+.sidebarLogoFade-enter,
+.sidebarLogoFade-leave-to {
+  opacity: 0;
+}
+
+.sidebar-logo-container {
+  position: relative;
+  width: 100%;
+  height: 50px;
+  line-height: 50px;
+  background: #2b2f3a;
+  text-align: center;
+  overflow: hidden;
+
+  & .sidebar-logo-link {
+    height: 100%;
+    width: 100%;
+
+    & .sidebar-logo {
+      width: 42px;
+      height: 42px;
+      vertical-align: middle;
+      margin-right: 12px;
+    }
+
+    & .sidebar-title {
+      display: inline-block;
+      margin: 0;
+      color: #fff;
+      font-weight: 600;
+      line-height: 50px;
+      font-size: 16px;
+      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
+      vertical-align: middle;
+    }
+  }
+
+  &.collapse {
+    .sidebar-logo {
+      margin-right: 0px;
+    }
+  }
+}
+</style>
diff --git a/ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue
rename to src/layout/components/Sidebar/SidebarItem.vue
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..f6adb6b
--- /dev/null
+++ b/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,79 @@
+<template>
+  <div
+    :class="{ 'has-logo': showLogo }"
+    :style="{
+      backgroundColor:
+        settings.sideTheme === 'theme-dark'
+          ? variables.menuBackground
+          : variables.menuLightBackground,
+    }"
+  >
+    <logo v-if="showLogo" :collapse="isCollapse" />
+    <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
+      <el-menu
+        :default-active="activeMenu"
+        :collapse="isCollapse"
+        :background-color="
+          settings.sideTheme === 'theme-dark'
+            ? variables.menuBackground
+            : variables.menuLightBackground
+        "
+        :text-color="
+          settings.sideTheme === 'theme-dark'
+            ? variables.menuColor
+            : variables.menuLightColor
+        "
+        :unique-opened="true"
+        :active-text-color="variables.menuActiveText"
+        :collapse-transition="false"
+        mode="vertical"
+      >
+        <sidebar-item
+          v-for="(route, index) in sidebarRouters"
+          :key="route.path + index"
+          :item="route"
+          :base-path="route.path"
+        />
+      </el-menu>
+    </el-scrollbar>
+  </div>
+</template>
+
+<script>
+import { mapGetters, mapState } from "vuex";
+import Logo from "./Logo";
+import SidebarItem from "./SidebarItem";
+import variables from "@/assets/styles/variables.scss";
+
+export default {
+  components: { SidebarItem, Logo },
+  computed: {
+    ...mapState(["settings"]),
+    ...mapGetters(["sidebarRouters", "sidebar"]),
+    activeMenu() {
+      const route = this.$route;
+      const { meta, path } = route;
+      // if set path, the sidebar will highlight the path you set
+      if (meta.activeMenu) {
+        return meta.activeMenu;
+      }
+      return path;
+    },
+    showLogo() {
+      return this.$store.state.settings.sidebarLogo;
+    },
+    variables() {
+      return variables;
+    },
+    isCollapse() {
+      return !this.sidebar.opened;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-menu-demo {
+  font-size: 28px;
+}
+</style>
diff --git a/ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue
rename to src/layout/components/TagsView/ScrollPane.vue
diff --git a/ruoyi-ui/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue
similarity index 100%
rename from ruoyi-ui/src/layout/components/TagsView/index.vue
rename to src/layout/components/TagsView/index.vue
diff --git a/ruoyi-ui/src/layout/components/index.js b/src/layout/components/index.js
similarity index 100%
rename from ruoyi-ui/src/layout/components/index.js
rename to src/layout/components/index.js
diff --git a/ruoyi-ui/src/layout/index.vue b/src/layout/index.vue
similarity index 100%
rename from ruoyi-ui/src/layout/index.vue
rename to src/layout/index.vue
diff --git a/ruoyi-ui/src/layout/mixin/ResizeHandler.js b/src/layout/mixin/ResizeHandler.js
similarity index 100%
rename from ruoyi-ui/src/layout/mixin/ResizeHandler.js
rename to src/layout/mixin/ResizeHandler.js
diff --git a/ruoyi-ui/src/main.js b/src/main.js
similarity index 86%
rename from ruoyi-ui/src/main.js
rename to src/main.js
index 13c6cf2..c95a818 100644
--- a/ruoyi-ui/src/main.js
+++ b/src/main.js
@@ -1,6 +1,7 @@
 import Vue from 'vue'
 
 import Cookies from 'js-cookie'
+import * as echarts from "echarts";
 
 import Element from 'element-ui'
 import './assets/styles/element-variables.scss'
@@ -37,8 +38,18 @@
 import VueMeta from 'vue-meta'
 // 瀛楀吀鏁版嵁缁勪欢
 import DictData from '@/components/DictData'
+// 缁勪欢灏佽闆嗘垚
+import components from './components'
+// 娉ㄥ唽杩囨护鍣�
+// 鑷畾涔夋寚浠�
+import * as directives from './directives'
+import * as filters from './filters'
+for(let key in filters){
+Vue.filter(key, filters[key])
+}
 
 // 鍏ㄥ眬鏂规硶鎸傝浇
+
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getConfigKey = getConfigKey
 Vue.prototype.parseTime = parseTime
@@ -48,7 +59,6 @@
 Vue.prototype.selectDictLabels = selectDictLabels
 Vue.prototype.download = download
 Vue.prototype.handleTree = handleTree
-
 // 鍏ㄥ眬缁勪欢鎸傝浇
 Vue.component('DictTag', DictTag)
 Vue.component('Pagination', Pagination)
@@ -58,10 +68,15 @@
 Vue.component('ImageUpload', ImageUpload)
 Vue.component('ImagePreview', ImagePreview)
 
+
+// 灏佽鑷畾涔夋寚浠�
+for(let key in directives)
+Vue.directive(key, directives[key])
 Vue.use(directive)
 Vue.use(plugins)
 Vue.use(VueMeta)
 DictData.install()
+Vue.use(components)
 
 /**
  * If you don't want to use mock-server
diff --git a/ruoyi-ui/src/permission.js b/src/permission.js
similarity index 100%
rename from ruoyi-ui/src/permission.js
rename to src/permission.js
diff --git a/ruoyi-ui/src/plugins/auth.js b/src/plugins/auth.js
similarity index 100%
rename from ruoyi-ui/src/plugins/auth.js
rename to src/plugins/auth.js
diff --git a/ruoyi-ui/src/plugins/cache.js b/src/plugins/cache.js
similarity index 100%
rename from ruoyi-ui/src/plugins/cache.js
rename to src/plugins/cache.js
diff --git a/ruoyi-ui/src/plugins/download.js b/src/plugins/download.js
similarity index 100%
rename from ruoyi-ui/src/plugins/download.js
rename to src/plugins/download.js
diff --git a/ruoyi-ui/src/plugins/index.js b/src/plugins/index.js
similarity index 100%
rename from ruoyi-ui/src/plugins/index.js
rename to src/plugins/index.js
diff --git a/ruoyi-ui/src/plugins/modal.js b/src/plugins/modal.js
similarity index 100%
rename from ruoyi-ui/src/plugins/modal.js
rename to src/plugins/modal.js
diff --git a/ruoyi-ui/src/plugins/tab.js b/src/plugins/tab.js
similarity index 100%
rename from ruoyi-ui/src/plugins/tab.js
rename to src/plugins/tab.js
diff --git a/ruoyi-ui/src/router/index.js b/src/router/index.js
similarity index 100%
rename from ruoyi-ui/src/router/index.js
rename to src/router/index.js
diff --git a/ruoyi-ui/src/settings.js b/src/settings.js
similarity index 100%
rename from ruoyi-ui/src/settings.js
rename to src/settings.js
diff --git a/ruoyi-ui/src/smartor/components/dataview/xformview/xformview.vue b/src/smartor/components/dataview/xformview/xformview.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/components/dataview/xformview/xformview.vue
rename to src/smartor/components/dataview/xformview/xformview.vue
diff --git a/ruoyi-ui/src/smartor/components/dataview/xgridview/xgridview.vue b/src/smartor/components/dataview/xgridview/xgridview.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/components/dataview/xgridview/xgridview.vue
rename to src/smartor/components/dataview/xgridview/xgridview.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_patarchive_base.vue b/src/smartor/dataobject/dw_patarchive_base.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_patarchive_base.vue
rename to src/smartor/dataobject/dw_patarchive_base.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_patarchive_list.vue b/src/smartor/dataobject/dw_patarchive_list.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_patarchive_list.vue
rename to src/smartor/dataobject/dw_patarchive_list.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_patinhosp_base.vue b/src/smartor/dataobject/dw_patinhosp_base.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_patinhosp_base.vue
rename to src/smartor/dataobject/dw_patinhosp_base.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_patinhosp_list.vue b/src/smartor/dataobject/dw_patinhosp_list.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_patinhosp_list.vue
rename to src/smartor/dataobject/dw_patinhosp_list.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_patouthosp_base.vue b/src/smartor/dataobject/dw_patouthosp_base.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_patouthosp_base.vue
rename to src/smartor/dataobject/dw_patouthosp_base.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_patouthosp_list.vue b/src/smartor/dataobject/dw_patouthosp_list.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_patouthosp_list.vue
rename to src/smartor/dataobject/dw_patouthosp_list.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_svytopic_maint.vue b/src/smartor/dataobject/dw_svytopic_maint.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_svytopic_maint.vue
rename to src/smartor/dataobject/dw_svytopic_maint.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_svytopic_view.vue b/src/smartor/dataobject/dw_svytopic_view.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_svytopic_view.vue
rename to src/smartor/dataobject/dw_svytopic_view.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_svytopicoption_list.vue b/src/smartor/dataobject/dw_svytopicoption_list.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_svytopicoption_list.vue
rename to src/smartor/dataobject/dw_svytopicoption_list.vue
diff --git a/ruoyi-ui/src/smartor/dataobject/dw_svytopicoption_maint.vue b/src/smartor/dataobject/dw_svytopicoption_maint.vue
similarity index 100%
rename from ruoyi-ui/src/smartor/dataobject/dw_svytopicoption_maint.vue
rename to src/smartor/dataobject/dw_svytopicoption_maint.vue
diff --git a/ruoyi-ui/src/store/getters.js b/src/store/getters.js
similarity index 100%
rename from ruoyi-ui/src/store/getters.js
rename to src/store/getters.js
diff --git a/ruoyi-ui/src/store/index.js b/src/store/index.js
similarity index 100%
rename from ruoyi-ui/src/store/index.js
rename to src/store/index.js
diff --git a/ruoyi-ui/src/store/modules/app.js b/src/store/modules/app.js
similarity index 100%
rename from ruoyi-ui/src/store/modules/app.js
rename to src/store/modules/app.js
diff --git a/ruoyi-ui/src/store/modules/dict.js b/src/store/modules/dict.js
similarity index 100%
rename from ruoyi-ui/src/store/modules/dict.js
rename to src/store/modules/dict.js
diff --git a/ruoyi-ui/src/store/modules/permission.js b/src/store/modules/permission.js
similarity index 100%
rename from ruoyi-ui/src/store/modules/permission.js
rename to src/store/modules/permission.js
diff --git a/ruoyi-ui/src/store/modules/settings.js b/src/store/modules/settings.js
similarity index 96%
rename from ruoyi-ui/src/store/modules/settings.js
rename to src/store/modules/settings.js
index 2455a1e..61c197c 100644
--- a/ruoyi-ui/src/store/modules/settings.js
+++ b/src/store/modules/settings.js
@@ -5,7 +5,7 @@
 const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
 const state = {
   title: '',
-  theme: storageSetting.theme || '#409EFF',
+  theme: storageSetting.theme ,
   sideTheme: storageSetting.sideTheme || sideTheme,
   showSettings: showSettings,
   topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
diff --git a/ruoyi-ui/src/store/modules/tagsView.js b/src/store/modules/tagsView.js
similarity index 100%
rename from ruoyi-ui/src/store/modules/tagsView.js
rename to src/store/modules/tagsView.js
diff --git a/ruoyi-ui/src/store/modules/user.js b/src/store/modules/user.js
similarity index 100%
rename from ruoyi-ui/src/store/modules/user.js
rename to src/store/modules/user.js
diff --git a/ruoyi-ui/src/utils/auth.js b/src/utils/auth.js
similarity index 100%
rename from ruoyi-ui/src/utils/auth.js
rename to src/utils/auth.js
diff --git a/ruoyi-ui/src/utils/dict/Dict.js b/src/utils/dict/Dict.js
similarity index 100%
rename from ruoyi-ui/src/utils/dict/Dict.js
rename to src/utils/dict/Dict.js
diff --git a/ruoyi-ui/src/utils/dict/DictConverter.js b/src/utils/dict/DictConverter.js
similarity index 100%
rename from ruoyi-ui/src/utils/dict/DictConverter.js
rename to src/utils/dict/DictConverter.js
diff --git a/ruoyi-ui/src/utils/dict/DictData.js b/src/utils/dict/DictData.js
similarity index 100%
rename from ruoyi-ui/src/utils/dict/DictData.js
rename to src/utils/dict/DictData.js
diff --git a/ruoyi-ui/src/utils/dict/DictMeta.js b/src/utils/dict/DictMeta.js
similarity index 100%
rename from ruoyi-ui/src/utils/dict/DictMeta.js
rename to src/utils/dict/DictMeta.js
diff --git a/ruoyi-ui/src/utils/dict/DictOptions.js b/src/utils/dict/DictOptions.js
similarity index 100%
rename from ruoyi-ui/src/utils/dict/DictOptions.js
rename to src/utils/dict/DictOptions.js
diff --git a/ruoyi-ui/src/utils/dict/index.js b/src/utils/dict/index.js
similarity index 100%
rename from ruoyi-ui/src/utils/dict/index.js
rename to src/utils/dict/index.js
diff --git a/ruoyi-ui/src/utils/errorCode.js b/src/utils/errorCode.js
similarity index 100%
rename from ruoyi-ui/src/utils/errorCode.js
rename to src/utils/errorCode.js
diff --git a/ruoyi-ui/src/utils/generator/config.js b/src/utils/generator/config.js
similarity index 100%
rename from ruoyi-ui/src/utils/generator/config.js
rename to src/utils/generator/config.js
diff --git a/ruoyi-ui/src/utils/generator/css.js b/src/utils/generator/css.js
similarity index 100%
rename from ruoyi-ui/src/utils/generator/css.js
rename to src/utils/generator/css.js
diff --git a/ruoyi-ui/src/utils/generator/drawingDefault.js b/src/utils/generator/drawingDefault.js
similarity index 100%
rename from ruoyi-ui/src/utils/generator/drawingDefault.js
rename to src/utils/generator/drawingDefault.js
diff --git a/ruoyi-ui/src/utils/generator/html.js b/src/utils/generator/html.js
similarity index 100%
rename from ruoyi-ui/src/utils/generator/html.js
rename to src/utils/generator/html.js
diff --git a/ruoyi-ui/src/utils/generator/icon.json b/src/utils/generator/icon.json
similarity index 100%
rename from ruoyi-ui/src/utils/generator/icon.json
rename to src/utils/generator/icon.json
diff --git a/ruoyi-ui/src/utils/generator/js.js b/src/utils/generator/js.js
similarity index 100%
rename from ruoyi-ui/src/utils/generator/js.js
rename to src/utils/generator/js.js
diff --git a/ruoyi-ui/src/utils/generator/render.js b/src/utils/generator/render.js
similarity index 100%
rename from ruoyi-ui/src/utils/generator/render.js
rename to src/utils/generator/render.js
diff --git a/ruoyi-ui/src/utils/index.js b/src/utils/index.js
similarity index 100%
rename from ruoyi-ui/src/utils/index.js
rename to src/utils/index.js
diff --git a/ruoyi-ui/src/utils/jsencrypt.js b/src/utils/jsencrypt.js
similarity index 100%
rename from ruoyi-ui/src/utils/jsencrypt.js
rename to src/utils/jsencrypt.js
diff --git a/ruoyi-ui/src/utils/permission.js b/src/utils/permission.js
similarity index 100%
rename from ruoyi-ui/src/utils/permission.js
rename to src/utils/permission.js
diff --git a/ruoyi-ui/src/utils/request.js b/src/utils/request.js
similarity index 100%
rename from ruoyi-ui/src/utils/request.js
rename to src/utils/request.js
diff --git a/ruoyi-ui/src/utils/ruoyi.js b/src/utils/ruoyi.js
similarity index 100%
rename from ruoyi-ui/src/utils/ruoyi.js
rename to src/utils/ruoyi.js
diff --git a/ruoyi-ui/src/utils/scroll-to.js b/src/utils/scroll-to.js
similarity index 100%
rename from ruoyi-ui/src/utils/scroll-to.js
rename to src/utils/scroll-to.js
diff --git a/ruoyi-ui/src/utils/validate.js b/src/utils/validate.js
similarity index 100%
rename from ruoyi-ui/src/utils/validate.js
rename to src/utils/validate.js
diff --git a/ruoyi-ui/src/views/components/icons/element-icons.js b/src/views/components/icons/element-icons.js
similarity index 100%
rename from ruoyi-ui/src/views/components/icons/element-icons.js
rename to src/views/components/icons/element-icons.js
diff --git a/ruoyi-ui/src/views/components/icons/index.vue b/src/views/components/icons/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/components/icons/index.vue
rename to src/views/components/icons/index.vue
diff --git a/ruoyi-ui/src/views/components/icons/svg-icons.js b/src/views/components/icons/svg-icons.js
similarity index 100%
rename from ruoyi-ui/src/views/components/icons/svg-icons.js
rename to src/views/components/icons/svg-icons.js
diff --git a/ruoyi-ui/src/views/dashboard/BarChart.vue b/src/views/dashboard/BarChart.vue
similarity index 100%
rename from ruoyi-ui/src/views/dashboard/BarChart.vue
rename to src/views/dashboard/BarChart.vue
diff --git a/ruoyi-ui/src/views/dashboard/LineChart.vue b/src/views/dashboard/LineChart.vue
similarity index 100%
rename from ruoyi-ui/src/views/dashboard/LineChart.vue
rename to src/views/dashboard/LineChart.vue
diff --git a/ruoyi-ui/src/views/dashboard/PanelGroup.vue b/src/views/dashboard/PanelGroup.vue
similarity index 100%
rename from ruoyi-ui/src/views/dashboard/PanelGroup.vue
rename to src/views/dashboard/PanelGroup.vue
diff --git a/ruoyi-ui/src/views/dashboard/PieChart.vue b/src/views/dashboard/PieChart.vue
similarity index 100%
rename from ruoyi-ui/src/views/dashboard/PieChart.vue
rename to src/views/dashboard/PieChart.vue
diff --git a/ruoyi-ui/src/views/dashboard/RaddarChart.vue b/src/views/dashboard/RaddarChart.vue
similarity index 100%
rename from ruoyi-ui/src/views/dashboard/RaddarChart.vue
rename to src/views/dashboard/RaddarChart.vue
diff --git a/ruoyi-ui/src/views/dashboard/mixins/resize.js b/src/views/dashboard/mixins/resize.js
similarity index 100%
rename from ruoyi-ui/src/views/dashboard/mixins/resize.js
rename to src/views/dashboard/mixins/resize.js
diff --git a/ruoyi-ui/src/views/error/401.vue b/src/views/error/401.vue
similarity index 100%
rename from ruoyi-ui/src/views/error/401.vue
rename to src/views/error/401.vue
diff --git a/ruoyi-ui/src/views/error/404.vue b/src/views/error/404.vue
similarity index 100%
rename from ruoyi-ui/src/views/error/404.vue
rename to src/views/error/404.vue
diff --git a/src/views/import/index.vue b/src/views/import/index.vue
new file mode 100644
index 0000000..2ff68b3
--- /dev/null
+++ b/src/views/import/index.vue
@@ -0,0 +1,55 @@
+<template>
+  <div>
+    <UploadExcel :deforeUpload="excelSuccess" :onSuccess="onSuccess" />
+  </div>
+</template>
+
+<script>
+//绛夊緟api鎺ュ彛
+// import { importEmployee } from "@/api/index";
+import employees from "@/constant/employees";
+import formatTime from "@/filters/index";
+const { importMapKeyPath } = employees;
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {
+    // 涓婁紶鍓嶈Е鍙�
+    excelSuccess({ name }) {
+      if (!name.endsWith(".xlsx")) {
+        return this.$message("璇烽�夋嫨xlsx鏂囦欢");
+      }
+      return true;
+    },
+    // 瑙f瀽鎴愬姛鍚庤Е鍙�
+    async onSuccess({ results, header }) {
+      const neWArr = results.map((item) => {
+        const obj = {};
+        for (let key in importMapKeyPath) {
+          if (key === "鍏ヨ亴鏃堕棿" || key === "杞鏃堕棿") {
+            // excel鏃堕棿鎴�
+            const timestamp = item[key];
+            // 杞牸寮忥紝骞跺姣旀晥楠屽樊鏃堕棿
+            const date = new Date((timestamp - 1) * 24 * 3600000);
+            date.setFullYear(data.setFullYear() - 70);
+            obj[importMapKeyPath[key]] = formatTime(date);
+          } else {
+            obj[importMapKeyPath[key]] = item[key];
+          }
+        }
+        return obj;
+      });
+      // await importEmployee(neWArr);
+      this.$message.success("瀵煎叆鎴愬姛");
+      this.$router.go(-1);
+      console.log(neWArr);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>
diff --git a/ruoyi-ui/src/views/index.vue b/src/views/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/index.vue
rename to src/views/index.vue
diff --git a/ruoyi-ui/src/views/index_v1.vue b/src/views/index_v1.vue
similarity index 100%
rename from ruoyi-ui/src/views/index_v1.vue
rename to src/views/index_v1.vue
diff --git a/src/views/knowledge/education/compilequer/index.vue b/src/views/knowledge/education/compilequer/index.vue
new file mode 100644
index 0000000..81ced24
--- /dev/null
+++ b/src/views/knowledge/education/compilequer/index.vue
@@ -0,0 +1,866 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div style="height: 200px">
+        <el-steps direction="vertical" :active="Editprogress">
+          <el-step title="鍩虹淇℃伅璁剧疆"></el-step>
+          <el-step title="瀹f暀鍐呭"></el-step>
+        </el-steps>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <!-- 鍩烘湰淇℃伅 -->
+      <div v-if="Editprogress == 1">
+        <div class="leftvlue-jbxx">
+          鍩烘湰淇℃伅<span>褰撳墠鐗堟湰:{{ currentVersion }}</span>
+        </div>
+        <el-form
+          :model="ruleForm"
+          :rules="rules"
+          ref="ruleForm"
+          label-width="100px"
+          class="demo-ruleForm"
+        >
+          <el-form-item label="瀹f暀鍚嶇О" prop="name">
+            <el-input v-model="ruleForm.name"></el-input>
+          </el-form-item>
+          <el-form-item label="瀹f暀褰㈠紡" prop="name">
+            <el-select v-model="ruleForm.shape" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in xjxsoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="瀹f暀鍒嗙被" prop="region">
+            <el-select
+              v-model="ruleForm.classify"
+              size="medium"
+              multiple
+              filterable
+              placeholder="璇烽�夋嫨鍒嗙被"
+            > 
+              <el-option
+                class="ruleFormaa"
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="閫傜敤鐤剧梾" prop="sickness">
+            <el-select
+              v-model="ruleForm.sickness"
+              filterable
+              placeholder="璇烽�夋嫨"
+            >
+              <el-option
+                v-for="item in sicknessoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="娲诲姩褰㈠紡" prop="desc">
+            <el-input
+              :rows="4"
+              type="textarea"
+              v-model="ruleForm.desc"
+              maxlength="400"
+              show-word-limit
+            ></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="success" @click="submitForm('ruleForm')"
+              >涓嬩竴姝�</el-button
+            >
+            <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <!-- 瀹f暀鍐呭 -->
+      <div v-if="Editprogress == 2">
+        <div class="leftvlue-jbxx">瀹f暀鍐呭</div>
+        <el-form
+          :model="ruleForm"
+          :rules="rules"
+          ref="ruleForm"
+          label-width="100px"
+          class="demo-ruleForm"
+        >
+          <el-form-item label="瀹f暀浠嬬粛" prop="desc">
+            <el-cascader
+              class="demo-cascader"
+              v-model="ruleForm.templatevalue"
+              :options="asoptions"
+              :props="{ expandTrigger: 'hover' }"
+            ></el-cascader>
+            <el-select v-model="ruleForm.data2" placeholder="鎻愪氦鎻愮ず">
+              <el-option
+                v-for="item in asoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+            <div style="display: flex; margin-top: 20px">
+              <div class="PreviewTemplate" @click="PreviewTemplate()">
+                棰勮妯$増
+              </div>
+              <el-button type="primary">纭寮曠敤</el-button>
+            </div>
+          </el-form-item>
+          <el-form-item label="娲诲姩褰㈠紡" prop="desc">
+            <el-input type="textarea" v-model="ruleForm.desc"></el-input>
+          </el-form-item>
+          <el-form-item label="娲诲姩褰㈠紡" prop="desc">
+            <el-input type="textarea" v-model="ruleForm.desc"></el-input>
+            <div class="addtopic">
+              <el-select
+                v-model="addvalue"
+                @change="changeaddtopic"
+                class="addtopic-input"
+              >
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="presentation">
+              <div class="presentation-left">
+                <el-table v-loading="loading" :data="userList">
+                  <el-table-column
+                    label="搴忓彿"
+                    align="center"
+                    key="userid"
+                    prop="userid"
+                  />
+                  <el-table-column
+                    label="棰樼洰"
+                    align="center"
+                    key="userName"
+                    prop="userName"
+                    :show-overflow-tooltip="true"
+                  />
+
+                  <el-table-column
+                    label="鎿嶄綔"
+                    align="center"
+                    width="300"
+                    class-name="small-padding fixed-width"
+                  >
+                    <template slot-scope="scope">
+                      <!-- <el-button
+                        size="medium"
+                        type="text"
+                        @click="goQRCode(scope.row)"
+                        v-hasPermi="['system:user:edit']"
+                      >
+                        <span class="button-text"
+                          ><i class="el-icon-edit"></i>浜岀淮鐮�</span
+                        ></el-button
+                      >
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="ViewQuestionnaire(scope.row)"
+                        v-hasPermi="['system:user:edit']"
+                        ><span class="button-textck"
+                          ><i class="el-icon-edit"></i>鏌ョ湅</span
+                        ></el-button
+                      > -->
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="handleUpdate(scope.row)"
+                        v-hasPermi="['system:user:edit']"
+                        ><span class="button-textxg"
+                          ><i class="el-icon-scissors"></i>淇敼</span
+                        ></el-button
+                      >
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="handleDelete(scope.row)"
+                        v-hasPermi="['system:user:remove']"
+                        ><span class="button-textsc"
+                          ><i class="el-icon-delete"></i>鍒犻櫎</span
+                        ></el-button
+                      >
+                    </template>
+                  </el-table-column>
+                </el-table>
+
+                <pagination
+                  v-show="total > 0"
+                  :total="total"
+                  :page.sync="queryParams.pageNum"
+                  :limit.sync="queryParams.pageSize"
+                  @pagination="getList"
+                />
+              </div>
+              <div class="presentation-right">
+                <div class="headline">棰樼洰璁剧疆璇︽儏</div>
+                <div>棰樼洰鏍囬锛�<span>杩欏鏈烘瀯鎬庝箞鏍�</span></div>
+                <div>鏄惁蹇呯瓟锛�<span>鏄�</span> 鏄惁闅愯棌锛�<span>鍚�</span></div>
+                <div class="headline">閫夐」璁剧疆</div>
+                <div>
+                  <p>閫夐」1:<span>鍖荤枟鏈烘瀯</span></p>
+                  <p>
+                    濉啓鏄庣粏锛�<span>鏃�</span> 寮傚父閫夐」锛�<span>鏃�</span>
+                    鍒嗗�硷細<span>3</span>
+                  </p>
+                  <p>閫変腑鎻愮ず锛�<span>杩欎釜棰樻湁鐐归毦璇锋敞鎰�</span></p>
+                  <p>閫変腑璺宠浆锛�<span>鏃�</span></p>
+                </div>
+              </div>
+            </div>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="success" @click="submitForm('ruleForm')"
+              >绔嬪嵆鍒涘缓</el-button
+            >
+            <el-button type="primary" @click="laststep()">涓婁竴姝�</el-button>
+            <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      sidecolumnrabs: "left", //鏂瑰悜
+      Editprogress: 1, //缂栬緫杩涘害
+      currentVersion: "1.2.3", //褰撳墠鐗堟湰
+      loading: false, // 閬僵灞�
+      drawer: false, //鎺у埗灞曞紑
+      radio: "false", //鍗曢�夐閫変腑
+      radios: [], //澶氶�夐閫変腑
+      radioas: "", //濉┖棰樼瓟妗�
+      // 鎬绘潯鏁�
+      total: 1,
+      ruleForm: {
+        name: "",
+        shape: "",
+        classify: "",
+        region: "",
+        date1: "",
+        date2: "",
+        delivery: false,
+        type: [],
+        resource: "",
+        desc: "",
+        templatevalue: "",
+        data2: "",
+      },
+      rules: {},
+      rulesa: {
+        name: [
+          { required: true, message: "璇疯緭鍏ユ椿鍔ㄥ悕绉�", trigger: "blur" },
+          { min: 3, max: 5, message: "闀垮害鍦� 3 鍒� 5 涓瓧绗�", trigger: "blur" },
+        ],
+        region: [
+          { required: true, message: "璇烽�夋嫨娲诲姩鍖哄煙", trigger: "change" },
+        ],
+        date1: [
+          {
+            type: "date",
+            required: true,
+            message: "璇烽�夋嫨鏃ユ湡",
+            trigger: "change",
+          },
+        ],
+        date2: [
+          {
+            type: "date",
+            required: true,
+            message: "璇烽�夋嫨鏃堕棿",
+            trigger: "change",
+          },
+        ],
+        type: [
+          {
+            type: "array",
+            required: true,
+            message: "璇疯嚦灏戦�夋嫨涓�涓椿鍔ㄦ�ц川",
+            trigger: "change",
+          },
+        ],
+        resource: [
+          { required: true, message: "璇烽�夋嫨娲诲姩璧勬簮", trigger: "change" },
+        ],
+        desc: [{ required: true, message: "璇峰~鍐欐椿鍔ㄥ舰寮�", trigger: "blur" }],
+      },
+      options: [
+        {
+          value: "閫夐」1",
+          label: "鐤剧梾瀹f暀",
+        },
+        {
+          value: "閫夐」2",
+          label: "鍏ラ櫌瀹f暀",
+        },
+        {
+          value: "閫夐」3",
+          label: "鎵嬫湳瀹f暀",
+        },
+        {
+          value: "閫夐」4",
+          label: "鎶ょ悊瀹f暀",
+        },
+      ],
+      xjxsoptions: [
+        {
+          value: "閫夐」1",
+          label: "鍥炬枃",
+        },
+        {
+          value: "閫夐」2",
+          label: "瑙嗛",
+        },
+        {
+          value: "閫夐」3",
+          label: "闊抽",
+        },
+      ],
+      sicknessoptions: [
+        {
+          value: 1,
+          label: "楂樿鍘�",
+        },
+        {
+          value: 2,
+          label: "蹇冭剰鐥�",
+        },
+        {
+          value: 3,
+          label: "绯栧翱鐥�",
+        },
+        {
+          value: 4,
+          label: "鑴婃鐐�",
+        },
+      ],
+      asoptions: [
+        {
+          value: "zhinan",
+          label: "鎸囧崡",
+          children: [
+            {
+              value: "shejiyuanze",
+              label: "璁捐鍘熷垯",
+              children: [
+                {
+                  value: "yizhi",
+                  label: "涓�鑷�",
+                },
+                {
+                  value: "fankui",
+                  label: "鍙嶉",
+                },
+                {
+                  value: "xiaolv",
+                  label: "鏁堢巼",
+                },
+                {
+                  value: "kekong",
+                  label: "鍙帶",
+                },
+              ],
+            },
+            {
+              value: "daohang",
+              label: "瀵艰埅",
+              children: [
+                {
+                  value: "cexiangdaohang",
+                  label: "渚у悜瀵艰埅",
+                },
+                {
+                  value: "dingbudaohang",
+                  label: "椤堕儴瀵艰埅",
+                },
+              ],
+            },
+          ],
+        },
+        {
+          value: "zujian",
+          label: "缁勪欢",
+          children: [
+            {
+              value: "basic",
+              label: "Basic",
+              children: [
+                {
+                  value: "layout",
+                  label: "Layout 甯冨眬",
+                },
+                {
+                  value: "color",
+                  label: "Color 鑹插僵",
+                },
+                {
+                  value: "typography",
+                  label: "Typography 瀛椾綋",
+                },
+                {
+                  value: "icon",
+                  label: "Icon 鍥炬爣",
+                },
+                {
+                  value: "button",
+                  label: "Button 鎸夐挳",
+                },
+              ],
+            },
+            {
+              value: "form",
+              label: "Form",
+              children: [
+                {
+                  value: "radio",
+                  label: "Radio 鍗曢�夋",
+                },
+                {
+                  value: "checkbox",
+                  label: "Checkbox 澶氶�夋",
+                },
+                {
+                  value: "input",
+                  label: "Input 杈撳叆妗�",
+                },
+                {
+                  value: "input-number",
+                  label: "InputNumber 璁℃暟鍣�",
+                },
+                {
+                  value: "select",
+                  label: "Select 閫夋嫨鍣�",
+                },
+                {
+                  value: "cascader",
+                  label: "Cascader 绾ц仈閫夋嫨鍣�",
+                },
+                {
+                  value: "switch",
+                  label: "Switch 寮�鍏�",
+                },
+                {
+                  value: "slider",
+                  label: "Slider 婊戝潡",
+                },
+                {
+                  value: "time-picker",
+                  label: "TimePicker 鏃堕棿閫夋嫨鍣�",
+                },
+                {
+                  value: "date-picker",
+                  label: "DatePicker 鏃ユ湡閫夋嫨鍣�",
+                },
+                {
+                  value: "datetime-picker",
+                  label: "DateTimePicker 鏃ユ湡鏃堕棿閫夋嫨鍣�",
+                },
+                {
+                  value: "upload",
+                  label: "Upload 涓婁紶",
+                },
+                {
+                  value: "rate",
+                  label: "Rate 璇勫垎",
+                },
+                {
+                  value: "form",
+                  label: "Form 琛ㄥ崟",
+                },
+              ],
+            },
+            {
+              value: "data",
+              label: "Data",
+              children: [
+                {
+                  value: "table",
+                  label: "Table 琛ㄦ牸",
+                },
+                {
+                  value: "tag",
+                  label: "Tag 鏍囩",
+                },
+                {
+                  value: "progress",
+                  label: "Progress 杩涘害鏉�",
+                },
+                {
+                  value: "tree",
+                  label: "Tree 鏍戝舰鎺т欢",
+                },
+                {
+                  value: "pagination",
+                  label: "Pagination 鍒嗛〉",
+                },
+                {
+                  value: "badge",
+                  label: "Badge 鏍囪",
+                },
+              ],
+            },
+            {
+              value: "notice",
+              label: "Notice",
+              children: [
+                {
+                  value: "alert",
+                  label: "Alert 璀﹀憡",
+                },
+                {
+                  value: "loading",
+                  label: "Loading 鍔犺浇",
+                },
+                {
+                  value: "message",
+                  label: "Message 娑堟伅鎻愮ず",
+                },
+                {
+                  value: "message-box",
+                  label: "MessageBox 寮规",
+                },
+                {
+                  value: "notification",
+                  label: "Notification 閫氱煡",
+                },
+              ],
+            },
+            {
+              value: "navigation",
+              label: "Navigation",
+              children: [
+                {
+                  value: "menu",
+                  label: "NavMenu 瀵艰埅鑿滃崟",
+                },
+                {
+                  value: "tabs",
+                  label: "Tabs 鏍囩椤�",
+                },
+                {
+                  value: "breadcrumb",
+                  label: "Breadcrumb 闈㈠寘灞�",
+                },
+                {
+                  value: "dropdown",
+                  label: "Dropdown 涓嬫媺鑿滃崟",
+                },
+                {
+                  value: "steps",
+                  label: "Steps 姝ラ鏉�",
+                },
+              ],
+            },
+            {
+              value: "others",
+              label: "Others",
+              children: [
+                {
+                  value: "dialog",
+                  label: "Dialog 瀵硅瘽妗�",
+                },
+                {
+                  value: "tooltip",
+                  label: "Tooltip 鏂囧瓧鎻愮ず",
+                },
+                {
+                  value: "popover",
+                  label: "Popover 寮瑰嚭妗�",
+                },
+                {
+                  value: "card",
+                  label: "Card 鍗$墖",
+                },
+                {
+                  value: "carousel",
+                  label: "Carousel 璧伴┈鐏�",
+                },
+                {
+                  value: "collapse",
+                  label: "Collapse 鎶樺彔闈㈡澘",
+                },
+              ],
+            },
+          ],
+        },
+        {
+          value: "ziyuan",
+          label: "璧勬簮",
+          children: [
+            {
+              value: "axure",
+              label: "Axure Components",
+            },
+            {
+              value: "sketch",
+              label: "Sketch Templates",
+            },
+            {
+              value: "jiaohu",
+              label: "缁勪欢浜や簰鏂囨。",
+            },
+          ],
+        },
+      ],
+      valssu: [
+        {
+          idd: 1,
+          wssd: "浣犳渶杩戞�庝箞鏍�",
+          sdadd: ["sss", "ssccss", "ssaas", "ss"],
+        },
+      ],
+      addvalue: "娣诲姞棰樼洰",
+      // 棰樼洰琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userid: "1",
+          userName: "涓�鍙峰鏁�",
+        },
+        {
+          userid: "2",
+          userName: "浜屽彿瀹f暀",
+        },
+        {
+          userid: "3",
+          userName: "涓夊彿瀹f暀",
+        },
+        {
+          userid: "4",
+          userName: "鍥涘彿瀹f暀",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        IDnumber: undefined,
+      },
+    };
+  },
+
+  created() {},
+
+  methods: {
+    submitForm(formName) {
+      if (this.Editprogress <= 3) {
+        return this.Editprogress++;
+      }
+      this.rules = this.rulesa;
+      //   鎻愪氦
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          alert("submit!");
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    /** 鏌ヨ棰樼洰鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        // this.userList = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+        console.log(this.userList);
+      });
+      //   const { rows } = await listUser();
+      //   console.log(rows);
+      //   this.list = rows;
+    },
+    changeaddtopic(val) {
+      console.log(11);
+      console.log(val);
+      this.addvalue = "娣诲姞棰樼洰";
+    },
+    // 棰勮妯$増
+    PreviewTemplate() {
+      this.drawer = true;
+    },
+    laststep() {
+      this.Editprogress--;
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  //   margin-top: 20px;
+  margin: 20px;
+  margin-bottom: 0;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+  .leftvlue-jbxx {
+    margin-bottom: 50px;
+    font-size: 20px;
+    span {
+      position: absolute;
+      right: 80px;
+    }
+  }
+  .demo-cascader {
+    margin-right: 20px;
+  }
+  .PreviewTemplate {
+    color: #02a7f0;
+    cursor: pointer;
+    font-size: 20px;
+    margin: 0 20px;
+  }
+}
+.preview-left {
+  margin: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.addtopic {
+  margin-top: 30px;
+}
+.presentation {
+  margin: 20px 0;
+  display: flex;
+  .presentation-left {
+    width: 50%;
+    height: 500px;
+    .button-textxg {
+      color: #024df0;
+    }
+    .button-textsc {
+      color: #f52727;
+    }
+  }
+  .presentation-right {
+    width: 50%;
+    height: 500px;
+    padding: 20px;
+    font-size: 18px;
+    border: 1px solid #909091;
+    span {
+      padding: 0 35px;
+      margin-right: 10px;
+      border-bottom: 1px solid #909091;
+    }
+    .headline {
+      font-size: 20px;
+      border-left: 3px solid #41a1be;
+      padding-left: 5px;
+      margin: 15px 0;
+    }
+  }
+}
+::v-deep .addtopic-input {
+  input {
+    background: #02a7f0;
+    color: #edf1f7;
+    width: 150px;
+  }
+}
+::v-deep.el-step.is-vertical .el-step__title {
+  font-size: 25px;
+}
+::v-deep.el-input--medium {
+  font-size: 24px !important;
+}
+::v-deep.ruleFormaa.el-select {
+  display: inline-block;
+  position: relative;
+  width: 700px;
+}
+.el-select__tags {
+  font-size: 20px;
+  max-width: 888px !important;
+}
+::v-deep.el-radio__inner {
+  width: 22px;
+  height: 22px;
+}
+// ::v-deep.topic-dev.el-radio__label {
+//   font-size: 24px;
+// }
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+// ::v-deep.el-form-item--medium .el-form-item__content {
+//   line-height: 36px;
+//   display: flex;
+// }
+</style>
diff --git a/src/views/knowledge/education/examine/index.vue b/src/views/knowledge/education/examine/index.vue
new file mode 100644
index 0000000..4813531
--- /dev/null
+++ b/src/views/knowledge/education/examine/index.vue
@@ -0,0 +1,304 @@
+<template>
+  <div class="examineemanagement">
+    <!-- 宸︿晶鏍� -->
+
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">鍘嗗彶鐗堟湰</div>
+        <!-- <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div> -->
+      </div>
+      <div class="bottom-fl">
+        <el-tabs tab-position="right" v-model="activeName">
+          <el-tab-pane
+            class="tab-paness"
+            :key="index"
+            v-for="(item, index) in editableTabs"
+          >
+            <div class="mulsz" slot="label">
+              {{ item.versionsac
+              }}<span style="margin-left: 30px">{{
+                item.startUsing ? "鍚敤" : "绂佺敤"
+              }}</span>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+
+    <div class="leftvlue">
+      <div v-if="activeName == '0'">
+        <div class="examine-top">
+          <span>缂栬緫浜猴細{{ basicInformation.name }}</span>
+          <span>缂栬緫鏃堕棿锛歿{ basicInformation.day }}</span>
+          <span class="ewmyl">浜岀淮鐮侀瑙�</span>
+        </div>
+        <!-- 鍩虹淇℃伅 -->
+        <div class="examine-jic">
+          <div class="headline">鍩虹淇℃伅</div>
+          <div class="jic-value">
+            <div>
+              瀹f暀鍚嶇О锛歿{ basicInformation.wname
+              }}<span>閫傜敤鐤剧梾锛歿{ basicInformation.jbname }}</span>
+            </div>
+            <div>
+              瀹f暀褰㈠紡锛歿{ basicInformation.wname
+              }}<span>閫傜敤鍒嗙被锛歿{ basicInformation.jbname }}</span>
+            </div>
+            <div>琛ㄥ崟鎻忚堪锛歿{ basicInformation.miaosname }}</div>
+          </div>
+        </div>
+        <!-- 瀹f暀棰勮 -->
+        <div class="examine-jic">
+          <div class="headline">瀹f暀鍐呭</div>
+          <div class="jic-value">
+            <div>
+              瀹f暀浠嬬粛锛�<span class="wenjuanjs"
+                >闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ</span
+              >
+            </div>
+          </div>
+          <div class="preview-left">
+            <!-- 鍗曢�� -->
+            <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+              <div class="dev-text">
+                {{ item.idd }}銆乕鍗曢�塢&nbsp&nbsp<span>{{ item.wssd }}</span>
+              </div>
+              <div class="dev-xx">
+                <el-radio-group v-model="radio">
+                  <el-radio
+                    v-for="(items, index) in item.sdadd"
+                    :key="index"
+                    :label="index"
+                    >{{ items }}</el-radio
+                  >
+                </el-radio-group>
+              </div>
+            </div>
+            <!-- 澶氶�� -->
+            <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+              <div class="dev-text">
+                {{ item.idd }}銆乕澶氶�塢&nbsp&nbsp<span>{{ item.wssd }}</span>
+              </div>
+              <div class="dev-xx">
+                <el-checkbox-group v-model="radios">
+                  <el-checkbox
+                    v-for="(items, index) in item.sdadd"
+                    :key="index"
+                    :label="index"
+                  >
+                    {{ items }}
+                  </el-checkbox>
+                </el-checkbox-group>
+              </div>
+            </div>
+            <!-- 濉┖ -->
+            <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+              <div class="dev-text">
+                {{ item.idd }}銆乕濉┖]&nbsp&nbsp<span>{{ item.wssd }}</span>
+              </div>
+              <div class="dev-xx">
+                <el-input placeholder="璇疯緭鍏ョ瓟妗�" v-model="radioas" clearable>
+                </el-input>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div v-else-if="activeName == '1'">bbb</div>
+      <div v-else-if="activeName == '2'">ccc</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      activeName: "0",
+      radios: [], //澶氶�夐閫変腑
+
+      basicInformation: {
+        name: "鑰佸惔",
+        day: "2023骞�12鏈�11鏃�16鏃�12鍒�11绉�",
+        wname: "澶уぇ澶�",
+        jbname: "灏忓皬灏�",
+        miaosname: "闈炲父濂藉ぇ澶уぇ",
+      },
+      valssu: [
+        {
+          idd: 1,
+          wssd: "浣犳渶杩戞�庝箞鏍�",
+          sdadd: ["sss", "ssccss", "ssaas", "ss"],
+        },
+      ],
+      editableTabs: [
+        {
+          versionsac: "1.0.3",
+          startUsing: true,
+        },
+        {
+          versionsac: "1.0.2",
+          startUsing: false,
+        },
+        {
+          versionsac: "1.0.1",
+          startUsing: false,
+        },
+      ],
+    };
+  },
+
+  created() {},
+
+  methods: {
+    handleClick() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.examineemanagement {
+  display: flex;
+  .sidecolumn {
+    width: 300px;
+    min-height: 100vh;
+    text-align: center;
+    //   display: flex;
+    margin-top: 20px;
+    margin: 20px;
+    padding: 30px;
+    background: #edf1f7;
+    border: 1px solid #dcdfe6;
+    -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+      0 0 6px 0 rgba(0, 0, 0, 0.04);
+    .sidecolumn-top {
+      display: flex;
+      justify-content: space-between;
+      .top-wj {
+        font-size: 20px;
+      }
+      .top-tj {
+        font-size: 18px;
+
+        color: rgb(0, 89, 255);
+        cursor: pointer;
+      }
+    }
+    .center-ss {
+      margin-top: 30px;
+      .input-with-select {
+        height: 40px !important;
+      }
+    }
+    .bottom-fl {
+      margin-top: 30px;
+      display: center !important;
+    }
+  }
+  .leftvlue {
+    width: 80%;
+    margin-top: 20px;
+    //   margin: 20px;
+    padding: 30px;
+    background: #ffff;
+    border: 1px solid #dcdfe6;
+    -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+      0 0 6px 0 rgba(0, 0, 0, 0.04);
+    .mulsz {
+      font-size: 20px;
+      span {
+        margin-left: 30px;
+      }
+    }
+    .examine-top {
+      font-size: 20px;
+      margin-bottom: 40px;
+      span {
+        margin-right: 30px;
+      }
+      .ewmyl {
+        color: rgb(0, 81, 255);
+        cursor: pointer;
+      }
+    }
+    .examine-jic {
+      .headline {
+        font-size: 28px;
+        border-left: 8px solid #42b983;
+        padding-left: 5px;
+        margin-bottom: 15px;
+      }
+      .jic-value {
+        font-size: 20px;
+        border-top: 1px solid #a7abac;
+        padding: 20px;
+        div {
+          margin-bottom: 15px;
+          span {
+            margin-left: 180px;
+          }
+        }
+        .wenjuanjs {
+          margin-left: 15px;
+          padding-bottom: 5px;
+          border-bottom: 1px solid #a7abac;
+        }
+      }
+      .preview-left {
+        margin: 20px;
+        //   margin: 20px;
+        padding: 30px;
+        background: #ffff;
+        border: 1px solid #dcdfe6;
+        -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+          0 0 6px 0 rgba(0, 0, 0, 0.04);
+        .topic-dev {
+          margin-bottom: 25px;
+          font-size: 20px !important;
+          .dev-text {
+            margin-bottom: 10px;
+          }
+        }
+      }
+    }
+    .examine-jieg {
+      .headline {
+        font-size: 28px;
+        padding-left: 5px;
+        border-left: 8px solid #41a1be;
+        // border-bottom: 1px solid #41a1be;
+        margin-bottom: 15px;
+      }
+    }
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  font-size: 20px;
+}
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/knowledge/education/index.vue b/src/views/knowledge/education/index.vue
new file mode 100644
index 0000000..c837000
--- /dev/null
+++ b/src/views/knowledge/education/index.vue
@@ -0,0 +1,816 @@
+<template>
+  <div class="educationmanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">瀹f暀绫诲瀷</div>
+        <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞绫诲埆</div>
+      </div>
+      <div class="center-ss">
+        <el-input
+          placeholder="璇疯緭鍏ュ唴瀹�"
+          v-model="sidecolumnval"
+          class="input-with-select"
+          size="medium "
+        >
+          <el-button
+            @click="sidecolumnss"
+            slot="append"
+            icon="el-icon-search"
+          ></el-button>
+        </el-input>
+      </div>
+      <div class="bottom-fl">
+        <el-tabs tab-position="right">
+          <el-tab-pane :label="`鍏ㄩ儴 (${numberlb})`"></el-tab-pane>
+          <el-tab-pane
+            class="tab-paness"
+            :key="item.name"
+            v-for="(item, index) in editableTabs"
+            :label="item.title + ' (' + item.number + ')'"
+          ></el-tab-pane>
+
+          <el-tab-pane :label="`鏈垎缁�(${numberlbs})`"></el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">鏈湴瀹f暀搴� </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">鍏变韩瀹f暀搴� </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鐢ㄦ埛鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="瀹f暀鍚嶇О" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="閫傜敤鐤剧梾" prop="sickness">
+                <el-cascader
+                  v-model="queryParams.sickness"
+                  :options="optionss"
+                  :props="propss"
+                  clearable
+                ></el-cascader>
+              </el-form-item>
+              <el-form-item label="瀹f暀褰㈠紡" prop="shape">
+                <el-select
+                  v-model="queryParams.shapevalue"
+                  placeholder="璇烽�夋嫨"
+                >
+                  <el-option
+                    v-for="item in xjxsoptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="瀹f暀鍒嗙被" prop="classify">
+                <el-select
+                  v-model="queryParams.classifyvalue"
+                  placeholder="璇烽�夋嫨"
+                >
+                  <el-option
+                    v-for="(item, index) in editableTabs"
+                    :key="index++"
+                    :label="item.title"
+                    :value="index++"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @click="resetQuery"
+                  >閲嶇疆</el-button
+                >
+              </el-form-item>
+            </el-form>
+
+            <el-row :gutter="10" class="mb8">
+              <el-col :span="1.5">
+                <el-button
+                  type="primary"
+                  plain
+                  icon="el-icon-plus"
+                  size="medium"
+                  @click="handleAdd"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
+              </el-col>
+
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
+              </el-col>
+
+              <!-- <el-col :span="1.5"> </el-col> -->
+            </el-row>
+            <!-- <right-toolbar
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
+          :columns="columns"
+        ></right-toolbar> -->
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                label="搴忓彿"
+                align="center"
+                key="userid"
+                prop="userid"
+              />
+              <el-table-column
+                label="瀹f暀鍚嶇О"
+                align="center"
+                key="userName"
+                prop="userName"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="鐗堟湰"
+                align="center"
+                key="nickName"
+                prop="nickName"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="閫傜敤鐤剧梾"
+                align="center"
+                key="aphonenumber"
+                prop="aphonenumber"
+                width="120"
+              /><el-table-column
+                label="瀹f暀鎻忚堪"
+                align="center"
+                key="bphonenumber"
+                prop="bphonenumber"
+                width="120"
+              />
+              <el-table-column
+                label="鏈�杩戠紪杈�"
+                align="center"
+                key="cphonenumber"
+                prop="cphonenumber"
+                width="120"
+              />
+
+              <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="300"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="goQRCode(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                  >
+                    <span class="button-text"
+                      ><i class="el-icon-edit"></i>浜岀淮鐮�</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="Vieweducation(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textck"
+                      ><i class="el-icon-edit"></i>鏌ョ湅</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textxg"
+                      ><i class="el-icon-edit"></i>淇敼</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                    ><span class="button-textsc"
+                      ><i class="el-icon-edit"></i>鍒犻櫎</span
+                    ></el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <pagination
+              v-show="total > 0"
+              :total="total"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getList"
+            />
+          </el-col>
+        </el-row>
+
+        <!-- 娣诲姞鎴栦慨鏀瑰鏁欓厤缃璇濇 -->
+        <el-dialog
+          :title="title"
+          :visible.sync="open"
+          width="900px"
+          append-to-body
+        >
+          <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="濮撳悕" prop="nickName">
+                  <el-input
+                    v-model="form.nickName"
+                    placeholder="璇疯緭鍏ュ鍚�"
+                    maxlength="30"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鎬у埆" prop="deptId">
+                  <el-select v-model="form.sex" placeholder="璇烽�夋嫨鎬у埆">
+                    <el-option
+                      v-for="dict in dict.type.sys_user_sex"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="璇佷欢绫诲瀷" prop="phonenumber">
+                  <el-input
+                    v-model="form.phonenumber"
+                    placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
+                    maxlength="11"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="璇佷欢鍙�" prop="email">
+                  <el-input
+                    v-model="form.email"
+                    placeholder="璇疯緭鍏ヨ瘉浠跺彿"
+                    maxlength="50"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鏈汉鎵嬫満鍙�" prop="userName">
+                  <el-input
+                    v-model="form.userName"
+                    placeholder="璇疯緭鍏ユ墜鏈哄彿"
+                    maxlength="30"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="浜插睘鎵嬫満鍙�" prop="password">
+                  <el-input
+                    v-model="form.password"
+                    placeholder="璇疯緭鍏ヤ翰灞炴墜鏈哄彿"
+                    type="password"
+                    maxlength="20"
+                    show-password
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鎮h�呮爣绛�">
+                  <el-cascader
+                    :options="optionss"
+                    :props="propss"
+                    clearable
+                  ></el-cascader>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="澶囨敞">
+                  <el-input
+                    v-model="form.remark"
+                    type="textarea"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+          </div>
+        </el-dialog>
+      </div>
+    </div>
+    <!-- 娣诲姞绫诲埆寮规 -->
+    <el-dialog width="30%" :visible.sync="dialogFormVisible">
+      <el-form :model="sidecolumnform">
+        <el-form-item label="璇疯緭鍏ョ被鍒悕绉�">
+          <el-input v-model="form.name" autocomplete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 浜岀淮鐮佸睍绀哄脊妗� -->
+    <el-dialog width="30%" :visible.sync="goQRCodeVisible">
+      <div class="qrcode-dialo">
+        <div class="qrcode-text">
+          {{ nameeducation }}<span>{{ haoeducation }}</span>
+        </div>
+        <div class="qrcode-img"></div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+} from "@/api/system/user";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "education",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      nameeducation: "",
+      haoeducation: "",
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userid: 1,
+          userName: "涓夊彿瀹f暀",
+          nickName: "1.2.4",
+
+          aphonenumber: "鍏宠妭鐐庣棁",
+          bphonenumber: "寰堟",
+          cphonenumber: "2022-12-12",
+        },
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      numberlb: 22,
+      numberlbs: 2,
+      sidecolumnform: {}, //娣诲姞绫诲埆琛ㄥ崟
+      dialogFormVisible: false, //娣诲姞绫诲埆寮规
+      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      xjxsoptions: [
+        {
+          value: 1,
+          label: "瑙嗛",
+        },
+        {
+          value: 2,
+          label: "璁插骇",
+        },
+        {
+          value: 3,
+          label: "璇煶",
+        },
+      ],
+      //绫诲埆鍒楄〃
+      editableTabs: [
+        {
+          title: "瀹f暀鍒嗙被涓�",
+          number: "1",
+        },
+        {
+          title: "瀹f暀鍒嗙被浜�",
+          number: "2",
+        },
+        {
+          title: "瀹f暀鍒嗙被涓�",
+          number: "2",
+        },
+        {
+          title: "瀹f暀鍒嗙被鍥�",
+          number: "2",
+        },
+        {
+          title: "瀹f暀鍒嗙被浜�",
+          number: "2",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        sickness: "",
+        classifyvalue: "",
+        shapevalue: "",
+        userName: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+        { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+        { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+  },
+
+  methods: {
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        // this.userList = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+        console.log(this.userList);
+      });
+      //   const { rows } = await listUser();
+      //   console.log(rows);
+      //   this.list = rows;
+    },
+    // 娣诲姞绫诲埆
+    submitsidecolumn() {
+      this.dialogFormVisible = false;
+    },
+    //鎼滅储绫诲埆
+    sidecolumnss() {},
+    // 鍒囨崲鍏变韩/鏈湴
+    tophandleClick() {},
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    goQRCode(row) {
+      this.goQRCodeVisible = true;
+      this.nameeducation = row.userName;
+      this.haoeducation = row.nickName;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.$router.push({
+        path: "/knowledge/education/compilequer/",
+      });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.$router.push({
+        path: "/knowledge/education/compilequer/",
+        query: { id: "1" },
+      });
+    },
+    // 鏌ョ湅瀹f暀
+    Vieweducation() {
+      this.$router.push({
+        path: "/knowledge/education/examine/",
+        query: { id: "1" },
+      });
+    },
+
+    /** 鏇存柊/淇敼鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.educationmanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .sidecolumn-top {
+    display: flex;
+    justify-content: space-between;
+    .top-wj {
+      font-size: 20px;
+    }
+    .top-tj {
+      font-size: 18px;
+
+      color: rgb(0, 89, 255);
+      cursor: pointer;
+    }
+  }
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+.qrcode-dialo {
+  text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .qrcode-text {
+    font-size: 20px;
+    span {
+      margin-left: 20px;
+    }
+  }
+  .qrcode-img {
+    width: 300px;
+    height: 400px;
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  font-size: 20px;
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textck {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/src/views/knowledge/questionbank/index.vue b/src/views/knowledge/questionbank/index.vue
new file mode 100644
index 0000000..c16345f
--- /dev/null
+++ b/src/views/knowledge/questionbank/index.vue
@@ -0,0 +1,987 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-col :span="24" :xs="24">
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+          label-width="98px"
+        >
+          <el-form-item label="棰樼洰鍚嶇О" prop="userName">
+            <el-input
+              v-model="queryParams.userName"
+              placeholder="璇疯緭鍏�"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="韬唤璇佸彿鐮�" prop="IDnumber">
+            <el-input
+              v-model="queryParams.IDnumber"
+              placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"
+              clearable
+              style="width: 250px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="鑱旂郴鏂瑰紡" prop="phonenumber">
+            <el-input
+              v-model="queryParams.phonenumber"
+              placeholder="璇疯緭鍏ヨ仈绯绘柟寮�"
+              clearable
+              style="width: 280px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-row>
+            <el-form-item label="鎮h�呮爣绛�" prop="status">
+              <el-cascader
+                v-model="queryParams.status"
+                :options="optionss"
+                :props="propss"
+                clearable
+              ></el-cascader>
+            </el-form-item>
+          </el-row>
+
+          <!-- <el-form-item label="鍒涘缓鏃堕棿">
+              <el-date-picker
+                v-model="dateRange"
+                style="width: 240px"
+                value-format="yyyy-MM-dd"
+                type="daterange"
+                range-separator="-"
+                start-placeholder="寮�濮嬫棩鏈�"
+                end-placeholder="缁撴潫鏃ユ湡"
+              ></el-date-picker>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="el-icon-search" size="medium" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="medium" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item> -->
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+          <el-col :span="19">
+            <div class="documentf">
+              <div class="document">
+                <el-button
+                  type="info"
+                  plain
+                  icon="el-icon-upload2"
+                  size="medium"
+                  @click="handleImport"
+                  v-hasPermi="['system:user:import']"
+                  >瀵煎叆</el-button
+                >
+              </div>
+              <div class="document">
+                <el-button
+                  type="warning"
+                  plain
+                  icon="el-icon-download"
+                  size="medium"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+                  >瀵煎嚭</el-button
+                >
+              </div>
+            </div>
+          </el-col>
+          <!-- <el-col :span="1.5"> </el-col> -->
+        </el-row>
+        <!-- <right-toolbar
+            :showSearch.sync="showSearch"
+            @queryTable="getList"
+            :columns="columns"
+          ></right-toolbar> -->
+        <el-table
+          v-loading="loading"
+          :data="userList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column
+            label="搴忓彿"
+            align="center"
+            key="userId"
+            prop="userId"
+            v-if="columns[0].visible"
+          />
+          <el-table-column
+            label="濮撳悕"
+            align="center"
+            key="userName"
+            prop="userName"
+            v-if="columns[1].visible"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎬у埆"
+            align="center"
+            key="nickName"
+            prop="nickName"
+            v-if="columns[2].visible"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎮h�呮爣绛�"
+            align="center"
+            key="deptName"
+            prop="dept.deptName"
+            v-if="columns[3].visible"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="璇佷欢绫诲瀷"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            v-if="columns[4].visible"
+            width="120"
+          /><el-table-column
+            label="璇佷欢鍙风爜"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            v-if="columns[4].visible"
+            width="120"
+          />
+          <el-table-column
+            label="骞撮緞"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            v-if="columns[4].visible"
+            width="120"
+          />
+          <!-- <el-table-column
+              label="鐘舵��"
+              align="center"
+              key="status"
+              v-if="columns[5].visible"
+            >
+              <template slot-scope="scope">
+                <el-switch
+                  v-model="scope.row.status"
+                  active-value="0"
+                  inactive-value="1"
+                  @change="handleStatusChange(scope.row)"
+                ></el-switch>
+              </template>
+            </el-table-column> -->
+
+          <el-table-column
+            label="鑱旂郴鏂瑰紡"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            v-if="columns[4].visible"
+            width="120"
+          />
+          <el-table-column
+            label="寤烘。鏃ユ湡"
+            align="center"
+            prop="createTime"
+            v-if="columns[6].visible"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鏇存柊鏃ユ湡"
+            align="center"
+            prop="createTime"
+            v-if="columns[6].visible"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鎿嶄綔"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope" v-if="scope.row.userId !== 1">
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-edit"
+                @click="$router.push('/patient/patient/profile/')"
+                v-hasPermi="['system:user:edit']"
+                >鏌ョ湅</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+    <!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="濮撳悕" prop="nickName">
+              <el-input
+                v-model="form.nickName"
+                placeholder="璇疯緭鍏ュ鍚�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎬у埆" prop="deptId">
+              <el-select v-model="form.sex" placeholder="璇烽�夋嫨鎬у埆">
+                <el-option
+                  v-for="dict in dict.type.sys_user_sex"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="璇佷欢绫诲瀷" prop="phonenumber">
+              <el-input
+                v-model="form.phonenumber"
+                placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
+                maxlength="11"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇佷欢鍙�" prop="email">
+              <el-input
+                v-model="form.email"
+                placeholder="璇疯緭鍏ヨ瘉浠跺彿"
+                maxlength="50"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鏈汉鎵嬫満鍙�" prop="userName">
+              <el-input
+                v-model="form.userName"
+                placeholder="璇疯緭鍏ユ墜鏈哄彿"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浜插睘鎵嬫満鍙�" prop="password">
+              <el-input
+                v-model="form.password"
+                placeholder="璇疯緭鍏ヤ翰灞炴墜鏈哄彿"
+                type="password"
+                maxlength="20"
+                show-password
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎮h�呮爣绛�">
+              <!-- <el-select v-model="form.sex" placeholder="璇烽�夋嫨"> -->
+              <el-cascader
+                :options="optionss"
+                :props="propss"
+                clearable
+              ></el-cascader>
+              <!-- </el-select> -->
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="12">
+              <el-form-item label="鐘舵��">
+                <el-radio-group v-model="form.status">
+                  <el-radio
+                    v-for="dict in dict.type.sys_normal_disable"
+                    :key="dict.value"
+                    :label="dict.value"
+                    >{{ dict.label }}</el-radio
+                  >
+                </el-radio-group>
+              </el-form-item>
+            </el-col> -->
+        </el-row>
+        <!-- <el-row>
+            <el-col :span="12">
+              <el-form-item label="宀椾綅">
+                <el-select
+                  v-model="form.postIds"
+                  multiple
+                  placeholder="璇烽�夋嫨宀椾綅"
+                >
+                  <el-option
+                    v-for="item in postOptions"
+                    :key="item.postId"
+                    :label="item.postName"
+                    :value="item.postId"
+                    :disabled="item.status == 1"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="瑙掕壊">
+                <el-select
+                  v-model="form.roleIds"
+                  multiple
+                  placeholder="璇烽�夋嫨瑙掕壊"
+                >
+                  <el-option
+                    v-for="item in roleOptions"
+                    :key="item.roleId"
+                    :label="item.roleName"
+                    :value="item.roleId"
+                    :disabled="item.status == 1"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row> -->
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞">
+              <el-input
+                v-model="form.remark"
+                type="textarea"
+                placeholder="璇疯緭鍏ュ唴瀹�"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
+    <el-dialog
+      :title="upload.title"
+      :visible.sync="upload.open"
+      width="70%"
+      append-to-body
+    >
+      <el-steps :active="dractive" simple>
+        <el-step title="涓婁紶瀵煎叆鏂囦欢" icon="el-icon-upload"></el-step>
+        <el-step title="瀵煎叆妫�鏌�" icon="el-icon-picture"></el-step>
+        <el-step title="瀵煎叆缁撴灉" icon="el-icon-picture"></el-step>
+      </el-steps>
+      <!-- 涓婁紶瀵煎叆鏂囦欢 -->
+      <div class="download" v-if="dractive == 1">
+        <el-upload
+          class="upload-demo"
+          ref="upload"
+          :limit="1"
+          accept=".xlsx, .xls"
+          :headers="upload.headers"
+          :action="upload.url + '?updateSupport=' + upload.updateSupport"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+          <div class="el-upload__tip text-center" slot="tip">
+            <div class="el-upload__tip" slot="tip">
+              <el-checkbox v-model="upload.updateSupport" />
+              鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+            </div>
+            <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+            <el-link
+              type="primary"
+              :underline="false"
+              style="font-size: 24px; vertical-align: baseline"
+              @click="importTemplate"
+              >涓嬭浇妯℃澘</el-link
+            >
+          </div>
+        </el-upload>
+      </div>
+      <!-- 瀵煎叆妫�鏌� -->
+      <div class="uploading" v-else-if="dractive == 2">
+        <el-table :data="uploadingData" style="width: 100%">
+          <el-table-column prop="serial" label="搴忓彿"> </el-table-column>
+          <el-table-column prop="name" label="濮撳悕"> </el-table-column>
+          <el-table-column prop="sex" label="鎬у埆"> </el-table-column>
+          <el-table-column prop="certificate" label="璇佷欢绫诲瀷">
+          </el-table-column>
+          <el-table-column prop="certificatenum" label="璇佷欢鍙风爜">
+          </el-table-column>
+          <el-table-column prop="goday" label="鍑虹敓鏃ユ湡"> </el-table-column>
+          <el-table-column prop="menum" label="鏈汉鑱旂郴鏂瑰紡"> </el-table-column>
+          <el-table-column prop="younum" label="浜插睘鑱旂郴鏂瑰紡">
+          </el-table-column>
+          <el-table-column prop="tag" label="鎮h�呮爣绛�"> </el-table-column>
+          <el-table-column prop="erry" label="閿欒鍘熷洜"> </el-table-column>
+        </el-table>
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="geterryList"
+        />
+      </div>
+      <!-- 瀹屾垚 -->
+      <div class="drexamine" v-else-if="dractive == 3">
+        <img
+          src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
+        />
+        <p>瀵煎叆鎮h�呮垚鍔燂紒</p>
+        <p>鏈鍏辫瀵煎叆{{ ImportQuantity }}浣嶆偅鑰�</p>
+      </div>
+
+      <div slot="footer" class="dialog-footer" v-if="dractive == 3">
+        <!-- <el-button type="primary" @click="submitFileForm">涓嬩竴姝�</el-button> -->
+        <el-button @click="submitclose">瀹屾垚</el-button>
+      </div>
+      <div slot="footer" v-else>
+        <el-button type="primary" @click="submitFileForm">涓嬩竴姝�</el-button>
+        <el-button @click="submitclose">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+  deptTreeSelect,
+} from "@/api/system/user";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 閮ㄩ棬鏍戦�夐」
+      deptOptions: undefined,
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      //瀵煎叆杩涘害
+      dractive: 1,
+      // 瀵煎叆灞曠ず琛ㄥ崟
+      uploadingData: {},
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵煎叆鎮h�呮暟閲�
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        jobName: undefined,
+        jobGroup: undefined,
+        status: undefined,
+      },
+      propss: { multiple: true },
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      // 鐢ㄦ埛瀵煎叆鍙傛暟
+      upload: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/system/user/importData",
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        IDnumber: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+        { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+        { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {
+    // 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+  created() {
+    this.getList();
+    this.getDeptTree();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  methods: {
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.queryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ヨ瀵煎叆灞曠ず鍒楄〃
+    geterryList() {
+      this.loading = true;
+      listJob(this.queryParams).then((response) => {
+        this.jobList = 1;
+        this.total = 1;
+        this.loading = false;
+      });
+    },
+    /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
+    getDeptTree() {
+      deptTreeSelect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 绛涢�夎妭鐐�
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 鑺傜偣鍗曞嚮浜嬩欢
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.handleQuery();
+    },
+    // 鐢ㄦ埛鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    // 鏇村鎿嶄綔瑙﹀彂
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleResetPwd":
+          this.handleResetPwd(row);
+          break;
+        case "handleAuthRole":
+          this.handleAuthRole(row);
+          break;
+        default:
+          break;
+      }
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      getUser().then((response) => {
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.open = true;
+        this.title = "鏂板鎮h��";
+        this.form.password = this.initPassword;
+      });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.open = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+    /** 鍒嗛厤瑙掕壊鎿嶄綔 */
+    handleAuthRole: function (row) {
+      const userId = row.userId;
+      this.$router.push("/system/user-auth/role/" + userId);
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.queryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      this.upload.title = "鐢ㄦ埛瀵煎叆";
+      this.upload.open = true;
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      this.download(
+        "system/user/importTemplate",
+        {},
+        `user_template_${new Date().getTime()}.xlsx`
+      );
+    },
+    // 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(
+        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+          response.msg +
+          "</div>",
+        "瀵煎叆缁撴灉",
+        { dangerouslyUseHTMLString: true }
+      );
+      this.getList();
+    },
+    // 鎻愪氦涓婁紶鏂囦欢
+    submitFileForm() {
+      // 涓婁紶
+      if (this.dractive == 1) {
+        this.$refs.upload.submit();
+        this.dractive++;
+      } else {
+        this.dractive++;
+      }
+    },
+    submitclose() {
+      this.upload.open = false;
+      this.dractive = 1;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.download {
+  text-align: center;
+  .el-upload__tip {
+    font-size: 23px;
+  }
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+</style>
diff --git a/src/views/knowledge/questionnaire/compilequer/index.vue b/src/views/knowledge/questionnaire/compilequer/index.vue
new file mode 100644
index 0000000..d5bc5ff
--- /dev/null
+++ b/src/views/knowledge/questionnaire/compilequer/index.vue
@@ -0,0 +1,1006 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div style="height: 400px">
+        <el-steps direction="vertical" :active="Editprogress">
+          <el-step title="鍩虹淇℃伅璁剧疆"></el-step>
+          <el-step title="闂嵎璁剧疆"></el-step>
+          <el-step
+            title="闂嵎棰勮"
+            description="杩欐槸涓�娈靛緢闀垮緢闀垮緢闀跨殑鎻忚堪鎬ф枃瀛�"
+          ></el-step>
+          <el-step
+            title="缁撴灉鍙嶉"
+            description="杩欐槸涓�娈靛緢闀垮緢闀垮緢闀跨殑鎻忚堪鎬ф枃瀛�"
+          ></el-step>
+        </el-steps>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <!-- 鍩烘湰淇℃伅 -->
+      <div v-if="Editprogress == 1">
+        <div class="leftvlue-jbxx">
+          鍩烘湰淇℃伅<span>褰撳墠鐗堟湰:{{ currentVersion }}</span>
+        </div>
+        <el-form
+          :model="ruleForm"
+          :rules="rules"
+          ref="ruleForm"
+          label-width="100px"
+          class="demo-ruleForm"
+        >
+          <el-form-item label="娲诲姩鍚嶇О" prop="name">
+            <el-input v-model="ruleForm.name"></el-input>
+          </el-form-item>
+          <el-form-item label="娲诲姩鍖哄煙" prop="region">
+            <el-select
+              v-model="ruleForm.region"
+              size="medium"
+              multiple
+              filterable
+              placeholder="璇烽�夋嫨娲诲姩鍖哄煙"
+            >
+              <el-option
+                class="ruleFormaa"
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="娲诲姩褰㈠紡" prop="desc">
+            <el-input
+              :rows="4"
+              type="textarea"
+              v-model="ruleForm.desc"
+            ></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="success" @click="submitForm('ruleForm')"
+              >涓嬩竴姝�</el-button
+            >
+            <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <!-- 闂嵎璁剧疆 -->
+      <div v-if="Editprogress == 2">
+        <div class="leftvlue-jbxx">闂嵎璁剧疆</div>
+        <el-form
+          :model="ruleForm"
+          :rules="rules"
+          ref="ruleForm"
+          label-width="100px"
+          class="demo-ruleForm"
+        >
+          <el-form-item label="闂嵎浠嬬粛" prop="desc">
+            <el-cascader
+              class="demo-cascader"
+              v-model="ruleForm.templatevalue"
+              :options="options"
+              :props="{ expandTrigger: 'hover' }"
+            ></el-cascader>
+            <el-select v-model="ruleForm.data2" placeholder="鎻愪氦鎻愮ず">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+            <div style="display: flex; margin-top: 20px">
+              <div class="PreviewTemplate" @click="PreviewTemplate()">
+                棰勮妯$増
+              </div>
+              <el-button type="primary">纭寮曠敤</el-button>
+            </div>
+          </el-form-item>
+          <el-form-item label="娲诲姩褰㈠紡" prop="desc">
+            <el-input type="textarea" v-model="ruleForm.desc"></el-input>
+          </el-form-item>
+          <el-form-item label="娲诲姩褰㈠紡" prop="desc">
+            <el-input type="textarea" v-model="ruleForm.desc"></el-input>
+            <div class="addtopic">
+              <el-select
+                v-model="addvalue"
+                @change="changeaddtopic"
+                class="addtopic-input"
+              >
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="presentation">
+              <div class="presentation-left">
+                <el-table v-loading="loading" :data="userList">
+                  <el-table-column
+                    label="搴忓彿"
+                    align="center"
+                    key="userid"
+                    prop="userid"
+                  />
+                  <el-table-column
+                    label="棰樼洰"
+                    align="center"
+                    key="userName"
+                    prop="userName"
+                    :show-overflow-tooltip="true"
+                  />
+
+                  <el-table-column
+                    label="鎿嶄綔"
+                    align="center"
+                    width="300"
+                    class-name="small-padding fixed-width"
+                  >
+                    <template slot-scope="scope">
+                      <!-- <el-button
+                        size="medium"
+                        type="text"
+                        @click="goQRCode(scope.row)"
+                        v-hasPermi="['system:user:edit']"
+                      >
+                        <span class="button-text"
+                          ><i class="el-icon-edit"></i>浜岀淮鐮�</span
+                        ></el-button
+                      >
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="ViewQuestionnaire(scope.row)"
+                        v-hasPermi="['system:user:edit']"
+                        ><span class="button-textck"
+                          ><i class="el-icon-edit"></i>鏌ョ湅</span
+                        ></el-button
+                      > -->
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="handleUpdate(scope.row)"
+                        v-hasPermi="['system:user:edit']"
+                        ><span class="button-textxg"
+                          ><i class="el-icon-scissors"></i>淇敼</span
+                        ></el-button
+                      >
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="handleDelete(scope.row)"
+                        v-hasPermi="['system:user:remove']"
+                        ><span class="button-textsc"
+                          ><i class="el-icon-delete"></i>鍒犻櫎</span
+                        ></el-button
+                      >
+                    </template>
+                  </el-table-column>
+                </el-table>
+
+                <pagination
+                  v-show="total > 0"
+                  :total="total"
+                  :page.sync="queryParams.pageNum"
+                  :limit.sync="queryParams.pageSize"
+                  @pagination="getList"
+                />
+              </div>
+              <div class="presentation-right">
+                <div class="headline">棰樼洰璁剧疆璇︽儏</div>
+                <div>棰樼洰鏍囬锛�<span>杩欏鏈烘瀯鎬庝箞鏍�</span></div>
+                <div>鏄惁蹇呯瓟锛�<span>鏄�</span> 鏄惁闅愯棌锛�<span>鍚�</span></div>
+                <div class="headline">閫夐」璁剧疆</div>
+                <div>
+                  <p>閫夐」1:<span>鍖荤枟鏈烘瀯</span></p>
+                  <p>
+                    濉啓鏄庣粏锛�<span>鏃�</span> 寮傚父閫夐」锛�<span>鏃�</span>
+                    鍒嗗�硷細<span>3</span>
+                  </p>
+                  <p>閫変腑鎻愮ず锛�<span>杩欎釜棰樻湁鐐归毦璇锋敞鎰�</span></p>
+                  <p>閫変腑璺宠浆锛�<span>鏃�</span></p>
+                </div>
+              </div>
+            </div>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="success" @click="submitForm('ruleForm')"
+              >涓嬩竴姝�</el-button
+            >
+            <el-button type="primary" @click="laststep()">涓婁竴姝�</el-button>
+            <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <!-- 闂嵎棰勮 -->
+      <div v-if="Editprogress == 3">
+        <div class="preview-left">
+          <!-- 鍗曢�� -->
+          <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+            <div class="dev-text">
+              {{ item.idd }}銆乕鍗曢�塢<span>{{ item.wssd }}</span>
+            </div>
+            <div class="dev-xx">
+              <el-radio-group v-model="radio">
+                <el-radio
+                  v-for="(items, index) in item.sdadd"
+                  :key="index"
+                  :label="index"
+                  >{{ items }}</el-radio
+                >
+              </el-radio-group>
+            </div>
+          </div>
+          <!-- 澶氶�� -->
+          <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+            <div class="dev-text">
+              {{ item.idd }}銆乕澶氶�塢<span>{{ item.wssd }}</span>
+            </div>
+            <div class="dev-xx">
+              <el-checkbox-group v-model="radios">
+                <el-checkbox
+                  v-for="(items, index) in item.sdadd"
+                  :key="index"
+                  :label="index"
+                >
+                  {{ items }}
+                </el-checkbox>
+              </el-checkbox-group>
+            </div>
+          </div>
+          <!-- 濉┖ -->
+          <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+            <div class="dev-text">
+              {{ item.idd }}銆乕濉┖]<span>{{ item.wssd }}</span>
+            </div>
+            <div class="dev-xx">
+              <el-input placeholder="璇疯緭鍏ョ瓟妗�" v-model="radioas" clearable>
+              </el-input>
+            </div>
+          </div>
+        </div>
+        <el-button type="success" @click="submitForm('ruleForm')"
+          >涓嬩竴姝�</el-button
+        >
+        <el-button type="primary" @click="laststep()">涓婁竴姝�</el-button>
+        <!-- <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button> -->
+      </div>
+      <!-- 缁撴灉鍙嶉 -->
+      <div v-if="Editprogress == 4">
+        <el-form
+          :model="ruleForm"
+          :rules="rules"
+          ref="ruleForm"
+          label-width="100px"
+          class="demo-ruleForm"
+        >
+          <el-form-item label="娲诲姩鍚嶇О" prop="name">
+            <el-input v-model="ruleForm.name"></el-input>
+          </el-form-item>
+          <el-form-item label="娲诲姩鍖哄煙" prop="region">
+            <el-select v-model="ruleForm.region" placeholder="璇烽�夋嫨娲诲姩鍖哄煙">
+              <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+              <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="娲诲姩鏃堕棿" required>
+            <el-col :span="11">
+              <el-form-item prop="date1">
+                <el-date-picker
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  v-model="ruleForm.date1"
+                  style="width: 100%"
+                ></el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col class="line" :span="2">-</el-col>
+            <el-col :span="11">
+              <el-form-item prop="date2">
+                <el-time-picker
+                  placeholder="閫夋嫨鏃堕棿"
+                  v-model="ruleForm.date2"
+                  style="width: 100%"
+                ></el-time-picker>
+              </el-form-item>
+            </el-col>
+          </el-form-item>
+          <el-form-item label="鍗虫椂閰嶉��" prop="delivery">
+            <el-switch v-model="ruleForm.delivery"></el-switch>
+          </el-form-item>
+          <el-form-item label="娲诲姩鎬ц川" prop="type">
+            <el-checkbox-group v-model="ruleForm.type">
+              <el-checkbox label="缇庨/椁愬巺绾夸笂娲诲姩" name="type"></el-checkbox>
+              <el-checkbox label="鍦版帹娲诲姩" name="type"></el-checkbox>
+              <el-checkbox label="绾夸笅涓婚娲诲姩" name="type"></el-checkbox>
+              <el-checkbox label="鍗曠函鍝佺墝鏇濆厜" name="type"></el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+          <el-form-item label="鐗规畩璧勬簮" prop="resource">
+            <el-radio-group v-model="ruleForm.resource">
+              <el-radio label="绾夸笂鍝佺墝鍟嗚禐鍔�"></el-radio>
+              <el-radio label="绾夸笅鍦哄湴鍏嶈垂"></el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="娲诲姩褰㈠紡" prop="desc">
+            <el-input type="textarea" v-model="ruleForm.desc"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="success" @click="submitForm('ruleForm')"
+              >绔嬪嵆鍒涘缓</el-button
+            >
+            <el-button type="primary" @click="laststep()">涓婁竴姝�</el-button>
+            <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+    <!-- 棰勮妯$増寮圭獥 -->
+    <el-drawer
+      title="闂嵎棰勮"
+      :visible.sync="drawer"
+      custom-class="demo-drawer"
+      width="50%"
+    >
+      <div class="preview-left">
+        <!-- 鍗曢�� -->
+        <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+          <div class="dev-text">
+            {{ item.idd }}銆乕鍗曢�塢&nbsp&nbsp<span>{{ item.wssd }}</span>
+          </div>
+          <div class="dev-xx">
+            <el-radio-group v-model="radio">
+              <el-radio
+                v-for="(items, index) in item.sdadd"
+                :key="index"
+                :label="index"
+                >{{ items }}</el-radio
+              >
+            </el-radio-group>
+          </div>
+        </div>
+        <!-- 澶氶�� -->
+        <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+          <div class="dev-text">
+            {{ item.idd }}銆乕澶氶�塢&nbsp&nbsp<span>{{ item.wssd }}</span>
+          </div>
+          <div class="dev-xx">
+            <el-checkbox-group v-model="radios">
+              <el-checkbox
+                v-for="(items, index) in item.sdadd"
+                :key="index"
+                :label="index"
+              >
+                {{ items }}
+              </el-checkbox>
+            </el-checkbox-group>
+          </div>
+        </div>
+        <!-- 濉┖ -->
+        <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+          <div class="dev-text">
+            {{ item.idd }}銆乕濉┖]&nbsp&nbsp<span>{{ item.wssd }}</span>
+          </div>
+          <div class="dev-xx">
+            <el-input placeholder="璇疯緭鍏ョ瓟妗�" v-model="radioas" clearable>
+            </el-input>
+          </div>
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      sidecolumnrabs: "left", //鏂瑰悜
+      Editprogress: 2, //缂栬緫杩涘害
+      currentVersion: "1.2.3", //褰撳墠鐗堟湰
+      loading: false, // 閬僵灞�
+      drawer: false, //鎺у埗灞曞紑
+      radio: "false", //鍗曢�夐閫変腑
+      radios: [], //澶氶�夐閫変腑
+      radioas: "", //濉┖棰樼瓟妗�
+      // 鎬绘潯鏁�
+      total: 1,
+      ruleForm: {
+        name: "",
+        region: "",
+        date1: "",
+        date2: "",
+        delivery: false,
+        type: [],
+        resource: "",
+        desc: "",
+        templatevalue: "",
+        data2: "",
+      },
+      rules: {},
+      rulesa: {
+        name: [
+          { required: true, message: "璇疯緭鍏ユ椿鍔ㄥ悕绉�", trigger: "blur" },
+          { min: 3, max: 5, message: "闀垮害鍦� 3 鍒� 5 涓瓧绗�", trigger: "blur" },
+        ],
+        region: [
+          { required: true, message: "璇烽�夋嫨娲诲姩鍖哄煙", trigger: "change" },
+        ],
+        date1: [
+          {
+            type: "date",
+            required: true,
+            message: "璇烽�夋嫨鏃ユ湡",
+            trigger: "change",
+          },
+        ],
+        date2: [
+          {
+            type: "date",
+            required: true,
+            message: "璇烽�夋嫨鏃堕棿",
+            trigger: "change",
+          },
+        ],
+        type: [
+          {
+            type: "array",
+            required: true,
+            message: "璇疯嚦灏戦�夋嫨涓�涓椿鍔ㄦ�ц川",
+            trigger: "change",
+          },
+        ],
+        resource: [
+          { required: true, message: "璇烽�夋嫨娲诲姩璧勬簮", trigger: "change" },
+        ],
+        desc: [{ required: true, message: "璇峰~鍐欐椿鍔ㄥ舰寮�", trigger: "blur" }],
+      },
+      options: [
+        {
+          value: "閫夐」1",
+          label: "榛勯噾绯�",
+        },
+        {
+          value: "閫夐」2",
+          label: "鍙岀毊濂�",
+        },
+        {
+          value: "閫夐」3",
+          label: "铓典粩鐓�",
+        },
+        {
+          value: "閫夐」4",
+          label: "榫欓』闈�",
+        },
+        {
+          value: "閫夐」5",
+          label: "鍖椾含鐑ら腑",
+        },
+      ],
+      options: [
+        {
+          value: "zhinan",
+          label: "鎸囧崡",
+          children: [
+            {
+              value: "shejiyuanze",
+              label: "璁捐鍘熷垯",
+              children: [
+                {
+                  value: "yizhi",
+                  label: "涓�鑷�",
+                },
+                {
+                  value: "fankui",
+                  label: "鍙嶉",
+                },
+                {
+                  value: "xiaolv",
+                  label: "鏁堢巼",
+                },
+                {
+                  value: "kekong",
+                  label: "鍙帶",
+                },
+              ],
+            },
+            {
+              value: "daohang",
+              label: "瀵艰埅",
+              children: [
+                {
+                  value: "cexiangdaohang",
+                  label: "渚у悜瀵艰埅",
+                },
+                {
+                  value: "dingbudaohang",
+                  label: "椤堕儴瀵艰埅",
+                },
+              ],
+            },
+          ],
+        },
+        {
+          value: "zujian",
+          label: "缁勪欢",
+          children: [
+            {
+              value: "basic",
+              label: "Basic",
+              children: [
+                {
+                  value: "layout",
+                  label: "Layout 甯冨眬",
+                },
+                {
+                  value: "color",
+                  label: "Color 鑹插僵",
+                },
+                {
+                  value: "typography",
+                  label: "Typography 瀛椾綋",
+                },
+                {
+                  value: "icon",
+                  label: "Icon 鍥炬爣",
+                },
+                {
+                  value: "button",
+                  label: "Button 鎸夐挳",
+                },
+              ],
+            },
+            {
+              value: "form",
+              label: "Form",
+              children: [
+                {
+                  value: "radio",
+                  label: "Radio 鍗曢�夋",
+                },
+                {
+                  value: "checkbox",
+                  label: "Checkbox 澶氶�夋",
+                },
+                {
+                  value: "input",
+                  label: "Input 杈撳叆妗�",
+                },
+                {
+                  value: "input-number",
+                  label: "InputNumber 璁℃暟鍣�",
+                },
+                {
+                  value: "select",
+                  label: "Select 閫夋嫨鍣�",
+                },
+                {
+                  value: "cascader",
+                  label: "Cascader 绾ц仈閫夋嫨鍣�",
+                },
+                {
+                  value: "switch",
+                  label: "Switch 寮�鍏�",
+                },
+                {
+                  value: "slider",
+                  label: "Slider 婊戝潡",
+                },
+                {
+                  value: "time-picker",
+                  label: "TimePicker 鏃堕棿閫夋嫨鍣�",
+                },
+                {
+                  value: "date-picker",
+                  label: "DatePicker 鏃ユ湡閫夋嫨鍣�",
+                },
+                {
+                  value: "datetime-picker",
+                  label: "DateTimePicker 鏃ユ湡鏃堕棿閫夋嫨鍣�",
+                },
+                {
+                  value: "upload",
+                  label: "Upload 涓婁紶",
+                },
+                {
+                  value: "rate",
+                  label: "Rate 璇勫垎",
+                },
+                {
+                  value: "form",
+                  label: "Form 琛ㄥ崟",
+                },
+              ],
+            },
+            {
+              value: "data",
+              label: "Data",
+              children: [
+                {
+                  value: "table",
+                  label: "Table 琛ㄦ牸",
+                },
+                {
+                  value: "tag",
+                  label: "Tag 鏍囩",
+                },
+                {
+                  value: "progress",
+                  label: "Progress 杩涘害鏉�",
+                },
+                {
+                  value: "tree",
+                  label: "Tree 鏍戝舰鎺т欢",
+                },
+                {
+                  value: "pagination",
+                  label: "Pagination 鍒嗛〉",
+                },
+                {
+                  value: "badge",
+                  label: "Badge 鏍囪",
+                },
+              ],
+            },
+            {
+              value: "notice",
+              label: "Notice",
+              children: [
+                {
+                  value: "alert",
+                  label: "Alert 璀﹀憡",
+                },
+                {
+                  value: "loading",
+                  label: "Loading 鍔犺浇",
+                },
+                {
+                  value: "message",
+                  label: "Message 娑堟伅鎻愮ず",
+                },
+                {
+                  value: "message-box",
+                  label: "MessageBox 寮规",
+                },
+                {
+                  value: "notification",
+                  label: "Notification 閫氱煡",
+                },
+              ],
+            },
+            {
+              value: "navigation",
+              label: "Navigation",
+              children: [
+                {
+                  value: "menu",
+                  label: "NavMenu 瀵艰埅鑿滃崟",
+                },
+                {
+                  value: "tabs",
+                  label: "Tabs 鏍囩椤�",
+                },
+                {
+                  value: "breadcrumb",
+                  label: "Breadcrumb 闈㈠寘灞�",
+                },
+                {
+                  value: "dropdown",
+                  label: "Dropdown 涓嬫媺鑿滃崟",
+                },
+                {
+                  value: "steps",
+                  label: "Steps 姝ラ鏉�",
+                },
+              ],
+            },
+            {
+              value: "others",
+              label: "Others",
+              children: [
+                {
+                  value: "dialog",
+                  label: "Dialog 瀵硅瘽妗�",
+                },
+                {
+                  value: "tooltip",
+                  label: "Tooltip 鏂囧瓧鎻愮ず",
+                },
+                {
+                  value: "popover",
+                  label: "Popover 寮瑰嚭妗�",
+                },
+                {
+                  value: "card",
+                  label: "Card 鍗$墖",
+                },
+                {
+                  value: "carousel",
+                  label: "Carousel 璧伴┈鐏�",
+                },
+                {
+                  value: "collapse",
+                  label: "Collapse 鎶樺彔闈㈡澘",
+                },
+              ],
+            },
+          ],
+        },
+        {
+          value: "ziyuan",
+          label: "璧勬簮",
+          children: [
+            {
+              value: "axure",
+              label: "Axure Components",
+            },
+            {
+              value: "sketch",
+              label: "Sketch Templates",
+            },
+            {
+              value: "jiaohu",
+              label: "缁勪欢浜や簰鏂囨。",
+            },
+          ],
+        },
+      ],
+      valssu: [
+        {
+          idd: 1,
+          wssd: "浣犳渶杩戞�庝箞鏍�",
+          sdadd: ["sss", "ssccss", "ssaas", "ss"],
+        },
+      ],
+      options: [
+        {
+          value: "閫夐」1",
+          label: "鍗曢��",
+        },
+        {
+          value: "閫夐」2",
+          label: "澶氶��",
+          disabled: true,
+        },
+        {
+          value: "閫夐」3",
+          label: "濉┖",
+        },
+      ],
+      addvalue: "娣诲姞棰樼洰",
+      // 棰樼洰琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userid: "1",
+          userName: "涓�鍙烽棶鍗�",
+        },
+        {
+          userid: "2",
+          userName: "浜屽彿闂嵎",
+        },
+        {
+          userid: "3",
+          userName: "涓夊彿闂嵎",
+        },
+        {
+          userid: "4",
+          userName: "鍥涘彿闂嵎",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        IDnumber: undefined,
+      },
+    };
+  },
+
+  created() {},
+
+  methods: {
+    submitForm(formName) {
+      if (this.Editprogress <= 3) {
+        return this.Editprogress++;
+      }
+      this.rules = this.rulesa;
+      //   鎻愪氦
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          alert("submit!");
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    /** 鏌ヨ棰樼洰鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        // this.userList = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+        console.log(this.userList);
+      });
+      //   const { rows } = await listUser();
+      //   console.log(rows);
+      //   this.list = rows;
+    },
+    changeaddtopic(val) {
+      console.log(11);
+      console.log(val);
+      this.addvalue = "娣诲姞棰樼洰";
+    },
+    // 棰勮妯$増
+    PreviewTemplate() {
+      this.drawer = true;
+    },
+    laststep() {
+      this.Editprogress--;
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  //   margin-top: 20px;
+  margin: 20px;
+  margin-bottom: 0;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+  .leftvlue-jbxx {
+    margin-bottom: 50px;
+    font-size: 20px;
+    span {
+      position: absolute;
+      right: 80px;
+    }
+  }
+  .demo-cascader {
+    margin-right: 20px;
+  }
+  .PreviewTemplate {
+    color: #02a7f0;
+    cursor: pointer;
+    font-size: 20px;
+    margin: 0 20px;
+  }
+}
+.preview-left {
+  margin: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.addtopic {
+  margin-top: 30px;
+}
+.presentation {
+  margin: 20px 0;
+  display: flex;
+  .presentation-left {
+    width: 50%;
+    height: 500px;
+    .button-textxg {
+      color: #024df0;
+    }
+    .button-textsc {
+      color: #f52727;
+    }
+  }
+  .presentation-right {
+    width: 50%;
+    height: 500px;
+    padding: 20px;
+    font-size: 18px;
+    border: 1px solid #909091;
+    span {
+      padding: 0 35px;
+      margin-right: 10px;
+      border-bottom: 1px solid #909091;
+    }
+    .headline {
+      font-size: 20px;
+      border-left: 3px solid #41a1be;
+      padding-left: 5px;
+      margin: 15px 0;
+    }
+  }
+}
+::v-deep .addtopic-input {
+  input {
+    background: #02a7f0;
+    color: #edf1f7;
+    width: 150px;
+  }
+}
+::v-deep.el-step.is-vertical .el-step__title {
+  font-size: 25px;
+}
+::v-deep.el-input--medium {
+  font-size: 24px !important;
+}
+::v-deep.ruleFormaa.el-select {
+  display: inline-block;
+  position: relative;
+  width: 700px;
+}
+.el-select__tags {
+  font-size: 20px;
+  max-width: 888px !important;
+}
+::v-deep.el-radio__inner {
+  width: 22px;
+  height: 22px;
+}
+// ::v-deep.topic-dev.el-radio__label {
+//   font-size: 24px;
+// }
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+// ::v-deep.el-form-item--medium .el-form-item__content {
+//   line-height: 36px;
+//   display: flex;
+// }
+</style>
diff --git a/src/views/knowledge/questionnaire/examine/index.vue b/src/views/knowledge/questionnaire/examine/index.vue
new file mode 100644
index 0000000..4c840fc
--- /dev/null
+++ b/src/views/knowledge/questionnaire/examine/index.vue
@@ -0,0 +1,310 @@
+<template>
+  <div class="examineemanagement">
+    <!-- 宸︿晶鏍� -->
+
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">鍘嗗彶鐗堟湰</div>
+        <!-- <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div> -->
+      </div>
+      <div class="bottom-fl">
+        <el-tabs tab-position="right" v-model="activeName">
+          <el-tab-pane
+            class="tab-paness"
+            :key="index"
+            v-for="(item, index) in editableTabs"
+          >
+            <div class="mulsz" slot="label">
+              {{ item.versionsac
+              }}<span style="margin-left: 30px">{{
+                item.startUsing ? "鍚敤" : "绂佺敤"
+              }}</span>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+
+    <div class="leftvlue">
+      <div v-if="activeName == '0'">
+        <div class="examine-top">
+          <span>缂栬緫浜猴細{{ basicInformation.name }}</span>
+          <span>缂栬緫鏃堕棿锛歿{ basicInformation.day }}</span>
+          <span class="ewmyl">浜岀淮鐮侀瑙�</span>
+        </div>
+        <!-- 鍩虹淇℃伅 -->
+        <div class="examine-jic">
+          <div class="headline">鍩虹淇℃伅</div>
+          <div class="jic-value">
+            <div>
+              闂嵎鍚嶇О锛歿{ basicInformation.wname
+              }}<span>閫傜敤鐤剧梾锛歿{ basicInformation.jbname }}</span>
+            </div>
+            <div>琛ㄥ崟鎻忚堪锛歿{ basicInformation.miaosname }}</div>
+          </div>
+        </div>
+        <!-- 闂嵎棰勮 -->
+        <div class="examine-jic">
+          <div class="headline">闂嵎棰勮</div>
+          <div class="jic-value">
+            <div>
+              闂嵎浠嬬粛锛�<span class="wenjuanjs"
+                >闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ</span
+              >
+            </div>
+            <div>
+              闂嵎浠嬬粛锛�<span class="wenjuanjs"
+                >闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ闈炲父濂介潪甯稿ソ</span
+              >
+            </div>
+          </div>
+          <div class="preview-left">
+            <!-- 鍗曢�� -->
+            <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+              <div class="dev-text">
+                {{ item.idd }}銆乕鍗曢�塢&nbsp&nbsp<span>{{ item.wssd }}</span>
+              </div>
+              <div class="dev-xx">
+                <el-radio-group v-model="radio">
+                  <el-radio
+                    v-for="(items, index) in item.sdadd"
+                    :key="index"
+                    :label="index"
+                    >{{ items }}</el-radio
+                  >
+                </el-radio-group>
+              </div>
+            </div>
+            <!-- 澶氶�� -->
+            <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+              <div class="dev-text">
+                {{ item.idd }}銆乕澶氶�塢&nbsp&nbsp<span>{{ item.wssd }}</span>
+              </div>
+              <div class="dev-xx">
+                <el-checkbox-group v-model="radios">
+                  <el-checkbox
+                    v-for="(items, index) in item.sdadd"
+                    :key="index"
+                    :label="index"
+                  >
+                    {{ items }}
+                  </el-checkbox>
+                </el-checkbox-group>
+              </div>
+            </div>
+            <!-- 濉┖ -->
+            <div class="topic-dev" v-for="item in valssu" :key="item.aaa">
+              <div class="dev-text">
+                {{ item.idd }}銆乕濉┖]&nbsp&nbsp<span>{{ item.wssd }}</span>
+              </div>
+              <div class="dev-xx">
+                <el-input placeholder="璇疯緭鍏ョ瓟妗�" v-model="radioas" clearable>
+                </el-input>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="examine-jieg">
+          <div class="headline">缁撴灉鍙嶉</div>
+          <div></div>
+          <div></div>
+        </div>
+      </div>
+      <div v-else-if="activeName == '1'">bbb</div>
+      <div v-else-if="activeName == '2'">ccc</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      activeName: "0",
+      radios: [], //澶氶�夐閫変腑
+
+      basicInformation: {
+        name: "鑰佸惔",
+        day: "2023骞�12鏈�11鏃�16鏃�12鍒�11绉�",
+        wname: "澶уぇ澶�",
+        jbname: "灏忓皬灏�",
+        miaosname: "闈炲父濂藉ぇ澶уぇ",
+      },
+      valssu: [
+        {
+          idd: 1,
+          wssd: "浣犳渶杩戞�庝箞鏍�",
+          sdadd: ["sss", "ssccss", "ssaas", "ss"],
+        },
+      ],
+      editableTabs: [
+        {
+          versionsac: "1.0.3",
+          startUsing: true,
+        },
+        {
+          versionsac: "1.0.2",
+          startUsing: false,
+        },
+        {
+          versionsac: "1.0.1",
+          startUsing: false,
+        },
+      ],
+    };
+  },
+
+  created() {},
+
+  methods: {
+    handleClick() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.examineemanagement {
+  display: flex;
+  .sidecolumn {
+    width: 300px;
+    min-height: 100vh;
+    text-align: center;
+    //   display: flex;
+    margin-top: 20px;
+    margin: 20px;
+    padding: 30px;
+    background: #edf1f7;
+    border: 1px solid #dcdfe6;
+    -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+      0 0 6px 0 rgba(0, 0, 0, 0.04);
+    .sidecolumn-top {
+      display: flex;
+      justify-content: space-between;
+      .top-wj {
+        font-size: 20px;
+      }
+      .top-tj {
+        font-size: 18px;
+
+        color: rgb(0, 89, 255);
+        cursor: pointer;
+      }
+    }
+    .center-ss {
+      margin-top: 30px;
+      .input-with-select {
+        height: 40px !important;
+      }
+    }
+    .bottom-fl {
+      margin-top: 30px;
+      display: center !important;
+    }
+  }
+  .leftvlue {
+    width: 80%;
+    margin-top: 20px;
+    //   margin: 20px;
+    padding: 30px;
+    background: #ffff;
+    border: 1px solid #dcdfe6;
+    -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+      0 0 6px 0 rgba(0, 0, 0, 0.04);
+    .mulsz {
+      font-size: 20px;
+      span {
+        margin-left: 30px;
+      }
+    }
+    .examine-top {
+      font-size: 20px;
+      margin-bottom: 40px;
+      span {
+        margin-right: 30px;
+      }
+      .ewmyl {
+        color: rgb(0, 81, 255);
+        cursor: pointer;
+      }
+    }
+    .examine-jic {
+      .headline {
+        font-size: 28px;
+        border-left: 8px solid #41a1be;
+        padding-left: 5px;
+        margin-bottom: 15px;
+      }
+      .jic-value {
+        font-size: 20px;
+        border-top: 1px solid #a7abac;
+        padding: 20px;
+        div {
+          margin-bottom: 15px;
+          span {
+            margin-left: 180px;
+          }
+        }
+        .wenjuanjs {
+          margin-left: 15px;
+          padding-bottom: 5px;
+          border-bottom: 1px solid #a7abac;
+        }
+      }
+      .preview-left {
+        margin: 20px;
+        //   margin: 20px;
+        padding: 30px;
+        background: #ffff;
+        border: 1px solid #dcdfe6;
+        -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+          0 0 6px 0 rgba(0, 0, 0, 0.04);
+        .topic-dev {
+          margin-bottom: 25px;
+          font-size: 20px !important;
+          .dev-text {
+            margin-bottom: 10px;
+          }
+        }
+      }
+    }
+    .examine-jieg {
+      .headline {
+        font-size: 28px;
+        padding-left: 5px;
+        border-left: 8px solid #41a1be;
+        // border-bottom: 1px solid #41a1be;
+        margin-bottom: 15px;
+      }
+    }
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  font-size: 20px;
+}
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/knowledge/questionnaire/index.vue b/src/views/knowledge/questionnaire/index.vue
new file mode 100644
index 0000000..824de78
--- /dev/null
+++ b/src/views/knowledge/questionnaire/index.vue
@@ -0,0 +1,780 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">闂嵎绫诲瀷</div>
+        <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div>
+      </div>
+      <div class="center-ss">
+        <el-input
+          placeholder="璇疯緭鍏ュ唴瀹�"
+          v-model="sidecolumnval"
+          class="input-with-select"
+          size="medium "
+        >
+          <el-button
+            @click="sidecolumnss"
+            slot="append"
+            icon="el-icon-search"
+          ></el-button>
+        </el-input>
+      </div>
+      <div class="bottom-fl">
+        <el-tabs tab-position="right">
+          <el-tab-pane :label="`鍏ㄩ儴 (${numberlb})`"></el-tab-pane>
+          <el-tab-pane
+            class="tab-paness"
+            :key="item.name"
+            v-for="(item, index) in editableTabs"
+            :label="item.title + ' (' + item.number + ')'"
+          ></el-tab-pane>
+
+          <el-tab-pane :label="`鏈垎缁�(${numberlbs})`"></el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">鏈湴闂嵎搴� </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">鍏变韩闂嵎搴� </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鐢ㄦ埛鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="闂嵎鍚嶇О" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="閫傜敤鐤剧梾" prop="status">
+                <el-cascader
+                  v-model="queryParams.status"
+                  :options="optionss"
+                  :props="propss"
+                  clearable
+                ></el-cascader>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @click="resetQuery"
+                  >閲嶇疆</el-button
+                >
+              </el-form-item>
+            </el-form>
+
+            <el-row :gutter="10" class="mb8">
+              <el-col :span="1.5">
+                <el-button
+                  type="primary"
+                  plain
+                  icon="el-icon-plus"
+                  size="medium"
+                  @click="handleAdd"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
+              </el-col>
+
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
+              </el-col>
+
+              <!-- <el-col :span="1.5"> </el-col> -->
+            </el-row>
+            <!-- <right-toolbar
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
+          :columns="columns"
+        ></right-toolbar> -->
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                label="搴忓彿"
+                align="center"
+                key="userId"
+                prop="userId"
+                v-if="columns[0].visible"
+              />
+              <el-table-column
+                label="闂嵎鍚嶇О"
+                align="center"
+                key="userName"
+                prop="userName"
+                v-if="columns[1].visible"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="鐗堟湰"
+                align="center"
+                key="nickName"
+                prop="nickName"
+                v-if="columns[2].visible"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="閫傜敤鐤剧梾"
+                align="center"
+                key="aphonenumber"
+                prop="aphonenumber"
+                v-if="columns[4].visible"
+                width="120"
+              /><el-table-column
+                label="闂嵎鎻忚堪"
+                align="center"
+                key="bphonenumber"
+                prop="bphonenumber"
+                v-if="columns[4].visible"
+                width="120"
+              />
+              <el-table-column
+                label="鏈�杩戠紪杈�"
+                align="center"
+                key="cphonenumber"
+                prop="cphonenumber"
+                v-if="columns[4].visible"
+                width="120"
+              />
+
+              <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="300"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="goQRCode(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                  >
+                    <span class="button-text"
+                      ><i class="el-icon-edit"></i>浜岀淮鐮�</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="ViewQuestionnaire(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textck"
+                      ><i class="el-icon-edit"></i>鏌ョ湅</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textxg"
+                      ><i class="el-icon-edit"></i>淇敼</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                    ><span class="button-textsc"
+                      ><i class="el-icon-edit"></i>鍒犻櫎</span
+                    ></el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <pagination
+              v-show="total > 0"
+              :total="total"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getList"
+            />
+          </el-col>
+        </el-row>
+
+        <!-- 娣诲姞鎴栦慨鏀归棶鍗烽厤缃璇濇 -->
+        <el-dialog
+          :title="title"
+          :visible.sync="open"
+          width="900px"
+          append-to-body
+        >
+          <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="濮撳悕" prop="nickName">
+                  <el-input
+                    v-model="form.nickName"
+                    placeholder="璇疯緭鍏ュ鍚�"
+                    maxlength="30"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="鎬у埆" prop="deptId">
+                  <el-select v-model="form.sex" placeholder="璇烽�夋嫨鎬у埆">
+                    <el-option
+                      v-for="dict in dict.type.sys_user_sex"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="璇佷欢绫诲瀷" prop="phonenumber">
+                  <el-input
+                    v-model="form.phonenumber"
+                    placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
+                    maxlength="11"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="璇佷欢鍙�" prop="email">
+                  <el-input
+                    v-model="form.email"
+                    placeholder="璇疯緭鍏ヨ瘉浠跺彿"
+                    maxlength="50"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鏈汉鎵嬫満鍙�" prop="userName">
+                  <el-input
+                    v-model="form.userName"
+                    placeholder="璇疯緭鍏ユ墜鏈哄彿"
+                    maxlength="30"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="浜插睘鎵嬫満鍙�" prop="password">
+                  <el-input
+                    v-model="form.password"
+                    placeholder="璇疯緭鍏ヤ翰灞炴墜鏈哄彿"
+                    type="password"
+                    maxlength="20"
+                    show-password
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="鎮h�呮爣绛�">
+                  <el-cascader
+                    :options="optionss"
+                    :props="propss"
+                    clearable
+                  ></el-cascader>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="24">
+                <el-form-item label="澶囨敞">
+                  <el-input
+                    v-model="form.remark"
+                    type="textarea"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+          </div>
+        </el-dialog>
+      </div>
+    </div>
+    <!-- 娣诲姞绫诲埆寮规 -->
+    <el-dialog width="30%" :visible.sync="dialogFormVisible">
+      <el-form :model="sidecolumnform">
+        <el-form-item label="璇疯緭鍏ョ被鍒悕绉�">
+          <el-input v-model="form.name" autocomplete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 浜岀淮鐮佸睍绀哄脊妗� -->
+    <el-dialog width="30%" :visible.sync="goQRCodeVisible">
+      <div class="qrcode-dialo">
+        <div class="qrcode-text">
+          {{ namequestionnaire }}<span>{{ haoquestionnaire }}</span>
+        </div>
+        <div class="qrcode-img"></div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+} from "@/api/system/user";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      namequestionnaire: "",
+      haoquestionnaire: "",
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userid: 1,
+          userName: "涓夊彿闂嵎",
+          nickName: "1.2.4",
+          aphonenumber: "鍏宠妭鐐庣棁",
+          bphonenumber: "寰堟",
+          cphonenumber: "2022-12-12 ",
+        },
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      numberlb: 22,
+      numberlbs: 2,
+      sidecolumnform: {}, //娣诲姞绫诲埆琛ㄥ崟
+      dialogFormVisible: false, //娣诲姞绫诲埆寮规
+      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      //绫诲埆鍒楄〃
+      editableTabs: [
+        {
+          title: "闂嵎鍒嗙被涓�",
+          number: "1",
+        },
+        {
+          title: "闂嵎鍒嗙被浜�",
+          number: "2",
+        },
+        {
+          title: "闂嵎鍒嗙被涓�",
+          number: "2",
+        },
+        {
+          title: "闂嵎鍒嗙被鍥�",
+          number: "2",
+        },
+        {
+          title: "闂嵎鍒嗙被浜�",
+          number: "2",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        IDnumber: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+        { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+        { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+  },
+
+  methods: {
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        // this.userList = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+        console.log(this.userList);
+      });
+      //   const { rows } = await listUser();
+      //   console.log(rows);
+      //   this.list = rows;
+    },
+    // 娣诲姞绫诲埆
+    submitsidecolumn() {
+      this.dialogFormVisible = false;
+    },
+    //鎼滅储绫诲埆
+    sidecolumnss() {},
+    // 鍒囨崲鍏变韩/鏈湴
+    tophandleClick() {},
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    goQRCode(row) {
+      this.goQRCodeVisible = true;
+      this.namequestionnaire = row.userName;
+      this.haoquestionnaire = row.nickName;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.$router.push({
+        path: "/knowledge/questionnaire/compilequer/",
+      });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.$router.push({
+        path: "/knowledge/questionnaire/compilequer/",
+        query: { id: "1" },
+      });
+    },
+    // 鏌ョ湅闂嵎
+    ViewQuestionnaire() {
+      this.$router.push({
+        path: "/knowledge/questionnaire/examine/",
+        query: { id: "1" },
+      });
+    },
+
+    /** 鏇存柊/淇敼鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .sidecolumn-top {
+    display: flex;
+    justify-content: space-between;
+    .top-wj {
+      font-size: 20px;
+    }
+    .top-tj {
+      font-size: 18px;
+
+      color: rgb(0, 89, 255);
+      cursor: pointer;
+    }
+  }
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+.qrcode-dialo {
+  text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .qrcode-text {
+    font-size: 20px;
+    span {
+      margin-left: 20px;
+    }
+  }
+  .qrcode-img {
+    width: 300px;
+    height: 400px;
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  font-size: 20px;
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textck {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/ruoyi-ui/src/views/login.vue b/src/views/login.vue
similarity index 67%
rename from ruoyi-ui/src/views/login.vue
rename to src/views/login.vue
index 7e54a6c..6402807 100644
--- a/ruoyi-ui/src/views/login.vue
+++ b/src/views/login.vue
@@ -1,6 +1,11 @@
 <template>
   <div class="login">
-    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
+    <el-form
+      ref="loginForm"
+      :model="loginForm"
+      :rules="loginRules"
+      class="login-form"
+    >
       <h3 class="title">鏅烘収闅忚绠$悊绯荤粺</h3>
       <el-form-item prop="username">
         <el-input
@@ -9,7 +14,11 @@
           auto-complete="off"
           placeholder="璐﹀彿"
         >
-          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
+          <svg-icon
+            slot="prefix"
+            icon-class="user"
+            class="el-input__icon input-icon"
+          />
         </el-input>
       </el-form-item>
       <el-form-item prop="password">
@@ -20,7 +29,11 @@
           placeholder="瀵嗙爜"
           @keyup.enter.native="handleLogin"
         >
-          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+          <svg-icon
+            slot="prefix"
+            icon-class="password"
+            class="el-input__icon input-icon"
+          />
         </el-input>
       </el-form-item>
       <el-form-item prop="code" v-if="captchaEnabled">
@@ -31,26 +44,36 @@
           style="width: 63%"
           @keyup.enter.native="handleLogin"
         >
-          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
+          <svg-icon
+            slot="prefix"
+            icon-class="validCode"
+            class="el-input__icon input-icon"
+          />
         </el-input>
         <div class="login-code">
-          <img :src="codeUrl" @click="getCode" class="login-code-img"/>
+          <img :src="codeUrl" @click="getCode" class="login-code-img" />
         </div>
       </el-form-item>
-      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">璁颁綇瀵嗙爜</el-checkbox>
-      <el-form-item style="width:100%;">
+      <el-checkbox
+        v-model="loginForm.rememberMe"
+        style="margin: 0px 0px 25px 0px"
+        >璁颁綇瀵嗙爜</el-checkbox
+      >
+      <el-form-item style="width: 100%">
         <el-button
           :loading="loading"
           size="medium"
           type="primary"
-          style="width:100%;"
+          style="width: 100%"
           @click.native.prevent="handleLogin"
         >
           <span v-if="!loading">鐧� 褰�</span>
           <span v-else>鐧� 褰� 涓�...</span>
         </el-button>
-        <div style="float: right;" v-if="register">
-          <router-link class="link-type" :to="'/register'">绔嬪嵆娉ㄥ唽1</router-link>
+        <div style="float: right" v-if="register">
+          <router-link class="link-type" :to="'/register'"
+            >绔嬪嵆娉ㄥ唽1</router-link
+          >
         </div>
       </el-form-item>
     </el-form>
@@ -64,7 +87,7 @@
 <script>
 import { getCodeImg } from "@/api/login";
 import Cookies from "js-cookie";
-import { encrypt, decrypt } from '@/utils/jsencrypt'
+import { encrypt, decrypt } from "@/utils/jsencrypt";
 
 export default {
   name: "Login",
@@ -76,32 +99,32 @@
         password: "admin123",
         rememberMe: false,
         code: "",
-        uuid: ""
+        uuid: "",
       },
       loginRules: {
         username: [
-          { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }
+          { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" },
         ],
         password: [
-          { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }
+          { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" },
         ],
-        code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }]
+        code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }],
       },
       loading: false,
       // 楠岃瘉鐮佸紑鍏�
       captchaEnabled: true,
       // 娉ㄥ唽寮�鍏�
       register: false,
-      redirect: undefined
+      redirect: undefined,
     };
   },
   watch: {
     $route: {
-      handler: function(route) {
+      handler: function (route) {
         this.redirect = route.query && route.query.redirect;
       },
-      immediate: true
-    }
+      immediate: true,
+    },
   },
   created() {
     this.getCode();
@@ -109,8 +132,9 @@
   },
   methods: {
     getCode() {
-      getCodeImg().then(res => {
-        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
+      getCodeImg().then((res) => {
+        this.captchaEnabled =
+          res.captchaEnabled === undefined ? true : res.captchaEnabled;
         if (this.captchaEnabled) {
           this.codeUrl = "data:image/gif;base64," + res.img;
           this.loginForm.uuid = res.uuid;
@@ -120,38 +144,46 @@
     getCookie() {
       const username = Cookies.get("username");
       const password = Cookies.get("password");
-      const rememberMe = Cookies.get('rememberMe')
+      const rememberMe = Cookies.get("rememberMe");
       this.loginForm = {
         username: username === undefined ? this.loginForm.username : username,
-        password: password === undefined ? this.loginForm.password : decrypt(password),
-        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
+        password:
+          password === undefined ? this.loginForm.password : decrypt(password),
+        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
       };
     },
     handleLogin() {
-      this.$refs.loginForm.validate(valid => {
+      this.$refs.loginForm.validate((valid) => {
         if (valid) {
           this.loading = true;
           if (this.loginForm.rememberMe) {
             Cookies.set("username", this.loginForm.username, { expires: 30 });
-            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
-            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
+            Cookies.set("password", encrypt(this.loginForm.password), {
+              expires: 30,
+            });
+            Cookies.set("rememberMe", this.loginForm.rememberMe, {
+              expires: 30,
+            });
           } else {
             Cookies.remove("username");
             Cookies.remove("password");
-            Cookies.remove('rememberMe');
+            Cookies.remove("rememberMe");
           }
-          this.$store.dispatch("Login", this.loginForm).then(() => {
-            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
-          }).catch(() => {
-            this.loading = false;
-            if (this.captchaEnabled) {
-              this.getCode();
-            }
-          });
+          this.$store
+            .dispatch("Login", this.loginForm)
+            .then(() => {
+              this.$router.push({ path: this.redirect || "/" }).catch(() => {});
+            })
+            .catch(() => {
+              this.loading = false;
+              if (this.captchaEnabled) {
+                this.getCode();
+              }
+            });
         }
       });
-    }
-  }
+    },
+  },
 };
 </script>
 
diff --git a/ruoyi-ui/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/cache/index.vue
rename to src/views/monitor/cache/index.vue
diff --git a/ruoyi-ui/src/views/monitor/cache/list.vue b/src/views/monitor/cache/list.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/cache/list.vue
rename to src/views/monitor/cache/list.vue
diff --git a/ruoyi-ui/src/views/monitor/druid/index.vue b/src/views/monitor/druid/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/druid/index.vue
rename to src/views/monitor/druid/index.vue
diff --git a/ruoyi-ui/src/views/monitor/job/index.vue b/src/views/monitor/job/index.vue
similarity index 99%
rename from ruoyi-ui/src/views/monitor/job/index.vue
rename to src/views/monitor/job/index.vue
index 37c8fc1..e5f808d 100644
--- a/ruoyi-ui/src/views/monitor/job/index.vue
+++ b/src/views/monitor/job/index.vue
@@ -293,6 +293,8 @@
 <script>
 import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/monitor/job";
 import Crontab from '@/components/Crontab'
+import * as echarts from "echarts";
+
 
 export default {
   components: { Crontab },
diff --git a/ruoyi-ui/src/views/monitor/job/log.vue b/src/views/monitor/job/log.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/job/log.vue
rename to src/views/monitor/job/log.vue
diff --git a/ruoyi-ui/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/logininfor/index.vue
rename to src/views/monitor/logininfor/index.vue
diff --git a/ruoyi-ui/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/online/index.vue
rename to src/views/monitor/online/index.vue
diff --git a/ruoyi-ui/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/operlog/index.vue
rename to src/views/monitor/operlog/index.vue
diff --git a/ruoyi-ui/src/views/monitor/server/index.vue b/src/views/monitor/server/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/monitor/server/index.vue
rename to src/views/monitor/server/index.vue
diff --git a/ruoyi-ui/src/views/system/user/authRole.vue b/src/views/patient/patient/authRole.vue
similarity index 100%
copy from ruoyi-ui/src/views/system/user/authRole.vue
copy to src/views/patient/patient/authRole.vue
diff --git a/src/views/patient/patient/index.vue b/src/views/patient/patient/index.vue
new file mode 100644
index 0000000..487ba90
--- /dev/null
+++ b/src/views/patient/patient/index.vue
@@ -0,0 +1,993 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--閮ㄩ棬鏁版嵁-->
+      <!-- <el-col :span="4" :xs="24">
+        <div class="head-container">
+          <el-input
+            v-model="deptName"
+            placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+            clearable
+            size="small"
+            prefix-icon="el-icon-search"
+            style="margin-bottom: 20px"
+          />
+        </div>
+        <div class="head-container">
+          <el-tree
+            :data="deptOptions"
+            :props="defaultProps"
+            :expand-on-click-node="false"
+            :filter-node-method="filterNode"
+            ref="tree"
+            node-key="id"
+            default-expand-all
+            highlight-current
+            @node-click="handleNodeClick"
+          />
+        </div>
+      </el-col> -->
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-col :span="24" :xs="24">
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+          label-width="98px"
+        >
+          <el-form-item label="濮撳悕" prop="userName">
+            <el-input
+              v-model="queryParams.userName"
+              placeholder="璇疯緭鍏ュ鍚�"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="韬唤璇佸彿鐮�" prop="IDnumber">
+            <el-input
+              v-model="queryParams.IDnumber"
+              placeholder="璇疯緭鍏ヨ韩浠借瘉鍙风爜"
+              clearable
+              style="width: 250px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="鑱旂郴鏂瑰紡" prop="phonenumber">
+            <el-input
+              v-model="queryParams.phonenumber"
+              placeholder="璇疯緭鍏ヨ仈绯绘柟寮�"
+              clearable
+              style="width: 280px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-row>
+            <el-form-item label="鎮h�呮爣绛�" prop="status">
+              <el-cascader
+                v-model="queryParams.status"
+                :options="optionss"
+                :props="propss"
+                clearable
+              ></el-cascader>
+            </el-form-item>
+          </el-row>
+
+          <!-- <el-form-item label="鍒涘缓鏃堕棿">
+            <el-date-picker
+              v-model="dateRange"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="medium" @click="handleQuery">鎼滅储</el-button>
+            <el-button icon="el-icon-refresh" size="medium" @click="resetQuery">閲嶇疆</el-button>
+          </el-form-item> -->
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+          <el-col :span="19">
+            <div class="documentf">
+              <div class="document">
+                <el-button
+                  type="info"
+                  plain
+                  icon="el-icon-upload2"
+                  size="medium"
+                  @click="handleImport"
+                  v-hasPermi="['system:user:import']"
+                  >瀵煎叆</el-button
+                >
+              </div>
+              <div class="document">
+                <el-button
+                  type="warning"
+                  plain
+                  icon="el-icon-download"
+                  size="medium"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+                  >瀵煎嚭</el-button
+                >
+              </div>
+            </div>
+          </el-col>
+          <!-- <el-col :span="1.5"> </el-col> -->
+        </el-row>
+        <!-- <right-toolbar
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
+          :columns="columns"
+        ></right-toolbar> -->
+        <el-table
+          v-loading="loading"
+          :data="userList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column
+            label="搴忓彿"
+            align="center"
+            key="userId"
+            prop="userId"
+          />
+          <el-table-column
+            label="濮撳悕"
+            align="center"
+            key="userName"
+            prop="userName"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎬у埆"
+            align="center"
+            key="nickName"
+            prop="nickName"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎮h�呮爣绛�"
+            align="center"
+            key="deptName"
+            prop="dept.deptName"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="璇佷欢绫诲瀷"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            width="120"
+          /><el-table-column
+            label="璇佷欢鍙风爜"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            width="120"
+          />
+          <el-table-column
+            label="骞撮緞"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            v-if="columns[4].visible"
+            width="120"
+          />
+
+          <el-table-column
+            label="鑱旂郴鏂瑰紡"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            v-if="columns[4].visible"
+            width="120"
+          />
+          <el-table-column
+            label="寤烘。鏃ユ湡"
+            align="center"
+            prop="createTime"
+            v-if="columns[6].visible"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鏇存柊鏃ユ湡"
+            align="center"
+            prop="createTime"
+            v-if="columns[6].visible"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鎿嶄綔"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope" v-if="scope.row.userId !== 1">
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-edit"
+                @click="$router.push('/patient/patient/profile/')"
+                v-hasPermi="['system:user:edit']"
+                >鏌ョ湅</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+    <!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="濮撳悕" prop="nickName">
+              <el-input
+                v-model="form.nickName"
+                placeholder="璇疯緭鍏ュ鍚�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎬у埆" prop="deptId">
+              <el-select v-model="form.sex" placeholder="璇烽�夋嫨鎬у埆">
+                <el-option
+                  v-for="dict in dict.type.sys_user_sex"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="璇佷欢绫诲瀷" prop="phonenumber">
+              <el-input
+                v-model="form.phonenumber"
+                placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
+                maxlength="11"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇佷欢鍙�" prop="email">
+              <el-input
+                v-model="form.email"
+                placeholder="璇疯緭鍏ヨ瘉浠跺彿"
+                maxlength="50"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鏈汉鎵嬫満鍙�" prop="userName">
+              <el-input
+                v-model="form.userName"
+                placeholder="璇疯緭鍏ユ墜鏈哄彿"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浜插睘鎵嬫満鍙�" prop="password">
+              <el-input
+                v-model="form.password"
+                placeholder="璇疯緭鍏ヤ翰灞炴墜鏈哄彿"
+                type="password"
+                maxlength="20"
+                show-password
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎮h�呮爣绛�">
+              <!-- <el-select v-model="form.sex" placeholder="璇烽�夋嫨"> -->
+              <el-cascader
+                :options="optionss"
+                :props="propss"
+                clearable
+              ></el-cascader>
+              <!-- </el-select> -->
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="12">
+            <el-form-item label="鐘舵��">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in dict.type.sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.value"
+                  >{{ dict.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-form-item>
+          </el-col> -->
+        </el-row>
+        <!-- <el-row>
+          <el-col :span="12">
+            <el-form-item label="宀椾綅">
+              <el-select
+                v-model="form.postIds"
+                multiple
+                placeholder="璇烽�夋嫨宀椾綅"
+              >
+                <el-option
+                  v-for="item in postOptions"
+                  :key="item.postId"
+                  :label="item.postName"
+                  :value="item.postId"
+                  :disabled="item.status == 1"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瑙掕壊">
+              <el-select
+                v-model="form.roleIds"
+                multiple
+                placeholder="璇烽�夋嫨瑙掕壊"
+              >
+                <el-option
+                  v-for="item in roleOptions"
+                  :key="item.roleId"
+                  :label="item.roleName"
+                  :value="item.roleId"
+                  :disabled="item.status == 1"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row> -->
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞">
+              <el-input
+                v-model="form.remark"
+                type="textarea"
+                placeholder="璇疯緭鍏ュ唴瀹�"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
+    <el-dialog
+      :title="upload.title"
+      :visible.sync="upload.open"
+      width="70%"
+      append-to-body
+    >
+      <el-steps :active="dractive" simple>
+        <el-step title="涓婁紶瀵煎叆鏂囦欢" icon="el-icon-upload"></el-step>
+        <el-step title="瀵煎叆妫�鏌�" icon="el-icon-picture"></el-step>
+        <el-step title="瀵煎叆缁撴灉" icon="el-icon-picture"></el-step>
+      </el-steps>
+      <!-- 涓婁紶瀵煎叆鏂囦欢 -->
+      <div class="download" v-if="dractive == 1">
+        <el-upload
+          class="upload-demo"
+          ref="upload"
+          :limit="1"
+          accept=".xlsx, .xls"
+          :headers="upload.headers"
+          :action="upload.url + '?updateSupport=' + upload.updateSupport"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+          <div class="el-upload__tip text-center" slot="tip">
+            <div class="el-upload__tip" slot="tip">
+              <el-checkbox v-model="upload.updateSupport" />
+              鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+            </div>
+            <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+            <el-link
+              type="primary"
+              :underline="false"
+              style="font-size: 24px; vertical-align: baseline"
+              @click="importTemplate"
+              >涓嬭浇妯℃澘</el-link
+            >
+          </div>
+        </el-upload>
+      </div>
+      <!-- 瀵煎叆妫�鏌� -->
+      <div class="uploading" v-else-if="dractive == 2">
+        <el-table :data="uploadingData" style="width: 100%">
+          <el-table-column prop="serial" label="搴忓彿"> </el-table-column>
+          <el-table-column prop="name" label="濮撳悕"> </el-table-column>
+          <el-table-column prop="sex" label="鎬у埆"> </el-table-column>
+          <el-table-column prop="certificate" label="璇佷欢绫诲瀷">
+          </el-table-column>
+          <el-table-column prop="certificatenum" label="璇佷欢鍙风爜">
+          </el-table-column>
+          <el-table-column prop="goday" label="鍑虹敓鏃ユ湡"> </el-table-column>
+          <el-table-column prop="menum" label="鏈汉鑱旂郴鏂瑰紡"> </el-table-column>
+          <el-table-column prop="younum" label="浜插睘鑱旂郴鏂瑰紡">
+          </el-table-column>
+          <el-table-column prop="tag" label="鎮h�呮爣绛�"> </el-table-column>
+          <el-table-column prop="erry" label="閿欒鍘熷洜"> </el-table-column>
+        </el-table>
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="geterryList"
+        />
+      </div>
+      <!-- 瀹屾垚 -->
+      <div class="drexamine" v-else-if="dractive == 3">
+        <img
+          src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
+        />
+        <p>瀵煎叆鎮h�呮垚鍔燂紒</p>
+        <p>鏈鍏辫瀵煎叆{{ ImportQuantity }}浣嶆偅鑰�</p>
+      </div>
+
+      <div slot="footer" class="dialog-footer" v-if="dractive == 3">
+        <!-- <el-button type="primary" @click="submitFileForm">涓嬩竴姝�</el-button> -->
+        <el-button @click="submitclose">瀹屾垚</el-button>
+      </div>
+      <div slot="footer" v-else>
+        <el-button type="primary" @click="submitFileForm">涓嬩竴姝�</el-button>
+        <el-button @click="submitclose">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+  deptTreeSelect,
+} from "@/api/system/user";
+import { listpatient } from "@/api/patient/homepage";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 閮ㄩ棬鏍戦�夐」
+      deptOptions: undefined,
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      //瀵煎叆杩涘害
+      dractive: 1,
+      // 瀵煎叆灞曠ず琛ㄥ崟
+      uploadingData: {},
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵煎叆鎮h�呮暟閲�
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        jobName: undefined,
+        jobGroup: undefined,
+        status: undefined,
+      },
+      propss: { multiple: true },
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      // 鐢ㄦ埛瀵煎叆鍙傛暟
+      upload: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/system/user/importData",
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        name: "鐜嬪ぇ",
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        IDnumber: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+        { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+        { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {
+    // 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+  created() {
+    this.getList();
+    this.getDeptTree();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  methods: {
+    /** 鏌ヨ鎮h�呭垪琛� */
+    getList() {
+      this.loading = true;
+      listUser(this.queryParams).then((response) => {
+        console.log(response);
+        this.userList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鏌ヨ瀵煎叆灞曠ず鍒楄〃
+    geterryList() {
+      this.loading = true;
+      listJob(this.queryParams).then((response) => {
+        this.jobList = 1;
+        this.total = 1;
+        this.loading = false;
+      });
+    },
+    /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
+    getDeptTree() {
+      deptTreeSelect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 绛涢�夎妭鐐�
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 鑺傜偣鍗曞嚮浜嬩欢
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.handleQuery();
+    },
+    // 鐢ㄦ埛鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    // 鏇村鎿嶄綔瑙﹀彂
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleResetPwd":
+          this.handleResetPwd(row);
+          break;
+        case "handleAuthRole":
+          this.handleAuthRole(row);
+          break;
+        default:
+          break;
+      }
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      getUser().then((response) => {
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.open = true;
+        this.title = "鏂板鎮h��";
+        this.form.password = this.initPassword;
+      });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.open = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+    /** 鍒嗛厤瑙掕壊鎿嶄綔 */
+    handleAuthRole: function (row) {
+      const userId = row.userId;
+      this.$router.push("/system/user-auth/role/" + userId);
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "smartor/patarchive/export",
+        {
+          ...this.queryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      this.upload.title = "鐢ㄦ埛瀵煎叆";
+      this.upload.open = true;
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      this.download(
+        "system/user/importTemplate",
+        {},
+        `user_template_${new Date().getTime()}.xlsx`
+      );
+    },
+    // 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(
+        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+          response.msg +
+          "</div>",
+        "瀵煎叆缁撴灉",
+        { dangerouslyUseHTMLString: true }
+      );
+      this.getList();
+    },
+    // 鎻愪氦涓婁紶鏂囦欢
+    submitFileForm() {
+      // 涓婁紶
+      if (this.dractive == 1) {
+        this.$refs.upload.submit();
+        this.dractive++;
+      } else {
+        this.dractive++;
+      }
+    },
+    submitclose() {
+      this.upload.open = false;
+      this.dractive = 1;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.download {
+  text-align: center;
+  .el-upload__tip {
+    font-size: 23px;
+  }
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+</style>
diff --git a/src/views/patient/patient/profile/index.vue b/src/views/patient/patient/profile/index.vue
new file mode 100644
index 0000000..cd3849d
--- /dev/null
+++ b/src/views/patient/patient/profile/index.vue
@@ -0,0 +1,767 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <el-col :span="4" :xs="24">
+        <el-card class="box-card">
+          <!-- <div slot="header" class="clearfix">
+            <span>涓汉淇℃伅</span>
+          </div> -->
+          <div class="personage">
+            <div class="text-center">
+              <img v-imgError="require('@/assets/common/head.jpg')" src="" />
+            </div>
+            <div class="information">
+              <div class="info-xx">
+                鍚撮緳
+                <div class="xinz-inf">+鏂板鏍囩</div>
+              </div>
+              <div class="info-xx">鐢�<span>66宀�</span></div>
+              <div class="info-xx">13803963330</div>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="18" :xs="24">
+        <el-tabs
+          type="border-card"
+          v-model="activeName"
+          @tab-click="handleClick"
+        >
+          <el-tab-pane name="health">
+            <span class="mulsz" slot="label"
+              ><i class="el-icon-date"></i> 鍋ュ悍妗f</span
+            >
+            鍩烘湰淇℃伅
+          </el-tab-pane>
+          <el-tab-pane name="medical">
+            <span class="mulsz" slot="label"
+              ><i class="el-icon-s-management"></i> 鍖荤枟妗f</span
+            >
+            <el-tabs v-model="sonactiveName" @tab-click="handleClick">
+              <el-tab-pane name="outpatient"
+                ><span class="mulsz" slot="label"
+                  >闂ㄨ瘖({{ mznumber }})</span
+                ></el-tab-pane
+              >
+              <el-tab-pane name="inhospital"
+                ><span class="mulsz" slot="label"
+                  >浣忛櫌({{ zynumber }})
+                </span></el-tab-pane
+              >
+              <el-tab-pane name="checkout"
+                ><span class="mulsz" slot="label"
+                  >妫�楠�({{ jynumber }})
+                </span></el-tab-pane
+              >
+              <el-tab-pane name="examine"
+                ><span class="mulsz" slot="label"
+                  >妫�鏌�({{ jcnumber }})
+                </span></el-tab-pane
+              >
+              <el-tab-pane name="physical"
+                ><span class="mulsz" slot="label">
+                  浣撴({{ tjnumber }})</span
+                ></el-tab-pane
+              >
+              <el-tab-pane name="pharmacy"
+                ><span class="mulsz" slot="label"
+                  >鐢ㄨ嵂({{ yynumber }})
+                </span></el-tab-pane
+              >
+            </el-tabs>
+          </el-tab-pane>
+          <el-tab-pane name="monitor">
+            <span class="mulsz" slot="label"
+              ><i class="el-icon-s-data"></i> 鍋ュ悍鐩戞祴</span
+            >
+
+            <el-tabs v-model="sontwoactiveName" @tab-click="handleClick">
+              <el-tab-pane name="blood"
+                ><span class="mulsz" slot="label"
+                  ><i class="el-icon-s-operation"></i> 琛�鍘�</span
+                ></el-tab-pane
+              >
+              <el-tab-pane name="glucose"
+                ><span class="mulsz" slot="label"
+                  ><i class="el-icon-odometer"></i>琛�绯�
+                </span></el-tab-pane
+              >
+              <el-tab-pane name="weight"
+                ><span class="mulsz" slot="label"
+                  ><i class="el-icon-s-data"></i>浣撻噸
+                </span></el-tab-pane
+              >
+            </el-tabs></el-tab-pane
+          >
+          <el-tab-pane name="serve">
+            <span class="mulsz" slot="label"
+              ><i class="el-icon-s-custom"></i> 鏈嶅姟璁板綍</span
+            >
+
+            瀹氭椂浠诲姟琛ュ伩</el-tab-pane
+          >
+        </el-tabs>
+      </el-col>
+    </el-row>
+    <!-- 鍋ュ悍妗f妯″潡 -->
+    <div class="information-content" v-if="activeName == 'health'">
+      <div class="top-message">
+        <div class="headline">鍩虹淇℃伅</div>
+        <div class="detailed">
+          <div class="one-column">
+            <div>鎮h�呭鍚嶏細<span class="spanvalue">鐜嬪ぇ缇�</span></div>
+            <div>鎬у埆锛�<span class="spanvalue">鐢�</span></div>
+
+            <div>璇佷欢绫诲瀷锛�<span class="spanvalue">韬唤璇�</span></div>
+          </div>
+          <div class="one-column">
+            <div>鍑虹敓鏃ユ湡锛�<span class="spanvalue">1999-01-02</span></div>
+
+            <div>骞撮緞锛�<span class="spanvalue">121</span></div>
+
+            <div class="">
+              璇佷欢鍙风爜锛�<span class="spanvalue">312223222322232223</span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="bottom-message">
+        <div class="headline">鍙风爜缁存姢</div>
+        <div class="Table-screen">
+          <el-table :data="tableData" style="width: 100%">
+            <el-table-column prop="name" label="濮撳悕" width="180">
+            </el-table-column>
+            <el-table-column prop="phonenumber" label="鑱旂郴鏂瑰紡" width="180">
+            </el-table-column>
+            <el-table-column prop="concern" label="鍏崇郴"> </el-table-column>
+            <el-table-column prop="source" label="鑱旂郴浜烘潵婧�">
+            </el-table-column>
+            <el-table-column prop="default" label="榛樿鑱旂郴鏂瑰紡">
+            </el-table-column>
+            <el-table-column
+              label-class-name="columcz"
+              fixed="right"
+              label="鎿嶄綔"
+              width="300"
+            >
+              <template slot-scope="scope">
+                <el-button type="success" size="small"
+                  >璁句负榛樿鑱旂郴鏂瑰紡</el-button
+                >
+                <el-button type="warning" size="small">缂栬緫</el-button>
+                <el-button type="danger" size="small">鍒犻櫎</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </div>
+    <!-- 鍖荤枟妗f -->
+    <div class="medical-record" v-else-if="activeName == 'medical'">
+      <!-- 闂ㄨ瘖 -->
+      <div v-if="sonactiveName == 'outpatient'">
+        <el-table :data="serviceData" style="width: 100%">
+          <el-table-column prop="daya" label="灏辫瘖鏃ユ湡" width="180">
+          </el-table-column>
+          <el-table-column prop="hospitalname" label="鍖婚櫌鍚嶇О" width="180">
+          </el-table-column>
+          <el-table-column prop="result" label="璇婃柇缁撴灉"> </el-table-column>
+          <el-table-column prop="administrative" label="灏辫瘖绉戝">
+          </el-table-column>
+          <el-table-column prop="doctor" label="鍖荤敓"> </el-table-column>
+          <el-table-column label-class-name="columcz" label="鎿嶄綔" width="300">
+            <template slot-scope="scope">
+              <el-button type="text" size="small">璇︽儏</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </div>
+      <!-- 浣忛櫌 -->
+      <div v-if="sonactiveName == 'inhospital'">
+        <el-table :data="serviceData" style="width: 100%">
+          <el-table-column prop="godaya" label="鍏ラ櫌鏃ユ湡"> </el-table-column>
+          <el-table-column prop="hospitalname" label="鍖婚櫌鍚嶇О">
+          </el-table-column>
+          <el-table-column prop="result" label="鍏ラ櫌绉戝埆"> </el-table-column>
+          <el-table-column prop="administrative" label="鐥呭尯">
+          </el-table-column>
+          <el-table-column prop="bed" label="搴婁綅鍙�"> </el-table-column>
+          <el-table-column prop="doctor" label="鍏ラ櫌璇婃柇"> </el-table-column>
+          <el-table-column prop="today" label="鍑洪櫌鏃堕棿"> </el-table-column>
+        </el-table>
+      </div>
+      <!-- 妫�楠� -->
+      <div v-if="sonactiveName == 'checkout'">
+        <el-table :data="serviceData" style="width: 100%">
+          <el-table-column prop="godaya" label="妫�楠屽崟鍙�"> </el-table-column>
+          <el-table-column prop="hospitalname" label="鎶ュ憡鏃ユ湡">
+          </el-table-column>
+          <el-table-column prop="result" label="妫�楠岄」鐩�"> </el-table-column>
+          <el-table-column prop="administrative" label="鍖婚櫌鍚嶇О">
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 妫�鏌� -->
+      <div v-if="sonactiveName == 'examine'">
+        <el-table :data="serviceData" style="width: 100%">
+          <el-table-column prop="godaya" label="鎶ュ憡鍗�"> </el-table-column>
+          <el-table-column prop="hospitalname" label="鎶ュ憡鏃堕棿">
+          </el-table-column>
+          <el-table-column prop="result" label="妫�鏌ラ」鐩�"> </el-table-column>
+          <el-table-column prop="administrative" label="鍖婚櫌鍚嶇О">
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 浣撴 -->
+      <div v-if="sonactiveName == 'physical'">
+        <el-table :data="serviceData" style="width: 100%">
+          <el-table-column prop="daya" label="灏辫瘖鏃ユ湡"> </el-table-column>
+          <el-table-column prop="hospitalname" label="鍖婚櫌鍚嶇О">
+          </el-table-column>
+          <el-table-column prop="result" label="璇婃柇缁撴灉"> </el-table-column>
+          <el-table-column prop="administrative" label="灏辫瘖绉戝">
+          </el-table-column>
+          <el-table-column prop="doctor" label="鍖荤敓"> </el-table-column>
+          <!-- <el-table-column
+            label-class-name="columcz"
+            fixed="right"
+            label="鎿嶄綔"
+            width="300"
+          >
+            <template slot-scope="scope">
+              <el-button type="text" size="small">璇︽儏</el-button>
+            </template>
+          </el-table-column> -->
+        </el-table>
+      </div>
+      <!-- 鐢ㄨ嵂 -->
+      <div v-if="sonactiveName == 'pharmacy'">
+        <el-table :data="serviceData" style="width: 100%">
+          <el-table-column prop="daya" label="灏辫瘖鏃ユ湡"> </el-table-column>
+          <el-table-column prop="hospitalname" label="鍖婚櫌鍚嶇О">
+          </el-table-column>
+          <el-table-column prop="result" label="璇婃柇缁撴灉"> </el-table-column>
+          <el-table-column prop="administrative" label="灏辫瘖绉戝">
+          </el-table-column>
+          <el-table-column prop="doctor" label="鍖荤敓"> </el-table-column>
+        </el-table>
+      </div>
+    </div>
+
+    <!-- 鏈嶅姟璁板綍 -->
+    <div class="medical-record" v-else-if="activeName == 'serve'">sdaad</div>
+    <!-- 鍋ュ悍鐩戞祴 -->
+    <div class="medical-record" v-show="activeName == 'monitor'">
+      <!-- 琛�鍘嬪浘鏍� -->
+      <div v-show="sontwoactiveName == 'blood'">
+        <div
+          id="xyeCharts"
+          class="sontwoactiveName"
+          style="width: 1300px; height: 800px"
+        ></div>
+      </div>
+      <!-- 琛�绯� -->
+      <div v-show="sontwoactiveName == 'glucose'">
+        <div
+          id="xteCharts"
+          class="sontwoactiveName"
+          style="width: 1300px; height: 800px"
+        ></div>
+      </div>
+      <!-- 浣撻噸 -->
+      <div v-show="sontwoactiveName == 'weight'">
+        <div
+          id="tzeCharts"
+          class="sontwoactiveName"
+          style="width: 1300px; height: 800px"
+        ></div>
+      </div>
+    </div>
+
+    <!-- <div id="xyeCharts" style="width: 500px; height: 500px"></div> -->
+  </div>
+</template>
+
+<script>
+import userAvatar from "./userAvatar";
+import userInfo from "./userInfo";
+import resetPwd from "./resetPwd";
+import * as echarts from "echarts";
+
+import { getUserProfile } from "@/api/system/user";
+import { listJob } from "@/api/monitor/job"; //鑾峰彇鍒楄〃鎺ュ彛寰呭畾
+
+export default {
+  name: "Profile",
+  components: { userAvatar, userInfo, resetPwd },
+  data() {
+    return {
+      user: {},
+      roleGroup: {},
+      postGroup: {},
+      mznumber: 14,
+      zynumber: 34,
+      jynumber: 32,
+      jcnumber: 12,
+      tjnumber: 12,
+      yynumber: 12,
+      total: 0, // 鎬绘潯鏁�
+      activeTab: "userinfo",
+      activeName: "health", //涓�绫诲鑸�
+      sonactiveName: "outpatient", //鍋ュ悍鐩戞祴瀵艰埅
+      sontwoactiveName: "blood", //鍖荤枟妗f瀵艰埅
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        jobName: undefined,
+        jobGroup: undefined,
+        status: undefined,
+      },
+      echartdom: {},
+      xtechartdom: {},
+      tzechartdom: {},
+      tableData: [
+        {
+          date: "2016-05-02",
+          name: "鐜嬪皬铏�",
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1518 寮�",
+        },
+        {
+          date: "2016-05-04",
+          name: "鐜嬪皬铏�",
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1517 寮�",
+        },
+        {
+          date: "2016-05-01",
+          name: "鐜嬪皬铏�",
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1519 寮�",
+        },
+        {
+          date: "2016-05-03",
+          name: "鐜嬪皬铏�",
+          address: "涓婃捣甯傛櫘闄�鍖洪噾娌欐睙璺� 1516 寮�",
+        },
+      ],
+      serviceData: [
+        {
+          daya: "2023-12-12",
+          hospitalname: "鍗忓拰",
+          result: "闊у甫鎷変激",
+          administrative: "楠ㄧ",
+          doctor: "鍚村ぇ榫�",
+        },
+      ],
+    };
+  },
+  created() {
+    this.$nextTick(function () {
+      this.echartdom = document.getElementById("xyeCharts");
+      this.xtechartdom = document.getElementById("xteCharts");
+      this.tzechartdom = document.getElementById("tzeCharts");
+      console.log(this.echartdom);
+      console.log(this.xtechartdom);
+      console.log(this.tzechartdom);
+      this.echartsInit();
+      this.xtechartsInit();
+      this.tzechartsInit();
+    });
+    this.getList();
+  },
+  methods() {},
+
+  methods: {
+    // 鏌ヨ鍒楄〃
+    getList() {
+      this.loading = true;
+      listJob(this.queryParams).then((response) => {
+        this.jobList = 1;
+        this.total = 1;
+        this.loading = false;
+      });
+    },
+    // getUser() {
+    //   getUserProfile().then((response) => {
+    //     this.user = response.data;
+    //     this.roleGroup = response.roleGroup;
+    //     this.postGroup = response.postGroup;
+    //   });
+    // },
+    handleClick(tab, event) {
+      console.log(tab, event);
+    },
+
+    // 琛�鍘嬪浘琛ㄩ儴鍒�
+    echartsInit() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      console.log(echarts);
+      console.log(this.echartdom);
+      console.log(this.$refs.xyeCharts);
+      var myxyChart = echarts.init(this.echartdom);
+      console.log(myxyChart);
+      // var myxyChart = this.$echarts.init(document.getElementById("xyeCharts"));
+      // var myxyChart = this.$echarts.init(this.$refs.xyeCharts);
+      var option = {
+        title: {
+          text: "鍘嗗彶琛�鍘嬭褰�",
+        },
+        tooltip: {
+          trigger: "axis",
+        },
+        legend: {},
+        toolbox: {
+          show: true,
+          feature: {
+            dataZoom: {
+              yAxisIndex: "none",
+            },
+            dataView: { readOnly: false },
+            magicType: { type: ["line", "bar"] },
+            restore: {},
+            saveAsImage: {},
+          },
+        },
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          data: ["涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀", "涓冩湀"],
+        },
+        yAxis: {
+          type: "value",
+          axisLabel: {
+            formatter: "{value}",
+          },
+        },
+        series: [
+          {
+            name: "鏀剁缉鍘�",
+            type: "line",
+            data: [100, 120, 130, 121, 132, 142, 119],
+            itemStyle: {
+              normal: {
+                color: "#ff7979",
+              },
+            },
+            markPoint: {
+              data: [{ type: "max", name: "鑸掑紶鍘嬮珮鍊�" }],
+            },
+            markLine: {
+              data: [{ yAxis: 140, name: "姝e父鑸掑紶鍘嬮珮鍊�" }],
+            },
+          },
+          {
+            name: "鑸掑紶鍘�",
+            type: "line",
+            data: [71, 79, 82, 85, 93, 82, 90],
+            itemStyle: {
+              normal: {
+                color: "#409eff",
+              },
+            },
+            markPoint: {
+              data: [{ name: "鍛ㄦ渶浣�", type: "min" }],
+            },
+            markLine: {
+              data: [{ yAxis: 80, name: "姝e父鑸掑紶鍘嬮珮鍊�" }],
+            },
+          },
+        ],
+      };
+      console.log("ss");
+      // 浣跨敤鍒氭寚瀹氱殑閰嶇疆椤瑰拰鏁版嵁鏄剧ず鍥捐〃銆�
+      myxyChart.setOption(option);
+    },
+    // 琛�绯栧浘琛�
+    xtechartsInit() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      // console.log(echarts);
+      console.log(this.xtechartdom);
+      var myxyChart = echarts.init(this.xtechartdom);
+      console.log(myxyChart);
+      const data = [
+        ["2000-06-05", 116],
+        ["2000-06-06", 129],
+        ["2000-06-07", 135],
+        ["2000-06-08", 86],
+        ["2000-06-09", 73],
+        ["2000-06-10", 85],
+        ["2000-06-11", 73],
+        ["2000-06-12", 68],
+        ["2000-06-13", 92],
+        ["2000-06-14", 130],
+        ["2000-06-15", 245],
+        ["2000-06-16", 139],
+        ["2000-06-17", 115],
+        ["2000-06-18", 111],
+        ["2000-06-19", 309],
+        ["2000-06-20", 206],
+        ["2000-06-21", 137],
+        ["2000-06-22", 128],
+        ["2000-06-23", 85],
+      ];
+      const dateList = data.map(function (item) {
+        return item[0];
+      });
+      const valueList = data.map(function (item) {
+        return item[1];
+      });
+      var option = {
+        title: {
+          text: "鍘嗗彶琛�绯栬褰�",
+        },
+        visualMap: [
+          {
+            show: false,
+            type: "continuous",
+            seriesIndex: 0,
+            min: 0,
+            max: 400,
+          },
+        ],
+        title: [
+          {
+            left: "center",
+            text: "琛�绯栧巻鍙茬洃娴�",
+          },
+        ],
+        tooltip: {
+          trigger: "axis",
+        },
+        xAxis: [
+          {
+            data: dateList,
+          },
+        ],
+        yAxis: [{}],
+        series: [
+          {
+            type: "line",
+            showSymbol: false,
+            data: valueList,
+          },
+        ],
+      };
+      console.log("ss");
+      // 浣跨敤鍒氭寚瀹氱殑閰嶇疆椤瑰拰鏁版嵁鏄剧ず鍥捐〃銆�
+      myxyChart.setOption(option);
+    },
+    // 浣撻噸鍥捐〃
+    tzechartsInit() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      console.log(echarts);
+      console.log(this.tzechartdom);
+      var myxyChart = echarts.init(this.tzechartdom);
+      console.log(myxyChart);
+      const data = [
+        ["2000-06-05", 116],
+        ["2000-06-06", 99],
+        ["2000-06-07", 105],
+        ["2000-06-08", 126],
+        ["2000-06-09", 73],
+        ["2000-06-10", 85],
+        ["2000-06-11", 73],
+        ["2000-06-12", 68],
+        ["2000-06-13", 92],
+        ["2000-06-14", 130],
+        ["2000-06-15", 245],
+        ["2000-06-16", 119],
+        ["2000-06-17", 115],
+        ["2000-06-18", 201],
+        ["2000-06-19", 209],
+        ["2000-06-20", 106],
+        ["2000-06-21", 137],
+        ["2000-06-22", 128],
+        ["2000-06-23", 85],
+      ];
+      const dateList = data.map(function (item) {
+        return item[0];
+      });
+      const valueList = data.map(function (item) {
+        return item[1];
+      });
+      var option = {
+        title: {
+          text: "鍘嗗彶琛�绯栬褰�",
+        },
+        toolbox: {
+          show: true,
+          feature: {
+            dataZoom: {
+              yAxisIndex: "none",
+            },
+            dataView: { readOnly: false },
+            magicType: { type: ["line", "bar"] },
+            restore: {},
+            saveAsImage: {},
+          },
+        },
+        visualMap: [
+          {
+            show: false,
+            type: "continuous",
+            seriesIndex: 0,
+            min: 0,
+            max: 400,
+          },
+        ],
+        title: [
+          {
+            left: "center",
+            text: "琛�绯栧巻鍙茬洃娴�",
+          },
+        ],
+        tooltip: {
+          trigger: "axis",
+        },
+        xAxis: [
+          {
+            data: dateList,
+          },
+        ],
+        yAxis: [{}],
+        series: [
+          {
+            type: "line",
+            showSymbol: false,
+            data: valueList,
+            lineStyle: {
+              width: 3,
+              type: "solid",
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                {
+                  offset: 0,
+                  color: "#FE7D2F",
+                },
+                {
+                  offset: 1,
+                  color: "#F9D423",
+                },
+              ]),
+            },
+          },
+        ],
+      };
+      console.log("ss");
+      // 浣跨敤鍒氭寚瀹氱殑閰嶇疆椤瑰拰鏁版嵁鏄剧ず鍥捐〃銆�
+      myxyChart.setOption(option);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.personage {
+  display: flex;
+  .text-center {
+    width: 40px;
+    height: 40px;
+    margin-right: 10px;
+    img {
+      width: 100%;
+    }
+  }
+  .information {
+    font-size: 25px;
+    .info-xx {
+      margin-top: 15px;
+      border-bottom: 2px solid rgb(65, 161, 190);
+      display: flex;
+      span {
+        margin-left: 30px;
+      }
+      .xinz-inf {
+        cursor: pointer;
+        margin-left: 20px;
+        height: 23px;
+        line-height: 23px;
+        padding: 2px;
+        align-items: center;
+        font-size: 16px;
+        color: rgb(85, 151, 250);
+        border: 1px solid #439fff;
+        border-radius: 9px;
+      }
+    }
+  }
+}
+.el-tabs--border-card {
+  font-size: 25px;
+  .mulsz {
+    font-size: 25px;
+    margin-top: 20px;
+  }
+}
+.information-content {
+  margin-top: 20px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .top-message {
+    margin-top: 25px;
+    margin-left: 100px;
+    .detailed {
+      width: 70%;
+      padding: 30px;
+      margin-bottom: 30px;
+      background-color: #ddf0f8;
+      .one-column {
+        display: flex;
+        font-size: 20px;
+        margin-bottom: 30px;
+        padding-bottom: 3px;
+        .spanvalue {
+          display: inline-block;
+          min-width: 200px;
+          border-bottom: 1px solid rgb(172, 172, 172);
+        }
+
+        div {
+          width: 330px;
+        }
+      }
+    }
+  }
+
+  .headline {
+    font-size: 25px;
+    padding-left: 5px;
+    margin-bottom: 10px;
+    border-left: 8px solid rgb(65, 161, 190);
+  }
+  .bottom-message {
+    margin-bottom: 25px;
+    margin-left: 100px;
+    .Table-screen {
+      width: 70%;
+      padding: 30px;
+      margin-bottom: 30px;
+      background-color: #ddf0f8;
+      font-size: 20px !important;
+    }
+  }
+}
+.medical-record {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.sontwoactiveName {
+  margin: 0 auto;
+}
+// .columcz {
+//   align-items: center!important;
+// }
+</style>
diff --git a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue b/src/views/patient/patient/profile/resetPwd.vue
similarity index 100%
copy from ruoyi-ui/src/views/system/user/profile/resetPwd.vue
copy to src/views/patient/patient/profile/resetPwd.vue
diff --git a/ruoyi-ui/src/views/system/user/profile/userAvatar.vue b/src/views/patient/patient/profile/userAvatar.vue
similarity index 100%
copy from ruoyi-ui/src/views/system/user/profile/userAvatar.vue
copy to src/views/patient/patient/profile/userAvatar.vue
diff --git a/ruoyi-ui/src/views/system/user/profile/userInfo.vue b/src/views/patient/patient/profile/userInfo.vue
similarity index 100%
copy from ruoyi-ui/src/views/system/user/profile/userInfo.vue
copy to src/views/patient/patient/profile/userInfo.vue
diff --git a/ruoyi-ui/src/views/redirect.vue b/src/views/redirect.vue
similarity index 100%
rename from ruoyi-ui/src/views/redirect.vue
rename to src/views/redirect.vue
diff --git a/ruoyi-ui/src/views/register.vue b/src/views/register.vue
similarity index 62%
rename from ruoyi-ui/src/views/register.vue
rename to src/views/register.vue
index 28a181a..5530e9a 100644
--- a/ruoyi-ui/src/views/register.vue
+++ b/src/views/register.vue
@@ -1,10 +1,24 @@
 <template>
   <div class="register">
-    <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
+    <el-form
+      ref="registerForm"
+      :model="registerForm"
+      :rules="registerRules"
+      class="register-form"
+    >
       <h3 class="title">鏅烘収闅忚绠$悊绯荤粺</h3>
       <el-form-item prop="username">
-        <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="璐﹀彿">
-          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
+        <el-input
+          v-model="registerForm.username"
+          type="text"
+          auto-complete="off"
+          placeholder="璐﹀彿"
+        >
+          <svg-icon
+            slot="prefix"
+            icon-class="user"
+            class="el-input__icon input-icon"
+          />
         </el-input>
       </el-form-item>
       <el-form-item prop="password">
@@ -15,7 +29,11 @@
           placeholder="瀵嗙爜"
           @keyup.enter.native="handleRegister"
         >
-          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+          <svg-icon
+            slot="prefix"
+            icon-class="password"
+            class="el-input__icon input-icon"
+          />
         </el-input>
       </el-form-item>
       <el-form-item prop="confirmPassword">
@@ -26,7 +44,11 @@
           placeholder="纭瀵嗙爜"
           @keyup.enter.native="handleRegister"
         >
-          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+          <svg-icon
+            slot="prefix"
+            icon-class="password"
+            class="el-input__icon input-icon"
+          />
         </el-input>
       </el-form-item>
       <el-form-item prop="code" v-if="captchaEnabled">
@@ -37,25 +59,31 @@
           style="width: 63%"
           @keyup.enter.native="handleRegister"
         >
-          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
+          <svg-icon
+            slot="prefix"
+            icon-class="validCode"
+            class="el-input__icon input-icon"
+          />
         </el-input>
         <div class="register-code">
-          <img :src="codeUrl" @click="getCode" class="register-code-img"/>
+          <img :src="codeUrl" @click="getCode" class="register-code-img" />
         </div>
       </el-form-item>
-      <el-form-item style="width:100%;">
+      <el-form-item style="width: 100%">
         <el-button
           :loading="loading"
           size="medium"
           type="primary"
-          style="width:100%;"
+          style="width: 100%"
           @click.native.prevent="handleRegister"
         >
           <span v-if="!loading">娉� 鍐�</span>
           <span v-else>娉� 鍐� 涓�...</span>
         </el-button>
-        <div style="float: right;">
-          <router-link class="link-type" :to="'/login'">浣跨敤宸叉湁璐︽埛鐧诲綍</router-link>
+        <div style="float: right">
+          <router-link class="link-type" :to="'/login'"
+            >浣跨敤宸叉湁璐︽埛鐧诲綍</router-link
+          >
         </div>
       </el-form-item>
     </el-form>
@@ -86,25 +114,35 @@
         password: "",
         confirmPassword: "",
         code: "",
-        uuid: ""
+        uuid: "",
       },
       registerRules: {
         username: [
           { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" },
-          { min: 2, max: 20, message: '鐢ㄦ埛璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' }
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
         ],
         password: [
           { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" },
-          { min: 5, max: 20, message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', trigger: 'blur' }
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
         ],
         confirmPassword: [
           { required: true, trigger: "blur", message: "璇峰啀娆¤緭鍏ユ偍鐨勫瘑鐮�" },
-          { required: true, validator: equalToPassword, trigger: "blur" }
+          { required: true, validator: equalToPassword, trigger: "blur" },
         ],
-        code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }]
+        code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }],
       },
       loading: false,
-      captchaEnabled: true
+      captchaEnabled: true,
     };
   },
   created() {
@@ -112,8 +150,9 @@
   },
   methods: {
     getCode() {
-      getCodeImg().then(res => {
-        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
+      getCodeImg().then((res) => {
+        this.captchaEnabled =
+          res.captchaEnabled === undefined ? true : res.captchaEnabled;
         if (this.captchaEnabled) {
           this.codeUrl = "data:image/gif;base64," + res.img;
           this.registerForm.uuid = res.uuid;
@@ -121,27 +160,37 @@
       });
     },
     handleRegister() {
-      this.$refs.registerForm.validate(valid => {
+      this.$refs.registerForm.validate((valid) => {
         if (valid) {
           this.loading = true;
-          register(this.registerForm).then(res => {
-            const username = this.registerForm.username;
-            this.$alert("<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " + username + " 娉ㄥ唽鎴愬姛锛�</font>", '绯荤粺鎻愮ず', {
-              dangerouslyUseHTMLString: true,
-              type: 'success'
-            }).then(() => {
-              this.$router.push("/login");
-            }).catch(() => {});
-          }).catch(() => {
-            this.loading = false;
-            if (this.captchaEnabled) {
-              this.getCode();
-            }
-          })
+          register(this.registerForm)
+            .then((res) => {
+              const username = this.registerForm.username;
+              this.$alert(
+                "<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " +
+                  username +
+                  " 娉ㄥ唽鎴愬姛锛�</font>",
+                "绯荤粺鎻愮ず",
+                {
+                  dangerouslyUseHTMLString: true,
+                  type: "success",
+                }
+              )
+                .then(() => {
+                  this.$router.push("/login");
+                })
+                .catch(() => {});
+            })
+            .catch(() => {
+              this.loading = false;
+              if (this.captchaEnabled) {
+                this.getCode();
+              }
+            });
         }
       });
-    }
-  }
+    },
+  },
 };
 </script>
 
diff --git a/ruoyi-ui/src/views/smartor/hecategory/index.vue b/src/views/smartor/hecategory/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/hecategory/index.vue
rename to src/views/smartor/hecategory/index.vue
diff --git a/ruoyi-ui/src/views/smartor/helibrary/index.vue b/src/views/smartor/helibrary/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/helibrary/index.vue
rename to src/views/smartor/helibrary/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrexecuteconfig/index.vue b/src/views/smartor/ivrexecuteconfig/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrexecuteconfig/index.vue
rename to src/views/smartor/ivrexecuteconfig/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrextemplate/index.vue b/src/views/smartor/ivrextemplate/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrextemplate/index.vue
rename to src/views/smartor/ivrextemplate/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrextemplatescript/index.vue b/src/views/smartor/ivrextemplatescript/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrextemplatescript/index.vue
rename to src/views/smartor/ivrextemplatescript/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrflow/index.vue b/src/views/smartor/ivrflow/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrflow/index.vue
rename to src/views/smartor/ivrflow/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrflownode/index.vue b/src/views/smartor/ivrflownode/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrflownode/index.vue
rename to src/views/smartor/ivrflownode/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrflownodebranch/index.vue b/src/views/smartor/ivrflownodebranch/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrflownodebranch/index.vue
rename to src/views/smartor/ivrflownodebranch/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrglobalconfig/index.vue b/src/views/smartor/ivrglobalconfig/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrglobalconfig/index.vue
rename to src/views/smartor/ivrglobalconfig/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrintent/index.vue b/src/views/smartor/ivrintent/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrintent/index.vue
rename to src/views/smartor/ivrintent/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrlibascript/index.vue b/src/views/smartor/ivrlibascript/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrlibascript/index.vue
rename to src/views/smartor/ivrlibascript/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrlibintent/index.vue b/src/views/smartor/ivrlibintent/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrlibintent/index.vue
rename to src/views/smartor/ivrlibintent/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrlibintentcategory/index.vue b/src/views/smartor/ivrlibintentcategory/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrlibintentcategory/index.vue
rename to src/views/smartor/ivrlibintentcategory/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrlibscript/index.vue b/src/views/smartor/ivrlibscript/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrlibscript/index.vue
rename to src/views/smartor/ivrlibscript/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrlibscriptcategory/index.vue b/src/views/smartor/ivrlibscriptcategory/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrlibscriptcategory/index.vue
rename to src/views/smartor/ivrlibscriptcategory/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrlibscriptmodel/index.vue b/src/views/smartor/ivrlibscriptmodel/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrlibscriptmodel/index.vue
rename to src/views/smartor/ivrlibscriptmodel/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrquestionlib/QuestionMaint.vue b/src/views/smartor/ivrquestionlib/QuestionMaint.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrquestionlib/QuestionMaint.vue
rename to src/views/smartor/ivrquestionlib/QuestionMaint.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrrecall/index.vue b/src/views/smartor/ivrrecall/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrrecall/index.vue
rename to src/views/smartor/ivrrecall/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrscene/index.vue b/src/views/smartor/ivrscene/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrscene/index.vue
rename to src/views/smartor/ivrscene/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrscenecategory/index.vue b/src/views/smartor/ivrscenecategory/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrscenecategory/index.vue
rename to src/views/smartor/ivrscenecategory/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrscript/index.vue b/src/views/smartor/ivrscript/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrscript/index.vue
rename to src/views/smartor/ivrscript/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrscriptmodel/index.vue b/src/views/smartor/ivrscriptmodel/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrscriptmodel/index.vue
rename to src/views/smartor/ivrscriptmodel/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrscripttarget/index.vue b/src/views/smartor/ivrscripttarget/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrscripttarget/index.vue
rename to src/views/smartor/ivrscripttarget/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtarget/index.vue b/src/views/smartor/ivrtarget/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtarget/index.vue
rename to src/views/smartor/ivrtarget/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtask/index.vue b/src/views/smartor/ivrtask/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtask/index.vue
rename to src/views/smartor/ivrtask/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtaskcall/index.vue b/src/views/smartor/ivrtaskcall/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtaskcall/index.vue
rename to src/views/smartor/ivrtaskcall/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtaskcalldetail/index.vue b/src/views/smartor/ivrtaskcalldetail/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtaskcalldetail/index.vue
rename to src/views/smartor/ivrtaskcalldetail/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtaskcallrecord/index.vue b/src/views/smartor/ivrtaskcallrecord/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtaskcallrecord/index.vue
rename to src/views/smartor/ivrtaskcallrecord/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtasksms/index.vue b/src/views/smartor/ivrtasksms/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtasksms/index.vue
rename to src/views/smartor/ivrtasksms/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtemplate/index.vue b/src/views/smartor/ivrtemplate/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtemplate/index.vue
rename to src/views/smartor/ivrtemplate/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtemplatescript/index.vue b/src/views/smartor/ivrtemplatescript/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtemplatescript/index.vue
rename to src/views/smartor/ivrtemplatescript/index.vue
diff --git a/ruoyi-ui/src/views/smartor/ivrtemplatetarget/index.vue b/src/views/smartor/ivrtemplatetarget/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/ivrtemplatetarget/index.vue
rename to src/views/smartor/ivrtemplatetarget/index.vue
diff --git a/ruoyi-ui/src/views/smartor/patarchive/index.vue b/src/views/smartor/patarchive/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/patarchive/index.vue
rename to src/views/smartor/patarchive/index.vue
diff --git a/ruoyi-ui/src/views/smartor/patarchive/index0.vue b/src/views/smartor/patarchive/index0.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/patarchive/index0.vue
rename to src/views/smartor/patarchive/index0.vue
diff --git a/ruoyi-ui/src/views/smartor/patinhosp/index.vue b/src/views/smartor/patinhosp/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/patinhosp/index.vue
rename to src/views/smartor/patinhosp/index.vue
diff --git a/ruoyi-ui/src/views/smartor/patouthosp/index.vue b/src/views/smartor/patouthosp/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/patouthosp/index.vue
rename to src/views/smartor/patouthosp/index.vue
diff --git a/ruoyi-ui/src/views/smartor/patphysical/index.vue b/src/views/smartor/patphysical/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/patphysical/index.vue
rename to src/views/smartor/patphysical/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemeautofinshrule/index.vue b/src/views/smartor/schemeautofinshrule/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemeautofinshrule/index.vue
rename to src/views/smartor/schemeautofinshrule/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemecalldetail/index.vue b/src/views/smartor/schemecalldetail/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemecalldetail/index.vue
rename to src/views/smartor/schemecalldetail/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemecategory/index.vue b/src/views/smartor/schemecategory/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemecategory/index.vue
rename to src/views/smartor/schemecategory/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemelibrary/index.vue b/src/views/smartor/schemelibrary/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemelibrary/index.vue
rename to src/views/smartor/schemelibrary/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemeplan/index.vue b/src/views/smartor/schemeplan/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemeplan/index.vue
rename to src/views/smartor/schemeplan/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemetask/index.vue b/src/views/smartor/schemetask/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemetask/index.vue
rename to src/views/smartor/schemetask/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemetaskconfig/index.vue b/src/views/smartor/schemetaskconfig/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemetaskconfig/index.vue
rename to src/views/smartor/schemetaskconfig/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemetaskrecord/index.vue b/src/views/smartor/schemetaskrecord/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemetaskrecord/index.vue
rename to src/views/smartor/schemetaskrecord/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemetaskrepeatconfig/index.vue b/src/views/smartor/schemetaskrepeatconfig/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemetaskrepeatconfig/index.vue
rename to src/views/smartor/schemetaskrepeatconfig/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemetriggerrule/index.vue b/src/views/smartor/schemetriggerrule/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemetriggerrule/index.vue
rename to src/views/smartor/schemetriggerrule/index.vue
diff --git a/ruoyi-ui/src/views/smartor/schemetriggerscene/index.vue b/src/views/smartor/schemetriggerscene/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/schemetriggerscene/index.vue
rename to src/views/smartor/schemetriggerscene/index.vue
diff --git a/ruoyi-ui/src/views/smartor/smsaccount/index.vue b/src/views/smartor/smsaccount/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/smsaccount/index.vue
rename to src/views/smartor/smsaccount/index.vue
diff --git a/ruoyi-ui/src/views/smartor/smsparam/index.vue b/src/views/smartor/smsparam/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/smsparam/index.vue
rename to src/views/smartor/smsparam/index.vue
diff --git a/ruoyi-ui/src/views/smartor/smsrecords/index.vue b/src/views/smartor/smsrecords/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/smsrecords/index.vue
rename to src/views/smartor/smsrecords/index.vue
diff --git a/ruoyi-ui/src/views/smartor/smstemplet/index.vue b/src/views/smartor/smstemplet/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/smstemplet/index.vue
rename to src/views/smartor/smstemplet/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svycategory/index.vue b/src/views/smartor/svycategory/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svycategory/index.vue
rename to src/views/smartor/svycategory/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svyexception/index.vue b/src/views/smartor/svyexception/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svyexception/index.vue
rename to src/views/smartor/svyexception/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svyfinish/index.vue b/src/views/smartor/svyfinish/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svyfinish/index.vue
rename to src/views/smartor/svyfinish/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svyfinishoption/index.vue b/src/views/smartor/svyfinishoption/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svyfinishoption/index.vue
rename to src/views/smartor/svyfinishoption/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svyfinishtopic/index.vue b/src/views/smartor/svyfinishtopic/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svyfinishtopic/index.vue
rename to src/views/smartor/svyfinishtopic/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svyresult/index.vue b/src/views/smartor/svyresult/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svyresult/index.vue
rename to src/views/smartor/svyresult/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svytitle/index.vue b/src/views/smartor/svytitle/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytitle/index.vue
rename to src/views/smartor/svytitle/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svytitle/index0.vue b/src/views/smartor/svytitle/index0.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytitle/index0.vue
rename to src/views/smartor/svytitle/index0.vue
diff --git a/ruoyi-ui/src/views/smartor/svytitle/index1.vue b/src/views/smartor/svytitle/index1.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytitle/index1.vue
rename to src/views/smartor/svytitle/index1.vue
diff --git a/ruoyi-ui/src/views/smartor/svytopic/index.vue b/src/views/smartor/svytopic/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytopic/index.vue
rename to src/views/smartor/svytopic/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svytopic/index1.vue b/src/views/smartor/svytopic/index1.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytopic/index1.vue
rename to src/views/smartor/svytopic/index1.vue
diff --git a/ruoyi-ui/src/views/smartor/svytopic/maint.vue b/src/views/smartor/svytopic/maint.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytopic/maint.vue
rename to src/views/smartor/svytopic/maint.vue
diff --git a/ruoyi-ui/src/views/smartor/svytopicoption/index.vue b/src/views/smartor/svytopicoption/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytopicoption/index.vue
rename to src/views/smartor/svytopicoption/index.vue
diff --git a/ruoyi-ui/src/views/smartor/svytopicoption/index1.vue b/src/views/smartor/svytopicoption/index1.vue
similarity index 100%
rename from ruoyi-ui/src/views/smartor/svytopicoption/index1.vue
rename to src/views/smartor/svytopicoption/index1.vue
diff --git a/ruoyi-ui/src/views/system/category/index.vue b/src/views/system/category/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/category/index.vue
rename to src/views/system/category/index.vue
diff --git a/ruoyi-ui/src/views/system/config/index.vue b/src/views/system/config/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/config/index.vue
rename to src/views/system/config/index.vue
diff --git a/ruoyi-ui/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/dept/index.vue
rename to src/views/system/dept/index.vue
diff --git a/ruoyi-ui/src/views/system/dict/data.vue b/src/views/system/dict/data.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/dict/data.vue
rename to src/views/system/dict/data.vue
diff --git a/ruoyi-ui/src/views/system/dict/index.vue b/src/views/system/dict/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/dict/index.vue
rename to src/views/system/dict/index.vue
diff --git a/src/views/system/label/index.vue b/src/views/system/label/index.vue
new file mode 100644
index 0000000..a5f3a42
--- /dev/null
+++ b/src/views/system/label/index.vue
@@ -0,0 +1,730 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">鎮h�呮爣绛剧被鍨�</div>
+        <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div>
+      </div>
+      <div class="center-ss">
+        <el-input
+          placeholder="璇疯緭鍏ュ唴瀹�"
+          v-model="sidecolumnval"
+          class="input-with-select"
+          size="medium "
+        >
+          <el-button
+            @click="sidecolumnss"
+            slot="append"
+            icon="el-icon-search"
+          ></el-button>
+        </el-input>
+      </div>
+      <div class="bottom-fl">
+        <el-tabs tab-position="right">
+          <el-tab-pane :label="`鍏ㄩ儴 (${numberlb})`"></el-tab-pane>
+          <el-tab-pane
+            class="tab-paness"
+            :key="item.name"
+            v-for="(item, index) in editableTabs"
+          >
+            <span slot="label">
+              {{
+                item.title + " (" + item.number + ")"
+              }}&nbsp&nbsp&nbsp<el-popover
+                placement="top-start"
+                width="100"
+                trigger="hover"
+              >
+                <div style="text-align: center">
+                  <el-button type="text" @click="popoveramend">淇敼</el-button
+                  ><el-button type="text" @click="deleteVisible = true"
+                    ><span style="color: rgb(173, 55, 55)"
+                      >鍒犻櫎</span
+                    ></el-button
+                  >
+                </div>
+                <i slot="reference" class="el-icon-share"></i> </el-popover
+            ></span>
+          </el-tab-pane>
+
+          <el-tab-pane :label="`鏈垎缁�(${numberlbs})`"></el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top"></div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鐢ㄦ埛鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="鏍囩鍚嶇О" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @click="resetQuery"
+                  >閲嶇疆</el-button
+                >
+              </el-form-item>
+            </el-form>
+
+            <el-row :gutter="10" class="mb8">
+              <el-col :span="1.5">
+                <el-button
+                  type="primary"
+                  plain
+                  icon="el-icon-plus"
+                  size="medium"
+                  @click="lstamendtagVisible = true"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
+              </el-col>
+
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
+              </el-col>
+
+              <!-- <el-col :span="1.5"> </el-col> -->
+            </el-row>
+            <!-- <right-toolbar
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
+          :columns="columns"
+        ></right-toolbar> -->
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              :border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                label="搴忓彿"
+                align="center"
+                key="userId"
+                prop="userId"
+              />
+              <el-table-column
+                label="鏍囩鍚嶇О"
+                align="center"
+                key="userName"
+                prop="userName"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="鏈�杩戠紪杈�"
+                align="center"
+                key="nickName"
+                prop="nickName"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="鏍囩鎻忚堪"
+                align="center"
+                key="aphonenumber"
+                prop="aphonenumber"
+                width="120"
+              />
+              <el-table-column
+                label="鐘舵��"
+                align="center"
+                key="aphonenumbers"
+                prop="aphonenumbers"
+                width="120"
+              >
+                <template slot-scope="scope">
+                  <el-switch
+                    v-model="scope.row.delivery"
+                    @change="handleStatusChange(scope.row)"
+                  ></el-switch>
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="300"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textxg"
+                      ><i class="el-icon-edit"></i>淇敼</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                    ><span class="button-textsc"
+                      ><i class="el-icon-delete"></i>鍒犻櫎</span
+                    ></el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+
+            <pagination
+              v-show="total > 0"
+              :total="total"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getList"
+            />
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+    <!-- 娣诲姞绫诲埆寮规 -->
+    <el-dialog
+      :title="amendtag ? '淇敼绫诲埆' : '鏂板绫诲埆'"
+      width="30%"
+      :visible.sync="dialogFormVisible"
+    >
+      <el-form :model="sidecolumnform">
+        <el-form-item
+          :label="amendtag ? '璇疯緭鍏ユ柊鐨勭被鍒悕绉�' : '璇疯緭鍏ョ被鍒悕绉�'"
+        >
+          <el-input
+            v-model="sidecolumnform.classesname"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 鍒犻櫎绫诲埆纭妗� -->
+    <el-dialog title="璀﹀憡" :visible.sync="deleteVisible" width="40%">
+      <div style="font-size: 20px; color: rgb(247, 76, 76)">
+        鏄惁纭鍒犻櫎鍒嗙被锛歔<span>{{ deletefenl }}</span
+        >]?
+      </div>
+      <div style="font-size: 20px">
+        姝ゆ搷浣滀細灏嗚绫诲埆涓嬫墍鏈夋ā鍧楄浆绉昏嚦[鏈垎绫籡锛屾槸鍚︾户缁垹闄ゆ鍒嗙被锛�
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="deleteVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="deleteVisible = false"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 淇敼/娣诲姞鏍囩寮规 -->
+    <el-dialog
+      :title="lstamendtag ? '淇敼鏍囩' : '鏂板鏍囩'"
+      width="30%"
+      :visible.sync="lstamendtagVisible"
+    >
+      <el-form ref="form" :model="tagform" label-width="80px">
+        <el-form-item label="鏍囩鍚嶇О">
+          <el-input v-model="tagform.name"></el-input>
+        </el-form-item>
+
+        <el-form-item label="鏄惁鍚敤">
+          <el-switch v-model="tagform.delivery"></el-switch>
+        </el-form-item>
+
+        <el-form-item label="鏍囩鎻忚堪">
+          <el-input type="textarea" v-model="tagform.desc"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="lstamendtagVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+} from "@/api/system/user";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      amendtag: false, //鏄惁淇敼绫诲埆
+      lstamendtag: false, //鏄惁淇敼鏍囩
+      scavisible: false, //鍒犻櫎寮规
+      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
+      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
+      //淇敼娣诲姞鏍囩寮规鏁版嵁
+      tagform: {
+        delivery: "",
+        name: "",
+        desc: "",
+      },
+      // 鏍囩琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userId: 1,
+          userName: "涓夊彿",
+          nickName: "1.2.4",
+          aphonenumber: "鍏宠妭鐐庣棁",
+          delivery: true,
+          aphonenumbers: "",
+          bphonenumber: "寰堟",
+          cphonenumber: "2022-12-12 ",
+        },
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      numberlb: 22,
+      numberlbs: 2,
+      sidecolumnform: {
+        classesname: "",
+      }, //娣诲姞绫诲埆琛ㄥ崟
+      dialogFormVisible: false, //娣诲姞銆佷慨鏀圭被鍒脊妗�
+      lstamendtagVisible: false, //娣诲姞銆佷慨鏀规爣绛惧脊妗�
+      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      //绫诲埆鍒楄〃
+      editableTabs: [
+        {
+          title: "楂樿鍘�",
+          number: "1",
+        },
+        {
+          title: "绯栧翱鐥�",
+          number: "2",
+        },
+        {
+          title: "楠ㄦ姌",
+          number: "2",
+        },
+        {
+          title: "蹇冭剰鐥�",
+          number: "2",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        deptId: undefined,
+        IDnumber: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+        { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+        { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+  },
+
+  methods: {
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        // this.userList = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+        console.log(this.userList);
+      });
+      //   const { rows } = await listUser();
+      //   console.log(rows);
+      //   this.list = rows;
+    },
+    // 娣诲姞绫诲埆
+    submitsidecolumn() {
+      this.dialogFormVisible = false;
+      this.tagform = {
+        delivery: "",
+        name: "",
+        desc: "",
+      };
+    },
+    // 淇敼寮规
+    popoveramend() {
+      this.amendtag = true;
+      this.dialogFormVisible = true;
+    },
+    //鎼滅储绫诲埆
+    sidecolumnss() {},
+    // 鍒囨崲鍏变韩/鏈湴
+    tophandleClick() {},
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    // 鐢ㄦ埛鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鏍囩鍚楋紵')
+        .then(function () {
+          // return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 淇敼鏍囩 */
+    handleUpdate(row) {
+      console.log(row, "淇敼鏍囩");
+      this.lstamendtagVisible = true;
+      this.lstamendtag = true;
+      this.tagform = {
+        delivery: row.delivery,
+        name: row.userName,
+        desc: row.bphonenumber,
+      };
+    },
+    // 鏌ョ湅闂嵎
+    ViewQuestionnaire() {
+      this.$router.push({
+        path: "/knowledge/questionnaire/examine/",
+        query: { id: "1" },
+      });
+    },
+
+    /** 鏇存柊/淇敼鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      console.log(row, "鍒犻櫎寮圭獥");
+      const userIds = row.userId || this.ids;
+      const aphonenumber = row.aphonenumber;
+      this.$modal
+        .confirm(
+          aphonenumber
+            ? '鏄惁纭鍒犻櫎鏍囩鍚嶇О涓�"' + aphonenumber + '"鐨勬暟鎹」锛�'
+            : "鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�"
+        )
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .sidecolumn-top {
+    display: flex;
+    justify-content: space-between;
+    .top-wj {
+      font-size: 20px;
+    }
+    .top-tj {
+      font-size: 18px;
+
+      color: rgb(0, 89, 255);
+      cursor: pointer;
+    }
+  }
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+.qrcode-dialo {
+  text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .qrcode-text {
+    font-size: 20px;
+    span {
+      margin-left: 20px;
+    }
+  }
+  .qrcode-img {
+    width: 300px;
+    height: 400px;
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  text-align: left;
+  font-size: 20px;
+}
+
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textck {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/ruoyi-ui/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/menu/index.vue
rename to src/views/system/menu/index.vue
diff --git a/ruoyi-ui/src/views/system/notice/index.vue b/src/views/system/notice/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/notice/index.vue
rename to src/views/system/notice/index.vue
diff --git a/ruoyi-ui/src/views/system/post/index.vue b/src/views/system/post/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/post/index.vue
rename to src/views/system/post/index.vue
diff --git a/ruoyi-ui/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/role/authUser.vue
rename to src/views/system/role/authUser.vue
diff --git a/ruoyi-ui/src/views/system/role/index.vue b/src/views/system/role/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/role/index.vue
rename to src/views/system/role/index.vue
diff --git a/ruoyi-ui/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/role/selectUser.vue
rename to src/views/system/role/selectUser.vue
diff --git a/ruoyi-ui/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/user/authRole.vue
rename to src/views/system/user/authRole.vue
diff --git a/ruoyi-ui/src/views/system/user/index.vue b/src/views/system/user/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/user/index.vue
rename to src/views/system/user/index.vue
diff --git a/ruoyi-ui/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/user/profile/index.vue
rename to src/views/system/user/profile/index.vue
diff --git a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/user/profile/resetPwd.vue
rename to src/views/system/user/profile/resetPwd.vue
diff --git a/ruoyi-ui/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/user/profile/userAvatar.vue
rename to src/views/system/user/profile/userAvatar.vue
diff --git a/ruoyi-ui/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue
similarity index 100%
rename from ruoyi-ui/src/views/system/user/profile/userInfo.vue
rename to src/views/system/user/profile/userInfo.vue
diff --git a/ruoyi-ui/src/views/tool/build/CodeTypeDialog.vue b/src/views/tool/build/CodeTypeDialog.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/build/CodeTypeDialog.vue
rename to src/views/tool/build/CodeTypeDialog.vue
diff --git a/ruoyi-ui/src/views/tool/build/DraggableItem.vue b/src/views/tool/build/DraggableItem.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/build/DraggableItem.vue
rename to src/views/tool/build/DraggableItem.vue
diff --git a/ruoyi-ui/src/views/tool/build/IconsDialog.vue b/src/views/tool/build/IconsDialog.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/build/IconsDialog.vue
rename to src/views/tool/build/IconsDialog.vue
diff --git a/ruoyi-ui/src/views/tool/build/RightPanel.vue b/src/views/tool/build/RightPanel.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/build/RightPanel.vue
rename to src/views/tool/build/RightPanel.vue
diff --git a/ruoyi-ui/src/views/tool/build/TreeNodeDialog.vue b/src/views/tool/build/TreeNodeDialog.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/build/TreeNodeDialog.vue
rename to src/views/tool/build/TreeNodeDialog.vue
diff --git a/ruoyi-ui/src/views/tool/build/index.vue b/src/views/tool/build/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/build/index.vue
rename to src/views/tool/build/index.vue
diff --git a/ruoyi-ui/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/gen/basicInfoForm.vue
rename to src/views/tool/gen/basicInfoForm.vue
diff --git a/ruoyi-ui/src/views/tool/gen/editTable.vue b/src/views/tool/gen/editTable.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/gen/editTable.vue
rename to src/views/tool/gen/editTable.vue
diff --git a/ruoyi-ui/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/gen/genInfoForm.vue
rename to src/views/tool/gen/genInfoForm.vue
diff --git a/ruoyi-ui/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/gen/importTable.vue
rename to src/views/tool/gen/importTable.vue
diff --git a/ruoyi-ui/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/gen/index.vue
rename to src/views/tool/gen/index.vue
diff --git a/ruoyi-ui/src/views/tool/swagger/index.vue b/src/views/tool/swagger/index.vue
similarity index 100%
rename from ruoyi-ui/src/views/tool/swagger/index.vue
rename to src/views/tool/swagger/index.vue
diff --git a/ruoyi-ui/vue.config.js b/vue.config.js
similarity index 100%
rename from ruoyi-ui/vue.config.js
rename to vue.config.js

--
Gitblit v1.9.3