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

public/html/ie.html
public/index.html
public/robots.txt
ruoyi-ui/src/components/Breadcrumb/index.vue
ÎļþÒÑɾ³ý
ruoyi-ui/src/components/IconSelect/index.vue
ÎļþÒÑɾ³ý
ruoyi-ui/src/components/SizeSelect/index.vue
ÎļþÒÑɾ³ý
ruoyi-ui/src/components/SvgIcon/index.vue
ÎļþÒÑɾ³ý
ruoyi-ui/src/layout/components/Settings/index.vue
ÎļþÒÑɾ³ý
ruoyi-ui/src/layout/components/Sidebar/Logo.vue
ÎļþÒÑɾ³ý
ruoyi-ui/src/layout/components/Sidebar/index.vue
ÎļþÒÑɾ³ý
src/App.vue
src/api/knowledge/education.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
import request from '@/utils/request'
import { parseStrEmpty } from "@/utils/ruoyi";//处理字符串,und,null转换为'';
// ä¿®æ”¹å®£æ•™åˆ†ç±»
export function amendtag(data) {
  return request({
    url: '/smartor/hecategory',
    method: 'put',
    data: data
  })
};
// æ–°å¢žå®£æ•™åˆ†ç±»
export function addapitag(data) {
    return request({
      url: '/smartor/hecategory',
      method: 'post',
      data: data
    })
  };
/**
 *
 * @param {标签id} userId
 * èŽ·å–å®£æ•™è¯¦æƒ…
 * @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
    })
  };
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
  })
};
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
  })
};
src/api/login.js
src/api/menu.js
src/api/monitor/cache.js
src/api/monitor/job.js
src/api/monitor/jobLog.js
src/api/monitor/logininfor.js
src/api/monitor/online.js
src/api/monitor/operlog.js
src/api/monitor/server.js
src/api/patient/homepage.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
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
  })
};
// ç”¨æˆ·ä¿¡æ¯æŸ¥è¯¢æ‚£è€…列表
export function messagelistpatient(data) {
  return request({
    url: '/smartor/patarchive/patInfoByContion',
    method: 'post',
    data: data
  })
};
// æ ‡ç­¾æŸ¥è¯¢æ‚£è€…列表
export function taglistpatient(data) {
  return request({
    url: '/smartor/patarchive/patTagByContion',
    method: 'post',
    data: data
  })
};
// ä¿®æ”¹æ‚£è€…档案
export function alterpatient(data) {
  return request({
    url: '/smartor/patarchive',
    method: 'put',
    data: data
  })
};
// æ–°å¢žæ‚£è€…
export function addpatient(data) {
  return request({
    url: '/smartor/patarchive',
    method: 'post',
    data: data
  })
};
// æ‚£è€…详情
export function particularpatient(userId) {
  return request({
    url: '/smartor/patarchive/' + userId,
    method: 'get',
  })
};
// åˆ é™¤æ‚£è€…列表
export function deletepatient(userId) {
  return request({
    url: '/smartor/patarchive/' + userId,
    method: 'delete',
  })
};
// å¯¼å‡ºæ‚£è€…错误信息
export function Exporterrorpatient(userId) {
  return request({
    url: '/smartor/patarchive/patTagByContion/'+userId,
    method: 'get',
  })
};
// å¯¼å…¥æ‚£è€…文件处理
export function toleadpatient(userId) {
  return request({
    url: '/smartor/patarchive/patTagByContion/'+userId,
    method: 'get',
  })
};
src/api/smartor/hecategory.js
src/api/smartor/helibrary.js
src/api/smartor/ivrexecuteconfig.js
src/api/smartor/ivrextemplate.js
src/api/smartor/ivrextemplatescript.js
src/api/smartor/ivrflow.js
src/api/smartor/ivrflownode.js
src/api/smartor/ivrflownodebranch.js
src/api/smartor/ivrglobalconfig.js
src/api/smartor/ivrintent.js
src/api/smartor/ivrlibascript.js
src/api/smartor/ivrlibintent.js
src/api/smartor/ivrlibintentcategory.js
src/api/smartor/ivrlibscript.js
src/api/smartor/ivrlibscriptcategory.js
src/api/smartor/ivrlibscriptmodel.js
src/api/smartor/ivrrecall.js
src/api/smartor/ivrscene.js
src/api/smartor/ivrscenecategory.js
src/api/smartor/ivrscript.js
src/api/smartor/ivrscriptmodel.js
src/api/smartor/ivrscripttarget.js
src/api/smartor/ivrtarget.js
src/api/smartor/ivrtask.js
src/api/smartor/ivrtaskcall.js
src/api/smartor/ivrtaskcalldetail.js
src/api/smartor/ivrtaskcallrecord.js
src/api/smartor/ivrtasksms.js
src/api/smartor/ivrtemplate.js
src/api/smartor/ivrtemplatescript.js
src/api/smartor/ivrtemplatetarget.js
src/api/smartor/patarchive.js
src/api/smartor/patinhosp.js
src/api/smartor/patouthosp.js
src/api/smartor/patphysical.js
src/api/smartor/schemeautofinshrule.js
src/api/smartor/schemecalldetail.js
src/api/smartor/schemecategory.js
src/api/smartor/schemelibrary.js
src/api/smartor/schemeplan.js
src/api/smartor/schemetask.js
src/api/smartor/schemetaskconfig.js
src/api/smartor/schemetaskrecord.js
src/api/smartor/schemetaskrepeatconfig.js
src/api/smartor/schemetriggerrule.js
src/api/smartor/schemetriggerscene.js
src/api/smartor/smsaccount.js
src/api/smartor/smsparam.js
src/api/smartor/smsrecords.js
src/api/smartor/smstemplet.js
src/api/smartor/svycategory.js
src/api/smartor/svyexception.js
src/api/smartor/svyfinish.js
src/api/smartor/svyfinishoption.js
src/api/smartor/svyfinishtopic.js
src/api/smartor/svyresult.js
src/api/smartor/svytitle.js
src/api/smartor/svytopic.js
src/api/smartor/svytopicoption.js
src/api/system/category.js
src/api/system/config.js
src/api/system/dept.js
src/api/system/dict/data.js
src/api/system/dict/type.js
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
    })
  };
src/api/system/menu.js
src/api/system/notice.js
src/api/system/post.js
src/api/system/role.js
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'
  })
}
src/api/system/user.js
ÎļþÃû´Ó ruoyi-ui/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) {
src/api/tool/gen.js
src/assets/401_images/401.gif

src/assets/404_images/404.png

src/assets/404_images/404_cloud.png

src/assets/common/head.jpg
src/assets/common/leftnavBg.png
src/assets/icons/index.js
src/assets/icons/svg/404.svg
src/assets/icons/svg/bug.svg
src/assets/icons/svg/build.svg
src/assets/icons/svg/button.svg
src/assets/icons/svg/cascader.svg
src/assets/icons/svg/chart.svg
src/assets/icons/svg/checkbox.svg
src/assets/icons/svg/clipboard.svg
src/assets/icons/svg/code.svg
src/assets/icons/svg/color.svg
src/assets/icons/svg/component.svg
src/assets/icons/svg/dashboard.svg
src/assets/icons/svg/date-range.svg
src/assets/icons/svg/date.svg
src/assets/icons/svg/dict.svg
src/assets/icons/svg/documentation.svg
src/assets/icons/svg/download.svg
src/assets/icons/svg/drag.svg
src/assets/icons/svg/druid.svg
src/assets/icons/svg/edit.svg
src/assets/icons/svg/education.svg
src/assets/icons/svg/email.svg
src/assets/icons/svg/example.svg
src/assets/icons/svg/excel.svg
src/assets/icons/svg/exit-fullscreen.svg
src/assets/icons/svg/eye-open.svg
src/assets/icons/svg/eye.svg
src/assets/icons/svg/form.svg
src/assets/icons/svg/fullscreen.svg
src/assets/icons/svg/github.svg
src/assets/icons/svg/guide.svg
src/assets/icons/svg/icon.svg
src/assets/icons/svg/input.svg
src/assets/icons/svg/international.svg
src/assets/icons/svg/job.svg
src/assets/icons/svg/language.svg
src/assets/icons/svg/link.svg
src/assets/icons/svg/list.svg
src/assets/icons/svg/lock.svg
src/assets/icons/svg/log.svg
src/assets/icons/svg/logininfor.svg
src/assets/icons/svg/message.svg
src/assets/icons/svg/money.svg
src/assets/icons/svg/monitor.svg
src/assets/icons/svg/nested.svg
src/assets/icons/svg/number.svg
src/assets/icons/svg/online.svg
src/assets/icons/svg/password.svg
src/assets/icons/svg/pdf.svg
src/assets/icons/svg/people.svg
src/assets/icons/svg/peoples.svg
src/assets/icons/svg/phone.svg
src/assets/icons/svg/post.svg
src/assets/icons/svg/qq.svg
src/assets/icons/svg/question.svg
src/assets/icons/svg/radio.svg
src/assets/icons/svg/rate.svg
src/assets/icons/svg/redis-list.svg
src/assets/icons/svg/redis.svg
src/assets/icons/svg/row.svg
src/assets/icons/svg/search.svg
src/assets/icons/svg/select.svg
src/assets/icons/svg/server.svg
src/assets/icons/svg/shopping.svg
src/assets/icons/svg/size.svg
src/assets/icons/svg/skill.svg
src/assets/icons/svg/slider.svg
src/assets/icons/svg/star.svg
src/assets/icons/svg/swagger.svg
src/assets/icons/svg/switch.svg
src/assets/icons/svg/system.svg
src/assets/icons/svg/tab.svg
src/assets/icons/svg/table.svg
src/assets/icons/svg/textarea.svg
src/assets/icons/svg/theme.svg
src/assets/icons/svg/time-range.svg
src/assets/icons/svg/time.svg
src/assets/icons/svg/tool.svg
src/assets/icons/svg/tree-table.svg
src/assets/icons/svg/tree.svg
src/assets/icons/svg/upload.svg
src/assets/icons/svg/user.svg
src/assets/icons/svg/validCode.svg
src/assets/icons/svg/wechat.svg
src/assets/icons/svg/zip.svg
src/assets/icons/svgo.yml
src/assets/images/dark.svg
src/assets/images/light.svg
src/assets/images/login-background.jpg

src/assets/images/profile.jpg

src/assets/logo/logo.png

src/assets/styles/btn.scss
src/assets/styles/element-ui.scss
src/assets/styles/element-variables.scss
ÎļþÃû´Ó ruoyi-ui/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;
src/assets/styles/index.scss
src/assets/styles/mixin.scss
src/assets/styles/ruoyi.scss
src/assets/styles/sidebar.scss
ÎļþÃû´Ó ruoyi-ui/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);
      }
    }
src/assets/styles/transition.scss
src/assets/styles/variables.scss
ÎļþÃû´Ó ruoyi-ui/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;
// è‡ªå®šä¹‰æš—色菜单风格
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>
src/components/Crontab/day.vue
src/components/Crontab/hour.vue
src/components/Crontab/index.vue
src/components/Crontab/min.vue
src/components/Crontab/month.vue
src/components/Crontab/result.vue
src/components/Crontab/second.vue
src/components/Crontab/week.vue
src/components/Crontab/year.vue
src/components/DictData/index.js
src/components/DictTag/index.vue
ÎļþÃû´Ó ruoyi-ui/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>
</style>
src/components/Editor/index.vue
ÎļþÃû´Ó ruoyi-ui/src/components/Editor/index.vue ÐÞ¸Ä
@@ -1,3 +1,4 @@
<!-- ä¸Šä¼ å›¾ç‰‡s -->
<template>
  <div>
    <el-upload
src/components/FileUpload/index.vue
ÎļþÃû´Ó ruoyi-ui/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>
src/components/Hamburger/index.vue
ÎļþÃû´Ó ruoyi-ui/src/components/Hamburger/index.vue ÐÞ¸Ä
@@ -1,3 +1,4 @@
<!-- svg图标封装 -->
<template>
  <div style="padding: 0 15px;" @click="toggleClick">
    <svg
src/components/HeaderSearch/index.vue
ÎļþÃû´Ó ruoyi-ui/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" />
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>
src/components/IconSelect/requireIcons.js
src/components/ImagePreview/index.vue
ÎļþÃû´Ó ruoyi-ui/src/components/ImagePreview/index.vue ÐÞ¸Ä
@@ -1,3 +1,4 @@
<!-- image图片容器封装 -->
<template>
  <el-image
    :src="`${realSrc}`"
src/components/ImageUpload/index.vue
ÎļþÃû´Ó ruoyi-ui/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>
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>
src/components/Pagination/index.vue
ÎļþÃû´Ó ruoyi-ui/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 {
src/components/PanThumb/index.vue
ÎļþÃû´Ó ruoyi-ui/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">
src/components/ParentView/index.vue
src/components/RightPanel/index.vue
src/components/RightToolbar/index.vue
ÎļþÃû´Ó ruoyi-ui/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;default:默认值,
    },
    columns: {
      type: Array,
@@ -58,7 +86,7 @@
        ret.marginRight = `${this.gutter / 2}px`;
      }
      return ret;
    }
    },
  },
  created() {
    // æ˜¾éšåˆ—初始默认隐藏列
src/components/RuoYi/Doc/index.vue
src/components/RuoYi/Git/index.vue
src/components/Screenfull/index.vue
ÎļþÃû´Ó ruoyi-ui/src/components/Screenfull/index.vue ÐÞ¸Ä
@@ -1,3 +1,4 @@
<!-- å›¾æ ‡ç‚¹å‡»æ”¾å¤§ -->
<template>
  <div>
    <svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" @click="click" />
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>
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>
src/components/ThemePicker/index.vue
ÎļþÃû´Ó ruoyi-ui/src/components/ThemePicker/index.vue ÐÞ¸Ä
@@ -1,3 +1,4 @@
<!-- é¢œè‰²é€‰æ‹©å™¨ -->
<template>
  <el-color-picker
    v-model="theme"
src/components/TopNav/index.vue
ÎļþÃû´Ó ruoyi-ui/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):// è·¯å¾„新窗口打开
        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;
}
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>
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>
src/components/iFrame/index.vue
ÎļþÃû´Ó ruoyi-ui/src/components/iFrame/index.vue ÐÞ¸Ä
@@ -1,3 +1,4 @@
<!-- é¡µé¢å†…嵌入封装 -->
<template>
  <div v-loading="loading" :style="'height:' + height">
    <iframe
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)
        })
    }
}
src/constant/employees.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,429 @@
// å‘˜å·¥
export default {
  // è˜ç”¨å½¢å¼
  hireType: [
    {
      id: 1,
      value: '正式'
    },
    {
      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: '校园宣讲'
    },
    {
      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"
}
}
src/directive/dialog/drag.js
src/directive/dialog/dragHeight.js
src/directive/dialog/dragWidth.js
src/directive/index.js
src/directive/module/clipboard.js
src/directive/permission/hasPermi.js
src/directive/permission/hasRole.js
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 = {}
src/filters/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
import dayjs from 'dayjs';
// è¿‡æ»¤å™¨
export const formatTime=(val)=>{
    return dayjs(val).format('YYYY-MM-DD')
  }
src/layout/components/AppMain.vue
src/layout/components/IframeToggle/index.vue
src/layout/components/InnerLink/index.vue
src/layout/components/Navbar.vue
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("正在保存到本地,请稍候...");
      //存储本地数据
      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("正在清除设置缓存并刷新,请稍候...");
      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>
src/layout/components/Sidebar/FixiOSBug.js
src/layout/components/Sidebar/Item.vue
src/layout/components/Sidebar/Link.vue
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>
src/layout/components/Sidebar/SidebarItem.vue
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>
src/layout/components/TagsView/ScrollPane.vue
src/layout/components/TagsView/index.vue
src/layout/components/index.js
src/layout/index.vue
src/layout/mixin/ResizeHandler.js
src/main.js
ÎļþÃû´Ó ruoyi-ui/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
src/permission.js
src/plugins/auth.js
src/plugins/cache.js
src/plugins/download.js
src/plugins/index.js
src/plugins/modal.js
src/plugins/tab.js
src/router/index.js
src/settings.js
src/smartor/components/dataview/xformview/xformview.vue
src/smartor/components/dataview/xgridview/xgridview.vue
src/smartor/dataobject/dw_patarchive_base.vue
src/smartor/dataobject/dw_patarchive_list.vue
src/smartor/dataobject/dw_patinhosp_base.vue
src/smartor/dataobject/dw_patinhosp_list.vue
src/smartor/dataobject/dw_patouthosp_base.vue
src/smartor/dataobject/dw_patouthosp_list.vue
src/smartor/dataobject/dw_svytopic_maint.vue
src/smartor/dataobject/dw_svytopic_view.vue
src/smartor/dataobject/dw_svytopicoption_list.vue
src/smartor/dataobject/dw_svytopicoption_maint.vue
src/store/getters.js
src/store/index.js
src/store/modules/app.js
src/store/modules/dict.js
src/store/modules/permission.js
src/store/modules/settings.js
ÎļþÃû´Ó ruoyi-ui/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,
src/store/modules/tagsView.js
src/store/modules/user.js
src/utils/auth.js
src/utils/dict/Dict.js
src/utils/dict/DictConverter.js
src/utils/dict/DictData.js
src/utils/dict/DictMeta.js
src/utils/dict/DictOptions.js
src/utils/dict/index.js
src/utils/errorCode.js
src/utils/generator/config.js
src/utils/generator/css.js
src/utils/generator/drawingDefault.js
src/utils/generator/html.js
src/utils/generator/icon.json
src/utils/generator/js.js
src/utils/generator/render.js
src/utils/index.js
src/utils/jsencrypt.js
src/utils/permission.js
src/utils/request.js
src/utils/ruoyi.js
src/utils/scroll-to.js
src/utils/validate.js
src/views/components/icons/element-icons.js
src/views/components/icons/index.vue
src/views/components/icons/svg-icons.js
src/views/dashboard/BarChart.vue
src/views/dashboard/LineChart.vue
src/views/dashboard/PanelGroup.vue
src/views/dashboard/PieChart.vue
src/views/dashboard/RaddarChart.vue
src/views/dashboard/mixins/resize.js
src/views/error/401.vue
src/views/error/404.vue
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;
    },
    // è§£æžæˆåŠŸåŽè§¦å‘
    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>
src/views/index.vue
src/views/index_v1.vue
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="宣教内容"></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="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="宣教分类" 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>
      <!-- å®£æ•™å†…容 -->
      <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="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: "疾病宣教",
        },
        {
          value: "选项2",
          label: "入院宣教",
        },
        {
          value: "选项3",
          label: "手术宣教",
        },
        {
          value: "选项4",
          label: "护理宣教",
        },
      ],
      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: "二号宣教",
        },
        {
          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>
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>
              å®£æ•™åç§°ï¼š{{ basicInformation.wname
              }}<span>适用疾病:{{ basicInformation.jbname }}</span>
            </div>
            <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>
          <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>
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">宣教类型</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="sickness">
                <el-cascader
                  v-model="queryParams.sickness"
                  :options="optionss"
                  :props="propss"
                  clearable
                ></el-cascader>
              </el-form-item>
              <el-form-item label="宣教形式" 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="宣教分类" 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="宣教名称"
                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="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="患者标签">
                  <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: "三号宣教",
          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: "宣教分类一",
          number: "1",
        },
        {
          title: "宣教分类二",
          number: "2",
        },
        {
          title: "宣教分类三",
          number: "2",
        },
        {
          title: "宣教分类四",
          number: "2",
        },
        {
          title: "宣教分类五",
          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" },
      });
    },
    // æŸ¥çœ‹å®£æ•™
    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>
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="患者标签" 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="患者标签"
            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="患者标签">
              <!-- <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>仅允许导入xls、xlsx格式文件。</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="患者标签"> </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>导入患者成功!</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, //导入患者数量
      // æŸ¥è¯¢å‚æ•°
      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 = "新增患者";
        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>
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>
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>
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="患者标签">
                  <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>
src/views/login.vue
ÎļþÃû´Ó ruoyi-ui/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>
src/views/monitor/cache/index.vue
src/views/monitor/cache/list.vue
src/views/monitor/druid/index.vue
src/views/monitor/job/index.vue
ÎļþÃû´Ó ruoyi-ui/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 },
src/views/monitor/job/log.vue
src/views/monitor/logininfor/index.vue
src/views/monitor/online/index.vue
src/views/monitor/operlog/index.vue
src/views/monitor/server/index.vue
src/views/patient/patient/authRole.vue
copy from ruoyi-ui/src/views/system/user/authRole.vue copy to src/views/patient/patient/authRole.vue
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="患者标签" 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="患者标签"
            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="患者标签">
              <!-- <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>仅允许导入xls、xlsx格式文件。</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="患者标签"> </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>导入患者成功!</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, //导入患者数量
      // æŸ¥è¯¢å‚æ•°
      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: {
    /** æŸ¥è¯¢æ‚£è€…列表 */
    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 = "新增患者";
        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>
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> å¥åº·æ¡£æ¡ˆ</span
            >
            åŸºæœ¬ä¿¡æ¯
          </el-tab-pane>
          <el-tab-pane name="medical">
            <span class="mulsz" slot="label"
              ><i class="el-icon-s-management"></i> åŒ»ç–—档案</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>
    <!-- å¥åº·æ¡£æ¡ˆæ¨¡å— -->
    <div class="information-content" v-if="activeName == 'health'">
      <div class="top-message">
        <div class="headline">基础信息</div>
        <div class="detailed">
          <div class="one-column">
            <div>患者姓名:<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>
    <!-- åŒ»ç–—档案 -->
    <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", //医疗档案导航
      // æŸ¥è¯¢å‚æ•°
      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: "正常舒张压高值" }],
            },
          },
          {
            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: "正常舒张压高值" }],
            },
          },
        ],
      };
      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>
src/views/patient/patient/profile/resetPwd.vue
copy from ruoyi-ui/src/views/system/user/profile/resetPwd.vue copy to src/views/patient/patient/profile/resetPwd.vue
src/views/patient/patient/profile/userAvatar.vue
copy from ruoyi-ui/src/views/system/user/profile/userAvatar.vue copy to src/views/patient/patient/profile/userAvatar.vue
src/views/patient/patient/profile/userInfo.vue
copy from ruoyi-ui/src/views/system/user/profile/userInfo.vue copy to src/views/patient/patient/profile/userInfo.vue
src/views/redirect.vue
src/views/register.vue
ÎļþÃû´Ó ruoyi-ui/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>
src/views/smartor/hecategory/index.vue
src/views/smartor/helibrary/index.vue
src/views/smartor/ivrexecuteconfig/index.vue
src/views/smartor/ivrextemplate/index.vue
src/views/smartor/ivrextemplatescript/index.vue
src/views/smartor/ivrflow/index.vue
src/views/smartor/ivrflownode/index.vue
src/views/smartor/ivrflownodebranch/index.vue
src/views/smartor/ivrglobalconfig/index.vue
src/views/smartor/ivrintent/index.vue
src/views/smartor/ivrlibascript/index.vue
src/views/smartor/ivrlibintent/index.vue
src/views/smartor/ivrlibintentcategory/index.vue
src/views/smartor/ivrlibscript/index.vue
src/views/smartor/ivrlibscriptcategory/index.vue
src/views/smartor/ivrlibscriptmodel/index.vue
src/views/smartor/ivrquestionlib/QuestionMaint.vue
src/views/smartor/ivrrecall/index.vue
src/views/smartor/ivrscene/index.vue
src/views/smartor/ivrscenecategory/index.vue
src/views/smartor/ivrscript/index.vue
src/views/smartor/ivrscriptmodel/index.vue
src/views/smartor/ivrscripttarget/index.vue
src/views/smartor/ivrtarget/index.vue
src/views/smartor/ivrtask/index.vue
src/views/smartor/ivrtaskcall/index.vue
src/views/smartor/ivrtaskcalldetail/index.vue
src/views/smartor/ivrtaskcallrecord/index.vue
src/views/smartor/ivrtasksms/index.vue
src/views/smartor/ivrtemplate/index.vue
src/views/smartor/ivrtemplatescript/index.vue
src/views/smartor/ivrtemplatetarget/index.vue
src/views/smartor/patarchive/index.vue
src/views/smartor/patarchive/index0.vue
src/views/smartor/patinhosp/index.vue
src/views/smartor/patouthosp/index.vue
src/views/smartor/patphysical/index.vue
src/views/smartor/schemeautofinshrule/index.vue
src/views/smartor/schemecalldetail/index.vue
src/views/smartor/schemecategory/index.vue
src/views/smartor/schemelibrary/index.vue
src/views/smartor/schemeplan/index.vue
src/views/smartor/schemetask/index.vue
src/views/smartor/schemetaskconfig/index.vue
src/views/smartor/schemetaskrecord/index.vue
src/views/smartor/schemetaskrepeatconfig/index.vue
src/views/smartor/schemetriggerrule/index.vue
src/views/smartor/schemetriggerscene/index.vue
src/views/smartor/smsaccount/index.vue
src/views/smartor/smsparam/index.vue
src/views/smartor/smsrecords/index.vue
src/views/smartor/smstemplet/index.vue
src/views/smartor/svycategory/index.vue
src/views/smartor/svyexception/index.vue
src/views/smartor/svyfinish/index.vue
src/views/smartor/svyfinishoption/index.vue
src/views/smartor/svyfinishtopic/index.vue
src/views/smartor/svyresult/index.vue
src/views/smartor/svytitle/index.vue
src/views/smartor/svytitle/index0.vue
src/views/smartor/svytitle/index1.vue
src/views/smartor/svytopic/index.vue
src/views/smartor/svytopic/index1.vue
src/views/smartor/svytopic/maint.vue
src/views/smartor/svytopicoption/index.vue
src/views/smartor/svytopicoption/index1.vue
src/views/system/category/index.vue
src/views/system/config/index.vue
src/views/system/dept/index.vue
src/views/system/dict/data.vue
src/views/system/dict/index.vue
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">患者标签类型</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>
src/views/system/menu/index.vue
src/views/system/notice/index.vue
src/views/system/post/index.vue
src/views/system/role/authUser.vue
src/views/system/role/index.vue
src/views/system/role/selectUser.vue
src/views/system/user/authRole.vue
src/views/system/user/index.vue
src/views/system/user/profile/index.vue
src/views/system/user/profile/resetPwd.vue
src/views/system/user/profile/userAvatar.vue
src/views/system/user/profile/userInfo.vue
src/views/tool/build/CodeTypeDialog.vue
src/views/tool/build/DraggableItem.vue
src/views/tool/build/IconsDialog.vue
src/views/tool/build/RightPanel.vue
src/views/tool/build/TreeNodeDialog.vue
src/views/tool/build/index.vue
src/views/tool/gen/basicInfoForm.vue
src/views/tool/gen/editTable.vue
src/views/tool/gen/genInfoForm.vue
src/views/tool/gen/importTable.vue
src/views/tool/gen/index.vue
src/views/tool/swagger/index.vue
vue.config.js