feat(user): 添加用户类型权限控制并优化界面显示

- 在 store 中添加 userType 字段,用于存储用户类型
- 在各个页面中根据用户类型显示不同内容和功能
- 优化首页布局,增加企业管理员和检查员的专属功能
- 调整检查历史和复查历史的显示逻辑
- 修复 AI 问答中添加按钮的显示问题
- 优化重新添加安全检查中的文本域样式
master
Tuzki 2 months ago
parent 74ffd6ec65
commit 5c835806f6
  1. 6
      pageIndex/addSafeCheck/readdSafeCheck.vue
  2. 4
      pageIndex/aiAsk/aiAsk.vue
  3. 9
      pageIndex/checkHsitory/checkHsitory.vue
  4. 5
      pageIndex/checkHsitory/recheckHsitory.vue
  5. 71
      pages/index.vue
  6. 5
      pages/mine/index.vue
  7. 3
      store/getters.js
  8. 10
      store/modules/user.js
  9. 3
      utils/constant.js
  10. 2
      utils/storage.js

@ -74,12 +74,12 @@
</view>
<view class="form-item">
<text class="label">整改依据</text>
<uni-easyinput :disabled="disabled" type="textarea" class="input" autoHeight
<uni-easyinput fontSize="32" :disabled="disabled" type="textarea" class="input" autoHeight
v-model="item.rectificationBasis" placeholder="请输入整改依据"></uni-easyinput>
</view>
<view class="form-item">
<text class="label">整改建议</text>
<uni-easyinput :disabled="disabled" type="textarea" class="input" autoHeight
<uni-easyinput fontSize="32" :disabled="disabled" type="textarea" class="input" autoHeight
v-model="item.rectificationSuggestion" placeholder="请输入整改建议"></uni-easyinput>
</view>
<view class="form-item">
@ -100,7 +100,7 @@
</view>
<view class="form-item">
<text class="label">备注</text>
<uni-easyinput :disabled="disabled" type="textarea" class="textarea" autoHeight
<uni-easyinput fontSize="32" :disabled="disabled" type="textarea" class="textarea" autoHeight
v-model="item.remark" placeholder="请输入备注"></uni-easyinput>
</view>

@ -21,7 +21,7 @@
<view :class="['msg', msg.role]" v-if="msg.role === 'user'">{{ msg.content }}</view>
<view :class="['msg', msg.role]" v-else v-html="parseMarkdown(msg.content)"></view>
<!-- 添加按钮仅对 AI 回答显示 -->
<view v-if="msg.role === 'assistant'" class="add-btn-box">
<view v-if="msg.role === 'assistant'&&userType == 1||msg.role === 'assistant'&&userType == 2" class="add-btn-box">
<button v-if="!streaming" class="add-btn" @click="toggleAnswer(msg.content, idx)"
:class="{ 'added': selectedAnswerIds.has(idx) }">
<!-- <span class="iconfont" :class="selectedAnswerIds.has(index) ? 'icon-jian' : 'icon-jia'"></span> -->
@ -64,6 +64,7 @@
import { marked } from 'marked';
import * as Api from '@/api/index/index'
import * as TextEncoding from "text-encoding-shim";
import store from '@/store'
let buffer = ''; //
let encoder = new TextEncoding.TextDecoder("utf-8");//
@ -81,6 +82,7 @@ export default {
streamingContent: '',
scrollIntoViewId: '',
autoScroll: true,
userType: this.$store.state.user.userType,
tools: [
{ label: '客流分析', value: 'suggest', icon: '/static/icon_passenger-flow.svg', text: '景区舒适度实时知晓' },
{ label: '智能助手', value: 'assistant', icon: '/static/icon_assistant.svg', text: '行程规划与导览' },

@ -71,10 +71,10 @@
</view>
</view>
<view class="list-item-feet border-top">
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status==1" @click="viewDetails(item,false)">修改</view>
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status==1&&userType == 1||item.status==1&&userType == 2" @click="viewDetails(item,false)">修改</view>
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status==1" @click="signIng(item)">签字</view>
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status!=1" @click="goReport(item)">查看报告</view>
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status==2" @click="viewDetails(item,true,'1')">复查</view>
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status==2&&userType == 1||item.status==2&&userType == 2" @click="viewDetails(item,true,'1')">复查</view>
<view class="list-btn ani" hover-class="isHoverIng" @click="viewDetails(item,true)">查看详情</view>
</view>
</view>
@ -106,7 +106,7 @@
</view>
<text>检查人与企业签字</text>
</view> -->
<view class="sign-item" @click="open(1)">
<view class="sign-item" @click="open(1)" v-if="userType == 1||userType == 2">
<view class="sign-item-icon">
<!-- <image src="https://mp-df79fe8b-b924-41b0-bcb1-960be6b4a619.cdn.bspapp.com/images/common/m@2x.png"> -->
<image src="https://i.postimg.cc/bJK1f6rb/m-2x.png">
@ -115,7 +115,7 @@
</view>
<text>检查人签字</text>
</view>
<view class="sign-item" @click="open(2)">
<view class="sign-item" @click="open(2)" v-if="userType == 0">
<view class="sign-item-icon">
<!-- <image src="https://mp-df79fe8b-b924-41b0-bcb1-960be6b4a619.cdn.bspapp.com/images/common/p@2x.png"> -->
<image src="https://i.postimg.cc/D0k4M8pP/p-2x.png">
@ -196,6 +196,7 @@ export default {
reviewName: '',
checkType: '',
status: '',
userType: this.$store.state.user.userType,
maps: {
text: 'label',
value: 'value'

@ -75,9 +75,9 @@
// <view class="list-btn"></view>
// <view class="list-btn" @click="signIng(item)"></view> -->
<view class="list-btn ani" hover-class="isHoverIng" @click="goReport(item)">查看报告</view>
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status == 3"
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status == 3&&userType == 1||item.status == 3&&userType == 2"
@click="viewDetails(item, true, '1')">复查</view>
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status == 4"
<view class="list-btn ani" hover-class="isHoverIng" v-if="item.status == 4&&userType == 1||item.status == 4&&userType == 2"
@click="viewDetails(item, true, '2')">同步到学一学</view>
</view>
</view>
@ -168,6 +168,7 @@ export default {
status: '',
reviewName: '',
formData:null,
userType: this.$store.state.user.userType,
}
},
computed: {

@ -13,8 +13,8 @@
<view class="user-name">
{{ name }}
</view>
</view>
<view class="user-jobs-box">
</view>{{ userType }}
<view class="user-jobs-box" v-if="userType == 1||userType == 2">
<view class="jobs-item ani" hover-class="isHoverIng">
<view class="jobs-nums text-white">{{ servingTotalEnterpriseNum }}</view>
<view class="jobs-name">服务企业总数</view>
@ -30,11 +30,12 @@
<view class="jobs-name">本月已复查企业</view>
</view>
</view>
<view class="content-boxs">
<view class="content-boxs mt40">
<view class="content-title">工作管理</view>
<view class="content-content jobs-content">
<view class="lg-btn lg-btns one ani" hover-class="isHoverIng" @click="golaws(7)">
<view class="lg-btn lg-btns one ani" hover-class="isHoverIng" @click="golaws(7)"
v-if="userType == 1||userType == 2">
<view class="left">
<view class="lg-text">安全检查</view>
<view class="xs-text">查看计划信息</view>
@ -56,8 +57,8 @@
</view>
</view> -->
<view class="right-lg-btn">
<view class="right-lg-btn" v-if="userType == 1||userType == 2">
<view class="lg-btn four ani" hover-class="isHoverIng" @click="golaws(4)">
<view class="left">
<view class="lg-text">检查记录</view>
@ -80,6 +81,29 @@
</view>
</view>
<view class="lg-btn four ani" hover-class="isHoverIng" @click="golaws(4)"
v-if="userType == 0">
<view class="left">
<view class="lg-text">检查记录</view>
<view class="xs-text">查看检查记录</view>
</view>
<view class="right">
<!-- <image src="https://mp-df79fe8b-b924-41b0-bcb1-960be6b4a619.cdn.bspapp.com/images/index/his-check@2x.png" mode="" /> -->
<image src="https://i.postimg.cc/fy9jVGpB/his-check-2x.png" mode="" />
</view>
</view>
<view class="lg-btn three three1 ani" hover-class="isHoverIng" @click="golaws(6)"
v-if="userType == 0">
<view class="left">
<view class="lg-text">安全复查</view>
<view class="xs-text">查看复查信息</view>
</view>
<view class="right">
<!-- <image src="https://mp-df79fe8b-b924-41b0-bcb1-960be6b4a619.cdn.bspapp.com/images/index/re-check@2x.png" mode="" /> -->
<image src="https://i.postimg.cc/65h4M6rC/re-check-2x.png" mode="" />
</view>
</view>
</view>
</view>
<view class="content-boxs">
@ -108,7 +132,7 @@
</view>
</view>
<view class="content-boxs last-content-box">
<view class="content-title">待复查任务</view>
<view class="content-title">{{ userType == 1||userType == 2? "待复查任务" : "待整改项目" }}</view>
<view class="content-content news-content">
<!-- <view class="tags-box">
<uni-badge class="uni-badge-left-margin" type="warning" :text="8" absolute="rightTop" :offset="[-5, 2]"
@ -130,7 +154,7 @@
暂无任务
</text>
<view class="news-box" v-else>
<view class="news-item" v-for="(news, index) in mocNews" :key="index">
<view class="news-item" v-for="(news, index) in mocNews" :key="index" @click="viewDetails(news, true,userType!=0?'1':'')">
<view class="news-ico">
<!-- src="https://mp-df79fe8b-b924-41b0-bcb1-960be6b4a619.cdn.bspapp.com/images/index/msgicon@2x.png" -->
<image src="https://i.postimg.cc/28NnHXPN/msgicon-2x.png" mode=""></image>
@ -160,6 +184,7 @@
import { parseTime } from '@/utils/ruoyi.js';
import menusBar from '@/components/menusBar/menusBar';
import * as Api from '@/api/index/index'
import store from '@/store'
export default {
components: {
menusBar
@ -169,8 +194,9 @@ export default {
servingTotalEnterpriseNum: 0,
thisMonthCheckedEnterpriseNum: 0,
thisMonthAgainCheckedEnterpriseNum: 0,
// name: this.$store.state.user.name,
name: "河北省文化和旅游厅市场管理处",
name: this.$store.state.user.name,
userType: this.$store.state.user.userType,
// name: "",
choseindex: 0,
mocNews: [
// {
@ -214,9 +240,15 @@ export default {
this.getJobs()
},
mounted() {
console.log(store.state.user)
},
methods: {
viewDetails(item,val,type){
const data = encodeURIComponent(JSON.stringify(item))
uni.navigateTo({
url: '/pageIndex/addSafeCheck/readdSafeCheck?data='+data+'&val='+val+'&type='+type
})
},
getEvents() {
Api.getDataStatistics().then(res => {
this.servingTotalEnterpriseNum = res.data.servingTotalEnterpriseNum;
@ -289,12 +321,18 @@ export default {
scoped>
@import '@/static/scss/index/index.scss';
page {
min-height: auto;
background-color: #F6F8FC;
}
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
justify-content: start;
background: #F6F8FC;
min-height: 100vh;
}
.head-bg {
@ -347,7 +385,6 @@ export default {
align-items: center;
justify-content: space-evenly;
margin-top: 40rpx;
margin-bottom: 40rpx;
position: relative;
z-index: 9;
@ -371,6 +408,10 @@ export default {
}
}
.mt40 {
margin-top: 40rpx;
}
.jobs-content {
justify-content: space-between;
@ -480,6 +521,10 @@ export default {
color: #4D3706;
}
}
.three1{
margin-top: 0;
}
.four {
background: linear-gradient(90deg, #B0E8F5 0%, #DCF5FA 100%);

@ -107,8 +107,9 @@ export default {
},
data() {
return {
// name: this.$store.state.user.name,
name: "河北省文化和旅游厅市场管理处",
name: this.$store.state.user.name,
userType: this.$store.state.user.userType,
// name: "",
version: getApp().globalData.config.appInfo.version
}
},

@ -3,6 +3,7 @@ const getters = {
avatar: state => state.user.avatar,
name: state => state.user.name,
roles: state => state.user.roles,
permissions: state => state.user.permissions
permissions: state => state.user.permissions,
userType: state => state.user.userType,
}
export default getters

@ -12,7 +12,8 @@ const user = {
name: storage.get(constant.name),
avatar: storage.get(constant.avatar),
roles: storage.get(constant.roles),
permissions: storage.get(constant.permissions)
permissions: storage.get(constant.permissions),
userType: storage.get(constant.userType)
},
mutations: {
@ -23,6 +24,10 @@ const user = {
state.name = name
storage.set(constant.name, name)
},
SET_USER_TYPE: (state, userType) => {
state.userType = userType
storage.set(constant.userType, userType)
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
storage.set(constant.avatar, avatar)
@ -59,6 +64,7 @@ const user = {
GetInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo().then(res => {
debugger
res = res.data; // 读取 data 数据
const user = res.user
// const avatar = (user == null || user.avatar === "" || user.avatar == null) ? require("@https://mp-df79fe8b-b924-41b0-bcb1-960be6b4a619.cdn.bspapp.com/images/user/user-head@2x.png") : user.avatar
@ -66,6 +72,7 @@ const user = {
const avatar = (user == null || user.avatar === "" || user.avatar == null) ? "https://i.postimg.cc/B6DXHJZL/user-head-2x.png" : user.avatar
const nickname = (user == null || user.nickname === "" || user.nickname == null) ? "" : user.nickname
const userId = (user == null || user.id === "" || user.id == null) ? "" : user.id
const userType = (user == null || user.userType === "" || user.userType == null) ? "" : user.userType // 0企业管理员 1检查员
if (res.roles && res.roles.length > 0) {
commit('SET_ROLES', res.roles)
commit('SET_PERMISSIONS', res.permissions)
@ -75,6 +82,7 @@ const user = {
commit('SET_NAME', nickname)
commit('SET_ID', userId)
commit('SET_AVATAR', avatar)
commit('SET_USER_TYPE', userType)
resolve(res)
}).catch(error => {
reject(error)

@ -2,7 +2,8 @@ const constant = {
avatar: 'vuex_avatar',
name: 'vuex_name',
roles: 'vuex_roles',
permissions: 'vuex_permissions'
permissions: 'vuex_permissions',
userType: 'vuex_userType'
}
export default constant

@ -4,7 +4,7 @@ import constant from './constant'
let storageKey = 'storage_data'
// 存储节点变量名
let storageNodeKeys = [constant.avatar, constant.name, constant.roles, constant.permissions]
let storageNodeKeys = [constant.avatar, constant.name, constant.roles, constant.permissions,constant.userType]
// 存储的数据
let storageData = uni.getStorageSync(storageKey) || {}

Loading…
Cancel
Save