初始代码

This commit is contained in:
wangmingwei
2026-04-21 16:55:00 +08:00
parent be9f1657b9
commit 35101db700
1335 changed files with 211213 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
<template>
<view class="personalData-v">
<u-cell-group class="" style="padding: 0 20rpx;" :border-bottom="false" :border="false">
<u-cell-item title="账户" :value="data.account" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="所属组织" :value="data.organize" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="直属主管" :value="data.manager" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="岗位" :value="data.position" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="职级" :value="data.ranks" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="角色" :value="data.roleId" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="注册时间" :value="data.creatorTime" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="上次登录" :value="data.prevLogTime" :arrow="false" :title-style="titleStyle" />
<u-cell-item title="入职时间" :value="data.entryDate" :arrow="false" :title-style="titleStyle"
:border-bottom="false" />
</u-cell-group>
</view>
</template>
<script>
export default {
props: {
accountData: {
type: Object,
default: () => ({})
}
},
data() {
return {
titleStyle: {
color: '#303133'
}
}
},
computed: {
baseURL() {
return this.define.baseURL
},
data() {
let obj = {
...this.accountData
}
const {
creatorTime,
prevLogTime,
entryDate
} = obj
obj.creatorTime = this.$u.timeFormat(obj.creatorTime, 'yyyy-mm-dd hh:MM') || ''
obj.prevLogTime = this.$u.timeFormat(obj.prevLogTime, 'yyyy-mm-dd hh:MM') || ''
obj.entryDate = this.$u.timeFormat(obj.entryDate, 'yyyy-mm-dd hh:MM') || ''
return obj
}
}
}
</script>
<style lang="scss">
page {
background-color: #f0f2f6;
}
.personalData-v {
background-color: #fff;
}
:deep(.u-cell) {
height: 112rpx;
padding: 20rpx 0;
}
</style>

View File

@@ -0,0 +1,179 @@
<template>
<view class="common_v">
<mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :up="upOption"
:bottombar="false" top="120">
<uni-swipe-action ref="swipeAction">
<uni-swipe-action-item v-for="(item, index) in commonWordsList" :key="index" :threshold="0"
:right-options="actionData" :auto-close="false" @click="bindClick(item,$event)">
<view class="action-item">
{{item.commonWordsText}}
</view>
</uni-swipe-action-item>
</uni-swipe-action>
</mescroll-uni>
<view class="flowBefore-actions">
<u-button class="buttom-btn" type="primary" @click='editCommonWord'>添加常用语</u-button>
</view>
</view>
<uni-popup ref="inputDialog" type="dialog">
<uni-popup-dialog ref="inputClose" @confirm="confirm" mode="input" class="popup-dialog"
borderRadius="20px 20px 20px 20px" beforeClose @close="close" title="审批常用语">
<!-- #ifndef MP-WEIXIN -->
<u-input v-model="commonWordsText" type="textarea" placeholder="请输入内容" :auto-height="false"
maxlength="99999" height="150" />
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<textarea v-model="commonWordsText" :maxlength="99999" placeholder="请输入内容"
style="padding: 20rpx 0; "></textarea>
<!-- #endif -->
</uni-popup-dialog>
</uni-popup>
</template>
<script>
import {
commonWords,
Create,
Update,
Delete
} from "@/api/commonWords.js";
import NoData from "@/components/noData";
import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
import resources from '@/libs/resources.js'
export default {
mixins: [MescrollMixin],
components: {
NoData
},
props: {
showCommonWords: {
type: Boolean,
default: false
}
},
data() {
return {
downOption: {
use: true,
auto: true
},
upOption: {
page: {
num: 0,
size: 30,
time: null
},
empty: {
use: true,
icon: resources.message.nodata,
tip: this.$t('common.noData'),
fixed: true,
top: "360rpx"
},
textNoMore: this.$t('app.apply.noMoreData')
},
actionData: [{
style: {
backgroundColor: '#1890ff'
},
text: '编辑'
},
{
style: {
backgroundColor: '#F56C6C'
},
text: '删除'
}
],
commonWordsText: '',
commonWordsData: {},
commonWordsList: [],
showAdd: false
}
},
methods: {
upCallback(page) {
const query = {
currentPage: page.num,
pageSize: page.size,
commonWordsType: 1
}
commonWords(query).then(res => {
const curPageData = res.data.list || [] // 当前页数据
if (page.num == 1) this.commonWordsList = []; // 第一页需手动制空列表
this.mescroll.endSuccess(res.data.list.length);
this.commonWordsList = this.commonWordsList.concat(curPageData); //追加新数据
}).catch(() => {
this.mescroll.endErr();
})
},
bindClick(item, e) {
if (e.index == 0) this.editCommonWord(item)
if (e.index == 1) this.delCommonWord(item)
},
editCommonWord(item) {
this.$refs.inputDialog.open()
let data = {
commonWordsText: "",
enabledMark: 1,
id: 0,
sortCode: 0,
systemIds: [],
systemNames: [],
};
if (item.id) {
this.commonWordsText = item.commonWordsText;
this.commonWordsData = {
...item,
systemIds: [],
systemNames: []
};
} else {
this.commonWordsText = "";
this.commonWordsData = data;
}
},
delCommonWord(item) {
Delete(item.id).then(res => {
this.$u.toast(res.msg)
this.mescroll.resetUpScroll()
})
},
close() {
this.$refs.inputDialog.close()
},
confirm() {
this.commonWordsData.commonWordsText = this.commonWordsText;
this.commonWordsData.commonWordsType = 1
if (!this.commonWordsText) return this.$u.toast(`审批常用语不能为空`);
let funs = this.commonWordsData.id === 0 ? Create : Update;
funs(this.commonWordsData).then((res) => {
this.close()
this.commonWordsText = "";
uni.showToast({
title: res.msg,
icon: "none",
complete: () => {
this.mescroll.resetUpScroll()
},
});
}).catch(() => {
this.close()
this.mescroll.resetUpScroll()
});
}
}
}
</script>
<style lang="scss">
.action-item {
width: 100%;
min-height: 3.6rem;
background-color: #fff;
display: flex;
align-items: center;
border-bottom: 1rpx solid #eee;
padding: 10rpx 20rpx;
word-break: break-all;
}
</style>

View File

@@ -0,0 +1,216 @@
<template>
<view class="yunzhupaas-wrap personalData">
<view style="background-color: #fff;" class="u-p-l-20 u-p-r-20">
<u-form :model="dataForm" :errorType="['toast']" label-position="left" label-width="150" label-align="right"
ref="dataForm">
<u-form-item label="姓名" prop='realName' required>
<u-input input-align='right' v-model="dataForm.realName" placeholder="请输入"></u-input>
</u-form-item>
<u-form-item label="民族">
<YunzhupaasSelect v-model="dataForm.nation" placeholder="请选择" :options='nationOptions' />
</u-form-item>
<u-form-item label="性别">
<YunzhupaasSelect v-model="dataForm.gender" placeholder="请选择" :options='genderOptions' :props='props' />
</u-form-item>
<u-form-item label="籍贯">
<u-input input-align='right' v-model="dataForm.nativePlace" placeholder="请输入"></u-input>
</u-form-item>
<u-form-item label="证件类型">
<YunzhupaasSelect v-model="dataForm.certificatesType" placeholder="请选择"
:options='certificatesTypeOptions' />
</u-form-item>
<u-form-item label="证件号码">
<u-input input-align='right' v-model="dataForm.certificatesNumber" placeholder="请输入">
</u-input>
</u-form-item>
<u-form-item label="文化程度">
<YunzhupaasSelect v-model="dataForm.education" placeholder="请选择" :options='educationOptions' />
</u-form-item>
<u-form-item label="出生年月">
<YunzhupaasDatePicker v-model="dataForm.birthday" placeholder="请选择" />
</u-form-item>
<u-form-item label="办公电话">
<u-input input-align='right' v-model="dataForm.telePhone" placeholder="请输入">
</u-input>
</u-form-item>
<u-form-item label="办公座机">
<u-input input-align='right' v-model="dataForm.landline" placeholder="请输入">
</u-input>
</u-form-item>
<u-form-item label="手机号码">
<u-input input-align='right' v-model="dataForm.mobilePhone" placeholder="请输">
</u-input>
</u-form-item>
<u-form-item label="电子邮箱">
<u-input input-align='right' v-model="dataForm.email" placeholder="请输入">
</u-input>
</u-form-item>
<u-form-item label="紧急联系">
<u-input input-align='right' v-model="dataForm.urgentContacts" placeholder="请输入">
</u-input>
</u-form-item>
<u-form-item label="紧急电话">
<u-input input-align='right' v-model="dataForm.urgentTelePhone" placeholder="请输入">
</u-input>
</u-form-item>
<u-form-item label="通讯地址">
<u-input input-align='right' v-model="dataForm.postalAddress" placeholder="请输入">
</u-input>
</u-form-item>
<u-form-item label="自我介绍">
<u-input input-align='right' v-model="dataForm.signature" placeholder="请输入" type="textarea" />
</u-form-item>
</u-form>
</view>
<view class="flowBefore-actions">
<u-button class="buttom-btn" type="primary" @click='submit'>保存</u-button>
</view>
</view>
</template>
<script>
import {
UpdateUser
} from '@/api/common'
import {
useBaseStore
} from '@/store/modules/base'
const baseStore = useBaseStore()
export default {
props: {
personalData: {
type: Object,
default: () => ({})
}
},
data() {
const data = {
show: false,
props: {
label: 'fullName',
value: 'enCode'
},
dataForm: {
birthday: null,
certificatesNumber: "",
certificatesType: "",
education: "",
email: "",
gender: "",
landline: "",
mobilePhone: "",
nation: "",
nativePlace: "",
postalAddress: "",
realName: "",
signature: null,
telePhone: "",
urgentContacts: "",
urgentTelePhone: "",
id: null
},
nationOptions: [],
genderOptions: [],
certificatesTypeOptions: [],
educationOptions: [],
rules: {
realName: [{
required: true,
message: '请输入姓名',
trigger: ['change', 'blur'],
}]
}
}
return data
},
computed: {
baseURL() {
return this.define.baseURL
}
},
watch: {
personalData: {
handler(val) {
this.init()
},
deep: true,
immediate: true
}
},
mounted() {
this.$refs.dataForm.setRules(this.rules);
},
methods: {
init() {
let initData = JSON.parse(JSON.stringify(this.personalData))
for (let key in initData) {
for (let k in this.dataForm) {
if (key === k) {
this.dataForm[key] = initData[key]
}
}
}
this.getOptions()
},
getOptions() {
baseStore.getDictionaryData({
sort: 'Education'
}).then((res) => {
this.educationOptions = JSON.parse(JSON.stringify(res))
baseStore.getDictionaryData({
sort: 'certificateType'
}).then((res) => {
this.certificatesTypeOptions = JSON.parse(JSON.stringify(res))
})
baseStore.getDictionaryData({
sort: 'sex'
}).then(res => {
this.genderOptions = JSON.parse(JSON.stringify(res))
})
baseStore.getDictionaryData({
sort: 'Nation'
}).then(res => {
this.nationOptions = JSON.parse(JSON.stringify(res))
})
})
this.show = true
},
submit() {
this.$refs.dataForm.validate(valid => {
if (valid) {
UpdateUser(this.dataForm).then(res => {
uni.showToast({
title: '保存成功',
duration: 800,
icon: 'none'
});
setTimeout(() => {
uni.navigateBack()
}, 1000)
})
}
});
}
}
}
</script>
<style lang="scss">
page {
background-color: #f0f2f6;
}
.slot-btn {
width: 329rpx;
height: 140rpx;
display: flex;
justify-content: center;
align-items: center;
background: rgb(244, 245, 246);
border-radius: 10rpx;
}
.slot-btn__hover {
background-color: rgb(235, 236, 238);
}
</style>

View File

@@ -0,0 +1,260 @@
<template>
<view>
<view class="page_v u-flex-col">
<view>
<view v-if="show" v-for="(item,index) in signImg" :key="index" :class="item.isDefault ? 'active' : '' "
class="lists_box" @longpress="handleTouchStart(item,index)">
<view class="signImgBox">
<image :src="item.signImg" mode="scaleToFill" class="signImg"></image>
</view>
<view class="icon-checked-box" v-if="item.isDefault">
<view class="icon-checked">
<u-icon name="checkbox-mark" color="#fff" size="28"></u-icon>
</view>
</view>
<view class="sign-mask" v-if="!item.isDefault && item.isSet" :id="index">
<view class="sign-mask-btn">
<u-button @click.prevent="del(item.id,index)">删除</u-button>
<u-button type="primary" @click.prevent="setDefault(item.id,index)">设为默认</u-button>
</view>
</view>
</view>
</view>
<YunzhupaasSign ref="signRef" @change="signData" :showBtn="false" />
<NoData v-if="!show" :paddingTop="460"></NoData>
</view>
<view class="flowBefore-actions">
<u-button class="buttom-btn" type="primary" @click='showAction = true'>添加签名</u-button>
</view>
<u-action-sheet @click="handleAction" :list="actionList" :tips="{ text: '' , color: '#000' , fontSize: 30 }"
v-model="showAction">
</u-action-sheet>
</view>
</template>
<script>
import NoData from '@/components/noData'
import {
pathToBase64
} from '@/libs/file.js'
import {
getSignImgList,
createSignImg,
setDefSignImg,
delSignImg
} from '@/api/common'
export default {
components: {
NoData
},
data() {
return {
value: '',
show: true,
signImg: [],
isSet: false,
showAction: false,
actionList: [{
text: '在线签名',
id: 1
},
{
text: '图片上传',
id: 2
}
]
}
},
computed: {
baseURL() {
return this.define.comUploadUrl
},
token() {
return uni.getStorageSync('token')
}
},
mounted() {
this.getSignImgList()
},
methods: {
getSignImgList() {
getSignImgList().then(res => {
let signList = JSON.parse(JSON.stringify(res.data)) || []
this.show = signList.length > 0 ? true : false
this.signImg = signList.map(o => ({
isSet: false,
...o
}))
})
},
signData(e) {
if (e) {
let data = {
'signImg': e,
'isDefault': 0
}
createSignImg(data).then((res) => {
this.getSignImgList()
})
}
},
handleTouchStart(item, index) {
this.signImg.map((o, i) => {
o.isSet = false
})
item.isSet = true
},
del(id, index) {
delSignImg(id, index).then((res) => {
this.signImg.splice(index, 1)
})
},
setDefault(id, index) {
let userInfo = uni.getStorageSync('userInfo')
setDefSignImg(id).then((res) => {
this.signImg.map((o, i) => {
o.isDefault = false;
if (index == i) {
o.isDefault = true
o.isSet = false
userInfo.signImg = o.signImg
uni.setStorageSync('userInfo', userInfo)
}
})
})
},
handleAction(e) {
if (e == 0) {
this.$refs.signRef.addSign();
} else {
uni.chooseImage({
count: 1, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'],
success: (res) => {
let tempFilePaths = res.tempFilePaths[0]
// #ifdef H5
let isAccept = new RegExp('image/*').test(res.tempFiles[0].type)
if (!isAccept) return this.$u.toast(`请上传图片`)
// #endif
if ((res.tempFiles[0].size / 1024) > 500) return this.$u.toast('操作失败图片大小超出500K')
// #ifdef APP-HARMONY
this.harmony(tempFilePaths)
// #endif
// #ifndef APP-HARMONY
pathToBase64(tempFilePaths).then(base64 => {
this.signData(base64)
})
// #endif
}
});
}
},
harmony(tempFilePaths) {
uni.uploadFile({
url: this.baseURL + 'imgToBase64',
filePath: tempFilePaths,
name: 'file',
header: {
'Authorization': this.token
},
success: (uploadFileRes) => {
let res = JSON.parse(uploadFileRes.data)
this.signData(res.data)
},
fail: (err) => {}
});
}
}
}
</script>
<style lang="scss">
page {
background-color: #f0f2f6;
}
.page_v {
height: 100%;
padding: 0 20rpx;
.active {
border: 1rpx solid #2979FF;
color: #2979FF;
.icon-ym-organization {
&::before {
color: #2979FF !important;
}
}
}
.sign-mask {
width: 100%;
height: 200rpx;
background: rgba(0, 0, 0, .3);
position: absolute;
top: 0;
border-radius: 12rpx;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
.sign-mask-btn {
width: 60%;
display: flex;
}
}
.lists_box {
width: 100%;
height: 200rpx;
border-radius: 8rpx;
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
background-color: #FFFFFF;
margin-bottom: 20rpx;
overflow: hidden;
.signImgBox {
width: 100%;
height: 100%;
text-align: center;
.signImg {
width: 100%;
height: 100%;
}
}
.icon-checked-box {
display: flex;
width: 140rpx;
height: 80rpx;
position: absolute;
transform: scale(0.9);
right: -4rpx;
bottom: -2rpx;
flex-direction: row;
align-items: center;
.icon-checked {
width: 44rpx;
height: 44rpx;
border: 40rpx solid #1890ff;
border-left: 40rpx solid transparent;
border-top: 40rpx solid transparent;
border-bottom-right-radius: 12rpx;
position: absolute;
transform: scale(0.95);
right: -8rpx;
bottom: -6rpx;
}
}
}
}
</style>