| | |
| | | import request from '@/utils/request' |
| | | |
| | | export function getLawList() { |
| | | export function getLawList(params) { |
| | | return request({ |
| | | url: '/system/law/lawList', |
| | | method: 'get' |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | export function getNoticeList() { |
| | | export function getNoticeList(params) { |
| | | return request({ |
| | | url: '/system/notice/noticeList', |
| | | method: 'get' |
| | | method: 'get', |
| | | params: params |
| | | |
| | | }) |
| | | } |
| | | |
| | |
| | | type="primary" |
| | | style="width:40%;margin: 0 auto" |
| | | @click.prevent="handleRegister" |
| | | v-preReClick |
| | | > |
| | | <div v-if="state.title == '新增/注册'"> |
| | | <span v-if="!loading">注 册</span> |
| | |
| | | } |
| | | |
| | | getBusiness() |
| | | watchEffect(() => { |
| | | // 在副作用中调用 getArea() |
| | | getArea(); |
| | | }); |
| | | getArea() |
| | | // watchEffect(() => { |
| | | // // 在副作用中调用 getArea() |
| | | // getArea(); |
| | | // }); |
| | | }) |
| | | const isAbleEdit = ref(false); |
| | | const openDialog=(type, value)=>{ |
| | |
| | | // 字典标签组件 |
| | | import DictTag from '@/components/DictTag' |
| | | |
| | | import preReClick from "@/utils/preReClick"; |
| | | |
| | | import { Boot } from '@wangeditor/editor' |
| | | import attachmentModule from '@wangeditor/plugin-upload-attachment' |
| | | import loadMore from '@/utils/selectLoadMoreDirective' |
| | |
| | | app.use(store) |
| | | app.use(plugins) |
| | | app.use(elementIcons) |
| | | app.use(preReClick) |
| | | app.component('svg-icon', SvgIcon) |
| | | app.directive('loadMore',loadMore) |
| | | directive(app) |
| | |
| | | // 在免登录白名单,直接进入 |
| | | next() |
| | | } else { |
| | | next(`/homePage?redirect=${to.fullPath}`) // 否则全部重定向到登录页 |
| | | // next(`/homePage?redirect=${to.fullPath}`) // 否则全部重定向到登录页 |
| | | next('/homePage') |
| | | NProgress.done() |
| | | } |
| | | } |
对比新文件 |
| | |
| | | export default (app) => { |
| | | app.directive('preReClick', { |
| | | mounted(el, binding) { |
| | | el.addEventListener('click', () => { |
| | | if (!el.disabled) { |
| | | el.disabled = true; |
| | | setTimeout(() => { |
| | | el.disabled = false; |
| | | }, binding.value || 2000) |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | |
| | | import axios from 'axios' |
| | | import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus' |
| | | import { getToken } from '@/utils/auth' |
| | | import {getToken, removeToken} from '@/utils/auth' |
| | | import errorCode from '@/utils/errorCode' |
| | | import { tansParams, blobValidate } from '@/utils/ruoyi' |
| | | import cache from '@/plugins/cache' |
| | |
| | | isRelogin.show = true; |
| | | ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { |
| | | isRelogin.show = false; |
| | | useUserStore().logOut().then(() => { |
| | | // router.push('/homePage') |
| | | |
| | | location.href = '/homePage'; |
| | | }) |
| | | removeToken() |
| | | location.href = '/homePage'; |
| | | // useUserStore().logOut().then(() => { |
| | | // // router.push('/homePage') |
| | | // |
| | | // location.href = '/homePage'; |
| | | // }) |
| | | }).catch(() => { |
| | | isRelogin.show = false |
| | | }); |
| | |
| | | <div class="title">{{state.content.title}}</div> |
| | | <el-divider border-style="dashed"/> |
| | | <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div> |
| | | <div v-html="state.content.content" @click="showFile($event)"></div> |
| | | <div v-html="state.content.content" class="reviewTable" @click="showFile($event)"></div> |
| | | </div> |
| | | <div class="main" v-if="state.firstClass == '法律法规'"> |
| | | <div class="title">{{state.content.title}}</div> |
| | |
| | | <div class="info"><span>法律法规类别:{{state.content.lawType}}</span><span>颁布机构:{{state.content.pubAgency}}</span><span>颁布日期:{{state.content.pubDate}}</span></div> |
| | | <el-divider border-style="dashed"/> |
| | | <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div> |
| | | <div v-html="state.content.content"></div> |
| | | <div v-html="state.content.content" class="reviewTable" @click="showFile($event)"></div> |
| | | </div> |
| | | <div class="main" v-if="state.firstClass == '机构公示'"> |
| | | <div class="title">{{state.content.name}}</div> |
| | |
| | | }) |
| | | const emit = defineEmits(['backJump']) |
| | | onMounted(()=>{ |
| | | getBusiness() |
| | | // getBusiness() |
| | | }) |
| | | |
| | | onUnmounted(()=>{ |
| | |
| | | } |
| | | } |
| | | } |
| | | .reviewTable { |
| | | :deep(table){ |
| | | border: 1px solid #ccc; |
| | | text-align: center; |
| | | } |
| | | :deep(table td){ |
| | | border: 1px solid #ccc; |
| | | text-align: center; |
| | | padding: 0 5px; |
| | | } |
| | | :deep(table th){ |
| | | border: 1px solid #ccc; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <el-input v-model="state.querys.title" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-button type="primary" :icon="Search" class="searchBtn">搜索</el-button> |
| | | <el-button type="primary" :icon="Refresh" class="resetBtn">重置</el-button> |
| | | <el-button type="primary" :icon="Search" class="searchBtn" v-model="state.querys.title" @click="search">搜索</el-button> |
| | | <el-button type="primary" :icon="Refresh" class="resetBtn" @click="reset">重置</el-button> |
| | | </div> |
| | | <div class="list"> |
| | | <div v-for="item in state.dataList" @click="openDetails('法律法规',item.id)"> |
| | |
| | | </div> |
| | | <div class="pag-container" v-if="state.total&&state.total>0"> |
| | | <el-pagination |
| | | v-model:current-page="state.querys.pageNum" |
| | | v-model:page-size="state.querys.pageSize" |
| | | :page-sizes="[10,15,20,25]" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :total="state.total" |
| | |
| | | state.querys.pageNum = val |
| | | getData() |
| | | } |
| | | |
| | | const search = () => { |
| | | getData() |
| | | } |
| | | const reset = () => { |
| | | state.querys = { |
| | | title: '', |
| | | content: '', |
| | | pageNum: 1, |
| | | pageSize: 10 |
| | | } |
| | | getData() |
| | | } |
| | | const openDetails = (type,id)=>{ |
| | | emit('openDetails',type,id) |
| | | } |
| | |
| | | </div> |
| | | <div class="pag-container" v-if="state.total&&state.total>0"> |
| | | <el-pagination |
| | | v-model:current-page="state.querys.pageNum" |
| | | v-model:page-size="state.querys.pageSize" |
| | | :page-sizes="[10,15,20,25]" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :total="state.total" |
| | |
| | | </div> |
| | | <div class="pag-container" v-if="state.total&&state.total>0"> |
| | | <el-pagination |
| | | v-model:current-page="state.querys.pageNum" |
| | | v-model:page-size="state.querys.pageSize" |
| | | :page-sizes="[10,15,20,25]" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :total="state.total" |
| | |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default">确认</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default">确认</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default">确认</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | <el-date-picker |
| | | v-if="!isReview" |
| | | v-model="state.form.pubDate" |
| | | type="datetime" |
| | | value-format="YYYY-MM-DD hh:mm:ss" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | size="default" |
| | | /> |
| | | <span v-else>{{state.form.pubDate}}</span> |
| | | </el-form-item> |
| | | <el-form-item label="内容:" v-if="showEditor" prop="content"> |
| | | <el-form-item label="内容:" v-if="showEditor" required> |
| | | <we-editor ref="myEditor" :propData="state.form.content" @childFn="getEditorData" /> |
| | | </el-form-item> |
| | | <el-form-item label="内容:" v-else> |
| | | <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" > |
| | | <div class="ql-editor"> |
| | | <div v-html="state.form.content" @click="showFile($event)"></div> |
| | | <div v-html="state.form.content" class="reviewTable" @click="showFile($event)"></div> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | |
| | | <template #footer v-if="!isReview"> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default">确认发布</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认发布</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | formRules:{ |
| | | title: [{ required: true, message: '请填写标题', trigger: 'blur' }], |
| | | pubAgency: [{ required: true, message: '请填写颁布机构', trigger: 'blur' }], |
| | | content: [{ required: true, message: '请输入内容', trigger: 'change' }], |
| | | // content: [{ required: true, message: '11', trigger: 'blur' }], |
| | | pubDate:[{ required: true, message: '请选择颁布日期', trigger: 'blur' }], |
| | | }, |
| | | |
| | |
| | | if(type === 'edit') { |
| | | law.value = res.data.lawType === '法律' ? 1 : res.data.lawType === '法规' ? 2 :res.data.lawType === '地方性规定'? 3 : 4 |
| | | } |
| | | state.form.pubDate = res.data.pubDate.substring(0,10) |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | |
| | | myEditor.value.submit(); |
| | | const valid = await lawRef.value.validate(); |
| | | if(valid){ |
| | | if(state.form.content == "") { |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '请输入内容' |
| | | }); |
| | | return; |
| | | } |
| | | if(title.value === '新增'){ |
| | | const param = { |
| | | content: state.form.content, |
| | | lawType: state.form.lawType, |
| | | pubAgency: state.form.pubAgency, |
| | | pubDate: state.form.pubDate, |
| | | pubDate: state.form.pubDate.concat(" 00:00:00"), |
| | | subTitle: state.form.subTitle, |
| | | title: state.form.title |
| | | } |
| | |
| | | lawRef.value.clearValidate(); |
| | | dialogVisible.value = false; |
| | | }else if(title.value === '编辑') { |
| | | state.form.pubDate = state.form.pubDate.concat(" 00:00:00") |
| | | const res = await editLaw(state.form) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | |
| | | align-items: flex-start; |
| | | } |
| | | } |
| | | .reviewTable { |
| | | :deep(table){ |
| | | border: 1px solid #ccc; |
| | | text-align: center; |
| | | } |
| | | :deep(table td){ |
| | | border: 1px solid #ccc; |
| | | text-align: center; |
| | | padding: 0 5px; |
| | | } |
| | | :deep(table th){ |
| | | border: 1px solid #ccc; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | loading.value = true; |
| | | const res = await getLawList(data.queryParams); |
| | | if(res.code === 200){ |
| | | dataList.value = res.data.list |
| | | dataList.value = res.data.list.map(item => { |
| | | return { |
| | | ...item, |
| | | pubDate: item.pubDate.substring(0,10) |
| | | } |
| | | }) |
| | | total.value = res.data.total |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | |
| | | <el-input v-model.trim="state.noticeForm.noticeTitle" v-if="!isReview" ></el-input> |
| | | <span v-else>{{state.noticeForm.noticeTitle}}</span> |
| | | </el-form-item> |
| | | <el-form-item label="公告内容:" v-if="showEditor" prop="noticeContent"> |
| | | <el-form-item label="公告内容:" v-if="showEditor" required> |
| | | <we-editor ref="myEditor" :propData="state.noticeForm.noticeContent" @childFn="getEditorData" /> |
| | | </el-form-item> |
| | | <el-form-item label="公告内容:" v-else> |
| | | <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" > |
| | | <div class="ql-editor"> |
| | | <div v-html="state.noticeForm.noticeContent" @click="showFile($event)"></div> |
| | | <div class="reviewTable" v-html="state.noticeForm.noticeContent" @click="showFile($event)"></div> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | |
| | | <template #footer v-if="!isReview"> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default">确认发布</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认发布</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | }, |
| | | formRules:{ |
| | | noticeTitle: [{ required: true, message: '请填写公告标题', trigger: 'blur' }], |
| | | noticeContent: [{ required: true, message: '请输入公告内容', trigger: 'blur' }], |
| | | // noticeContent: [{ required: true, message: '请输入公告内容', trigger: 'blur' }], |
| | | }, |
| | | |
| | | }) |
| | |
| | | } |
| | | } |
| | | const onSubmit = async () => { |
| | | console.log("点击提交") |
| | | myEditor.value.submit(); |
| | | const valid = await noticeRef.value.validate(); |
| | | if(valid){ |
| | | if(state.noticeForm.noticeContent == "") { |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '请输入公告内容' |
| | | }); |
| | | return; |
| | | } |
| | | if(title.value === '新增'){ |
| | | const param = { |
| | | content: state.noticeForm.noticeContent, |
| | |
| | | align-items: flex-start; |
| | | } |
| | | } |
| | | .reviewTable { |
| | | :deep(table){ |
| | | border: 1px solid #ccc; |
| | | text-align: center; |
| | | } |
| | | :deep(table td){ |
| | | border: 1px solid #ccc; |
| | | text-align: center; |
| | | padding: 0 5px; |
| | | } |
| | | :deep(table th){ |
| | | border: 1px solid #ccc; |
| | | } |
| | | } |
| | | |
| | | |
| | | </style> |
| | |
| | | <el-row :gutter="22"> |
| | | <el-col :span="11"> |
| | | <el-form-item label="用户名:" prop="username" v-if="state.title !== '修改密码'"> |
| | | <el-input v-model.trim="state.form.username" ></el-input> |
| | | <el-input v-model.trim="state.form.username" :disabled="state.title === '编辑'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="11"> |
| | |
| | | <template #footer > |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default">确认</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | <el-dialog v-model="state.dialogImg"> |
| | |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import {reactive, ref, toRefs, defineEmits, onMounted} from 'vue' |
| | | import {reactive, ref, toRefs, defineEmits, onMounted, nextTick} from 'vue' |
| | | import { View } from "@element-plus/icons-vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate"; |
| | |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | superRef.value.clearValidate(); |
| | | superRef.value.resetFields(); |
| | | reset() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | superRef.value.clearValidate(); |
| | | superRef.value.resetFields(); |
| | | reset() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | |
| | | |
| | | const handleClose = () => { |
| | | superRef.value.clearValidate(); |
| | | superRef.value.resetFields() |
| | | reset() |
| | | dialogVisible.value = false; |
| | | |
| | | |
| | | } |
| | | const reset = () => { |
| | | state.form = { |
| | | id: null, |
| | | name: '', |
| | | username: '', |
| | | sex: 0, |
| | | phone: '', |
| | | agencyId: '', |
| | | socialAttach: [], |
| | | medicalAttach: [], |
| | | salaryAttach: [], |
| | | post: '', |
| | | jobTitle: '', |
| | | major: '', |
| | | expertType: 1, |
| | | password: '', |
| | | confirmPassword: '', |
| | | } |
| | | state.salaryList = []; |
| | | state.medicalList = []; |
| | | state.socialList = []; |
| | | |
| | | } |
| | | const picSize = async (rawFile) => { |
| | | if(rawFile.size / 1024 / 1024 > 5){ |
| | |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.title" |
| | | width="500px" |
| | | width="550px" |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="110px" > |
| | |
| | | <el-input v-model.trim="state.form.name" ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="用户名:" prop="username" v-if="state.title !== '修改密码'"> |
| | | <el-input v-model.trim="state.form.username" ></el-input> |
| | | <el-input v-model.trim="state.form.username" :disabled="state.title =='编辑'" ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="密码:" prop="password" v-if="state.title == '新增' || state.title == '修改密码'"> |
| | | <el-input v-model.trim="state.form.password" type="password" show-password placeholder="请输入密码"></el-input> |
| | |
| | | <template #footer > |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default">确认</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import {reactive, ref, toRefs, defineEmits} from 'vue' |
| | | import {reactive, ref, toRefs, defineEmits, nextTick} from 'vue' |
| | | import { View } from "@element-plus/icons-vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate"; |
| | |
| | | getArea() |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ; |
| | | if(type === 'edit') { |
| | | for(let i in state.form){ |
| | | if(validKey(i,value)){ |
| | | state.form[i] = value[i] |
| | | } |
| | | } |
| | | nextTick(() => { |
| | | for(let i in state.form){ |
| | | if(validKey(i,value)){ |
| | | state.form[i] = value[i] |
| | | } |
| | | } |
| | | }) |
| | | |
| | | } |
| | | if(type == 'pwd'){ |
| | | state.form.id = value.id |