feat:添加应用 - 100%

This commit is contained in:
weifashi 2023-08-15 18:35:01 +08:00
parent 96ca57509f
commit 916997d92a
15 changed files with 505 additions and 289 deletions

View File

@ -1349,3 +1349,13 @@ AI机器人
汇报人
提交时间
去聊天
我是一个人工智能助手,为用户提供问题解答和指导。我没有具体的身份,只是一个程序。您有什么问题可以问我哦?
我是Claude,一个由Anthropic公司创造出来的AI助手机器人。我的工作是帮助人类,与人对话并给出解答。
我是文心一言英文名是ERNIE Bot。我能够与人对话互动回答问题协助创作高效便捷地帮助人们获取信息、知识和灵感。
我是达摩院自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。
机器人暂未开启
创建一个全新的会议视频会议,与会者可以在实时中进行面对面的视听交流。通过视频会议平台,参与者可以分享屏幕、共享文档,并与其他与会人员进行讨论和协。
加入视频会议,参与已经创建的会议,在会议过程中与其他参会人员进行远程实时视听交流和协作。
新会议

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
<style type="text/css">
.st0{fill:#87D068;}
.st1{clip-path:url(#SVGID_00000110451965135261372140000002995710644970903720_);fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M12,0h24c6.6,0,12,5.4,12,12v24c0,6.6-5.4,12-12,12H12C5.4,48,0,42.6,0,36V12C0,5.4,5.4,0,12,0z"/>
<g>
<defs>
<rect id="SVGID_1_" x="12" y="12" width="24" height="24"/>
</defs>
<clipPath id="SVGID_00000062903037985041173510000002112159436546237855_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_00000062903037985041173510000002112159436546237855_);fill:#FFFFFF;" d="M24,24.3"/>
<path style="clip-path:url(#SVGID_00000062903037985041173510000002112159436546237855_);fill:#FFFFFF;" d="M34.9,19.3L34.9,19.3
c-0.7-0.3-1.4-0.2-2,0.3l-2.2,2V19c0-1.6-1.3-2.9-2.9-2.9H14.9C13.3,16,12,17.3,12,19v10.7c0,1.6,1.3,2.9,2.9,2.9h12.8
c1.6,0,2.9-1.3,2.9-2.9V27l2.2,2c0.3,0.3,0.8,0.5,1.2,0.5c0.3,0,0.5-0.1,0.8-0.2c0.7-0.3,1.1-1,1.1-1.7V21
C36,20.3,35.6,19.7,34.9,19.3z M24.6,25.1h-2.5v2.5c0,0.5-0.4,0.8-0.8,0.8c-0.5,0-0.8-0.4-0.8-0.8v-2.5H18c-0.5,0-0.8-0.4-0.8-0.8
c0-0.5,0.4-0.8,0.8-0.8h2.5V21c0-0.5,0.4-0.8,0.8-0.8c0.5,0,0.8,0.4,0.8,0.8v2.5h2.5c0.5,0,0.8,0.4,0.8,0.8
C25.4,24.8,25.1,25.1,24.6,25.1z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -68,7 +68,8 @@ export default {
{icon: '&#xe6fa;', name: 'project', label: '项目'},
{icon: '&#xe6eb;', name: 'dialog', label: '消息'},
{icon: '&#xe6b2;', name: 'contacts', label: '通讯录'},
{icon: '&#xe6e9;', name: 'more', label: '更多'},
{icon: '&#xe60c;', name: 'apply', label: '应用'},
// {icon: '&#xe6e9;', name: 'more', label: ''},
],
navMore: [
[
@ -200,8 +201,9 @@ export default {
},
activeName() {
if (this.isMore || ['manage-calendar', 'manage-file', 'manage-setting'].includes(this.routeName)) {
return 'more';
if (this.isMore || ['manage-calendar', 'manage-file', 'manage-setting', 'manage-apply', 'manage-approve'].includes(this.routeName)) {
// return 'more';
return 'apply';
}
if (this.routeName === 'manage-dashboard') {

View File

@ -11,8 +11,7 @@
<UserAvatar :userid="userId" :size="36" tooltipDisabled/>
</div>
<span>{{userInfo.nickname}}</span>
<Badge v-if="(reportUnreadNumber + approveUnreadNumber) > 0" class="manage-box-top-report" :overflow-count="999" :count="reportUnreadNumber + approveUnreadNumber"/>
<Badge v-else-if="!!clientNewVersion" class="manage-box-top-report" dot/>
<Badge v-if="!!clientNewVersion" class="manage-box-top-report" dot/>
<div class="manage-box-arrow">
<Icon type="ios-arrow-up" />
<Icon type="ios-arrow-down" />
@ -57,18 +56,11 @@
<DropdownItem :divided="!!item.divided">
<div class="manage-menu-flex">
{{$L(item.name)}}
<Badge v-if="reportUnreadNumber > 0" class="manage-menu-report-badge" :overflow-count="999" :count="reportUnreadNumber"/>
<Icon v-else type="ios-arrow-forward"></Icon>
<Icon type="ios-arrow-forward"></Icon>
</div>
</DropdownItem>
<DropdownMenu slot="list">
<DropdownItem name="allUser">{{$L('团队管理')}}</DropdownItem>
<DropdownItem name="workReport">
<div class="manage-menu-flex">
{{$L('工作报告')}}
<Badge v-if="reportUnreadNumber > 0" class="manage-menu-report-badge" :overflow-count="999" :count="reportUnreadNumber"/>
</div>
</DropdownItem>
<DropdownItem name="exportTask">{{$L('导出任务统计')}}</DropdownItem>
<DropdownItem name="exportOverdueTask">{{$L('导出超期任务')}}</DropdownItem>
<DropdownItem name="exportApprove">{{$L('导出审批数据')}}</DropdownItem>
@ -205,7 +197,7 @@
<div class="manage-box-main">
<keep-alive>
<router-view class="manage-box-view"></router-view>
<router-view class="manage-box-view" @on-click="onTabbarClick"></router-view>
</keep-alive>
</div>
@ -569,12 +561,10 @@ export default {
{path: 'archivedProject', name: '已归档的项目'},
{path: 'team', name: '团队管理', divided: true},
{path: 'approve', name: '审批中心'},
])
} else {
array.push(...[
{path: 'personal', name: '个人设置', divided: true},
{path: 'approve', name: '审批中心'},
{path: 'version', name: '更新版本', divided: true, visible: !!this.clientNewVersion},
{path: 'workReport', name: '工作报告', divided: true},
@ -630,7 +620,7 @@ export default {
if (this.routeName === 'manage-project' && !/^\d+$/.test(this.$route.params.projectId)) {
return true;
}
return ['manage-dashboard', 'manage-calendar', 'manage-messenger', 'manage-file', 'manage-setting'].includes(this.routeName)
return ['manage-dashboard', 'manage-calendar', 'manage-messenger', 'manage-file', 'manage-setting', 'manage-approve', 'manage-apply'].includes(this.routeName)
},
},

View File

@ -1,6 +1,6 @@
<template>
<div class="page-apply">
<PageTitle :title="$L('应用')" />
<div class="apply-wrapper">
@ -11,13 +11,18 @@
</div>
<div class="apply-row">
<Row :gutter="16">
<Col v-for="item in applyList" :xs="{ span: 8 }" :lg="{ span: 6 }" :xl="{ span: 4 }" :xxl="{ span: 3 }">
<Col v-if="!item.isAdmin || userIsAdmin" v-for="(item, key) in applyList" :xs="{ span: 8 }"
:sm="{ span: 8 }" :lg="{ span: 6 }" :xl="{ span: 4 }" :xxl="{ span: 3 }" :key="key">
<div class="apply-col">
<div @click="applyClick(item)">
<img :src="item.src">
<p>{{ item.label }}</p>
<!-- 审批中心 -->
<Badge v-if="item.value == 'approve' && approveUnreadNumber > 0" class="manage-box-top-report"
:overflow-count="999" :count="approveUnreadNumber" />
<!-- 工作报告 -->
<Badge v-if="item.value == 'report' && reportUnreadNumber > 0" class="manage-box-top-report" :overflow-count="999" :count="reportUnreadNumber"/>
<Badge v-if="item.value == 'report' && reportUnreadNumber > 0" class="manage-box-top-report"
:overflow-count="999" :count="reportUnreadNumber" />
</div>
</div>
</Col>
@ -40,50 +45,39 @@
</p>
</div>
<div class="ivu-modal-wrap-apply-body">
<div v-if="aibotType==1">
<ul class="aibot-ul">
<li>
<img src="/images/avatar/default_openai.png">
<h4>ChatGPT</h4>
<p>我是一个人工智能助手为用户提供问题解答和指导我没有具体的身份只是一个程序您有什么问题可以问我哦</p>
<p class="btn">去聊天</p>
</li>
<li>
<img src="/images/avatar/default_claude.png">
<h4>Claude</h4>
<p>我是Claude,一个由Anthropic公司创造出来的AI助手机器人我的工作是帮助人类,与人对话并给出解答</p>
<p class="btn">去聊天</p>
</li>
<li>
<img src="/avatar/Wenxin.png">
<h4>文心一言 (Wenxin)</h4>
<p>我是文心一言英文名是ERNIE Bot我能够与人对话互动回答问题协助创作高效便捷地帮助人们获取信息知识和灵感</p>
<p class="btn">去聊天</p>
</li>
<li>
<img src="/avatar/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE.png">
<h4>通义千问 (Qianwen)</h4>
<p>我是达摩院自主研发的超大规模语言模型能够回答问题创作文字还能表达观点撰写代码</p>
<p class="btn">去聊天</p>
</li>
</ul>
</div>
<div v-if="aibotType==2">
<Tabs v-model="aibotTabAction" style="height: 100%;display: flex;flex-direction: column;">
<TabPane label="ChatGPT" name="opanai" style="height: 100%;">
<div style="position: relative;height: 100%;"> <SystemAibot type="ChatGPT"/></div>
</TabPane>
<TabPane label="Claude" name="claude" style="height: 100%;">
<div style="position: relative;height: 100%;"> <SystemAibot type="Claude"/></div>
</TabPane>
<TabPane label="文心一言" name="wenxin" style="height: 100%;">
<div style="position: relative;height: 100%;"> <SystemAibot type="Wenxin"/></div>
</TabPane>
<TabPane label="通义千问" name="qianwen" style="height: 100%;">
<div style="position: relative;height: 100%;"> <SystemAibot type="Qianwen"/></div>
</TabPane>
</Tabs>
</div>
<ul class="ivu-modal-wrap-ul" v-if="aibotType == 1">
<li v-for="(item, key) in aibotList" @click="onGoToChat(item.value)" :key="key">
<img :src="item.src">
<h4>{{ item.label }}</h4>
<p>{{ item.desc }}</p>
<p class="btn">{{ $L('去聊天') }}</p>
<div class="load" v-if="aibotDialogSearchLoad == item.value">
<Loading />
</div>
</li>
</ul>
<Tabs v-else v-model="aibotTabAction">
<TabPane label="ChatGPT" name="opanai">
<div class="aibot-warp">
<SystemAibot type="ChatGPT" v-if="aibotTabAction == 'opanai'" />
</div>
</TabPane>
<TabPane label="Claude" name="claude">
<div class="aibot-warp">
<SystemAibot type="Claude" v-if="aibotTabAction == 'claude'" />
</div>
</TabPane>
<TabPane label="文心一言" name="wenxin">
<div class="aibot-warp">
<SystemAibot type="Wenxin" v-if="aibotTabAction == 'wenxin'" />
</div>
</TabPane>
<TabPane label="通义千问" name="qianwen">
<div class="aibot-warp">
<SystemAibot type="Qianwen" v-if="aibotTabAction == 'qianwen'" />
</div>
</TabPane>
</Tabs>
</div>
</div>
</DrawerOverlay>
@ -98,8 +92,8 @@
</p>
</div>
<div class="ivu-modal-wrap-apply-body">
<Checkin v-if="signType==1"/>
<SystemCheckin v-if="signType==2"/>
<Checkin v-if="signType == 1" />
<SystemCheckin v-else />
</div>
</div>
</DrawerOverlay>
@ -108,64 +102,68 @@
<DrawerOverlay v-model="meetingShow" placement="right" :size="600">
<div class="ivu-modal-wrap-apply">
<div class="ivu-modal-wrap-apply-title">
{{ $L('会议功能') }}
{{ $L('会议') }}
<p @click="meetingType = meetingType == 1 ? 2 : 1">
{{ meetingType == 1 ? $L('会议设置') : $L('返回') }}
</p>
</div>
<div class="ivu-modal-wrap-apply-body">
<div v-if="meetingType==1">
<Form ref="addForm" :model="meetingAddData" label-width="auto" @submit.native.prevent>
<template v-if="meetingAddData.type === 'join'">
<!-- 加入会议 -->
<FormItem v-if="meetingAddData.name" prop="userids" :label="$L('会议主题')">
<Input v-model="meetingAddData.name" disabled/>
</FormItem>
<FormItem prop="meetingid" :label="$L('会议频道ID')">
<Input v-model="meetingAddData.meetingid" :disabled="meetingAddData.meetingdisabled === true" :placeholder="$L('请输入会议频道ID')"/>
</FormItem>
</template>
<template v-else>
<!-- 新会议 -->
<FormItem prop="name" :label="$L('会议主题')">
<Input v-model="meetingAddData.name" :maxlength="50" :placeholder="$L('选填')"/>
</FormItem>
<FormItem prop="meetingid" :label="$L('会议频道ID')">
<Input v-model="meetingAddData.meetingid" :disabled="meetingAddData.meetingdisabled === true" :placeholder="$L('请输入会议频道ID')"/>
</FormItem>
<FormItem prop="userids" :label="$L('邀请成员')">
<UserSelect v-model="meetingAddData.userids" :uncancelable="[userId]" :multiple-max="20" :title="$L('选择邀请成员')"/>
</FormItem>
</template>
<FormItem prop="tracks">
<CheckboxGroup v-model="meetingAddData.tracks">
<Checkbox label="audio">
<span>{{$L('麦克风')}}</span>
</Checkbox>
<Checkbox label="video">
<span>{{$L('摄像头')}}</span>
</Checkbox>
</CheckboxGroup>
</FormItem>
</Form>
<div slot="footer" class="adaption">
<!-- <Button type="default" @click="meetingShow=false">{{$L('取消')}}</Button> -->
<Button type="primary" :loading="meetingLoadIng > 0" @click="onMeetingSubmit">{{$L(meetingAddData.type === 'join' ? '加入会议' : '开始会议')}}</Button>
</div>
<!--
<p @click="onAddMenu('createMeeting')" style="cursor: pointer;color: #2b85e4; padding: 10px;
border: 1px solid;
border-radius: 5px;">新会议</p>
<p @click="onAddMenu('joinMeeting')" style="cursor: pointer;color: #2b85e4; padding: 10px;
border: 1px solid;
border-radius: 5px;margin-top: 30px;">加入会议</p> -->
</div>
<SystemMeeting v-if="meetingType==2"/>
<ul class="ivu-modal-wrap-ul" v-if="meetingType == 1">
<li @click="onMeeting('createMeeting')">
<img :src="$A.apiUrl('../images/apply/meeting.svg')">
<h4>{{ $L('新会议') }}</h4>
<p>{{ $L('创建一个全新的会议视频会议,与会者可以在实时中进行面对面的视听交流。通过视频会议平台,参与者可以分享屏幕、共享文档,并与其他与会人员进行讨论和协。作') }}</p>
<p class="btn">{{ $L('新建会议') }}</p>
</li>
<li @click="onMeeting('joinMeeting')">
<img :src="$A.apiUrl('../images/apply/joinMeeting.svg')">
<h4>{{ $L('加入会议') }}</h4>
<p>{{ $L('加入视频会议,参与已经创建的会议,在会议过程中与其他参会人员进行远程实时视听交流和协作。') }}</p>
<p class="btn">{{ $L('加入会议') }}</p>
</li>
</ul>
<SystemMeeting v-else />
</div>
</div>
</DrawerOverlay>
<!--LDAP-->
<DrawerOverlay v-model="ldapShow" placement="right" :size="700">
<div class="ivu-modal-wrap-apply">
<div class="ivu-modal-wrap-apply-title">
{{ $L('LDAP设置') }}
</div>
<div class="ivu-modal-wrap-apply-body">
<SystemThirdAccess />
</div>
</div>
</DrawerOverlay>
<!--邮件-->
<DrawerOverlay v-model="mailShow" placement="right" :size="700">
<div class="ivu-modal-wrap-apply">
<div class="ivu-modal-wrap-apply-title">
{{ $L('邮件管理') }}
</div>
<div class="ivu-modal-wrap-apply-body">
<SystemEmailSetting />
</div>
</div>
</DrawerOverlay>
<!--app推送-->
<DrawerOverlay v-model="appPushShow" placement="right" :size="700">
<div class="ivu-modal-wrap-apply">
<div class="ivu-modal-wrap-apply-title">
{{ $L('APP推送') }}
</div>
<div class="ivu-modal-wrap-apply-body">
<SystemAppPush />
</div>
</div>
</DrawerOverlay>
</div>
</template>
@ -178,40 +176,55 @@ import SystemAibot from "./setting/components/SystemAibot";
import SystemCheckin from "./setting/components/SystemCheckin";
import Checkin from "./setting/checkin";
import SystemMeeting from "./setting/components/SystemMeeting";
import {Store} from "le5le-store";
import SystemThirdAccess from "./setting/components/SystemThirdAccess";
import SystemEmailSetting from "./setting/components/SystemEmailSetting";
import SystemAppPush from "./setting/components/SystemAppPush";
import { Store } from "le5le-store";
export default {
components: { UserSelect, DrawerOverlay, Report, SystemAibot, SystemCheckin, Checkin, SystemMeeting },
components: {
UserSelect,
DrawerOverlay,
Report,
SystemAibot,
SystemCheckin,
Checkin,
SystemMeeting,
SystemThirdAccess,
SystemEmailSetting,
SystemAppPush
},
data() {
return {
applyList: [
{ value: "approve", label: "审批中心", src: "/images/apply/approve.svg" },
{ value: "report", label: "工作报告", src: "/images/apply/report.svg"},
{ value: "ai", label: "AI机器人", src: "/images/apply/robot.svg" },
{ value: "signIn", label: "签到", src: "/images/apply/signin.svg" },
{ value: "meeting", label: "会议", src: "/images/apply/meeting.svg" },
{ value: "ldap", label: "LDAP", src: "/images/apply/ldap.svg" },
{ value: "mail", label: "邮件", src: "/images/apply/mail.svg" },
{ value: "appPush", label: "APP推送", src: "/images/apply/apppush.svg" },
],
applyList: [],
//
workReportShow: false,
workReportTabs: "my",
//
aibotList: [
{ value: "openai", label: "ChatGPT", src: $A.apiUrl('../images/avatar/default_openai.png'), desc: this.$L('我是一个人工智能助手,为用户提供问题解答和指导。我没有具体的身份,只是一个程序。您有什么问题可以问我哦?') },
{ value: "claude", label: "Claude", src: $A.apiUrl('../images/avatar/default_claude.png'), desc: this.$L('我是Claude,一个由Anthropic公司创造出来的AI助手机器人。我的工作是帮助人类,与人对话并给出解答。') },
{ value: "wenxin", label: "Wenxin", src: $A.apiUrl('../avatar/Wenxin.png'), desc: this.$L('我是文心一言英文名是ERNIE Bot。我能够与人对话互动回答问题协助创作高效便捷地帮助人们获取信息、知识和灵感。') },
{ value: "qianwen", label: "Qianwen", src: $A.apiUrl('../avatar/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE.png'), desc: this.$L('我是达摩院自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。') },
],
aibotTabAction: "opanai",
aibotShow: false,
aibotType: 1,
aibotDialogSearchLoad: "",
//
signInShow: false,
signType: 1,
//
meetingShow: false,
meetingType: 1,
meetingAddData: {
userids: [],
tracks: ['audio']
},
meetingLoadIng: 0
//
ldapShow: false,
//
mailType: 1,
mailShow: false,
//
appPushType: 1,
appPushShow: false,
}
},
@ -219,18 +232,46 @@ export default {
},
mounted() {
},
activated() {
this.applyList = [
{ value: "approve", label: "审批中心", src: $A.apiUrl('../images/apply/approve.svg') },
{ value: "report", label: "工作报告", src: $A.apiUrl('../images/apply/report.svg') },
{ value: "ai", label: "AI机器人", src: $A.apiUrl('../images/apply/robot.svg') },
{ value: "signIn", label: "签到", src: $A.apiUrl('../images/apply/signin.svg') },
{ value: "meeting", label: "会议", src: $A.apiUrl('../images/apply/meeting.svg') },
{ value: "ldap", label: "LDAP", src: $A.apiUrl('../images/apply/ldap.svg'), isAdmin: true },
{ value: "mail", label: "邮件", src: $A.apiUrl('../images/apply/mail.svg'), isAdmin: true },
{ value: "appPush", label: "APP推送", src: $A.apiUrl('../images/apply/apppush.svg'), isAdmin: true }
];
if (this.windowOrientation == 'portrait') {
this.applyList.push({ value: "calendar", label: "日历", src: $A.apiUrl('../images/apply/apppush.svg') })
this.applyList.push({ value: "file", label: "文件", src: $A.apiUrl('../images/apply/apppush.svg') })
this.applyList.push({ value: "addProject", label: "创建项目", src: $A.apiUrl('../images/apply/apppush.svg') })
this.applyList.push({ value: "addTask", label: "添加任务", src: $A.apiUrl('../images/apply/apppush.svg') })
if ($A.isEEUiApp) {
this.applyList.push({ value: "scan", label: "扫一扫", src: $A.apiUrl('../images/apply/apppush.svg') })
}
if (this.userIsAdmin) {
this.applyList.push({ value: "allUser", label: "团队管理", src: $A.apiUrl('../images/apply/apppush.svg') })
}
this.applyList.push({ value: "setting", label: "设置", src: $A.apiUrl('../images/apply/apppush.svg') })
}
},
computed: {
...mapState([
'userInfo',
'userIsAdmin',
'reportUnreadNumber',
'approveUnreadNumber',
'cacheDialogs',
'windowOrientation',
]),
},
@ -241,9 +282,13 @@ export default {
methods: {
applyClick(item) {
this.$emit("on-click", item.value)
switch (item.value) {
case 'approve':
this.goForward({name: 'manage-approve'});
case 'calendar':
case 'file':
case 'setting':
this.goForward({ name: 'manage-' + item.value });
break;
case 'report':
this.workReportShow = true;
@ -254,14 +299,70 @@ export default {
this.aibotShow = true;
break;
case 'signIn':
this.signInType = 1;
this.signInShow = true;
break;
case 'meeting':
this.meetingType = 1;
this.meetingShow = true;
break;
case 'ldap':
this.ldapShow = true;
break;
case 'mail':
this.mailType = 1;
this.mailShow = true;
break;
case 'appPush':
this.appPushType = 1;
this.appPushShow = true;
break;
}
},
onAddMenu(name) {
//
onGoToChat(type) {
let dialogId = 0;
let email = `ai-${type}@bot.system`;
this.cacheDialogs.map(h => {
if (h.email == email) {
dialogId = h.id;
}
})
if (dialogId) {
if (this.windowOrientation == 'portrait') {
this.$store.dispatch("openDialog", dialogId)
} else {
this.goForward({ name: 'manage-messenger', params: { dialog_id: dialogId } });
}
this.aibotShow = false;
} else {
this.aibotDialogSearchLoad = type;
this.$store.dispatch("call", {
url: 'dialog/search',
data: { key: email },
}).then(({ data }) => {
if (data?.length < 1) {
$A.messageError('机器人暂未开启');
this.aibotDialogSearchLoad = '';
return;
}
this.$store.dispatch("openDialogUserid", data[0]?.dialog_user.userid).then(_ => {
if (this.windowOrientation != 'portrait') {
this.goForward({ name: 'manage-messenger' })
}
this.aibotShow = false;
}).catch(({ msg }) => {
$A.modalError(msg)
}).finally(_ => {
this.aibotDialogSearchLoad = '';
});
}).catch(_ => {
this.aibotDialogSearchLoad = '';
});
}
},
//
onMeeting(name) {
switch (name) {
case 'createMeeting':
Store.set('addMeeting', {
@ -276,9 +377,6 @@ export default {
break;
}
this.meetingShow = false;
},
onMeetingSubmit(){
}
}
}

View File

@ -7,10 +7,13 @@
<div class="approve-nav">
<h1>{{$L('审批中心')}}</h1>
</div>
<Button :loading="addLoadIng" type="primary" @click="addApply">{{$L("添加申请")}}</Button>
<Button v-if="showType == 1" :loading="addLoadIng" type="primary" @click="addApply">{{$L("添加申请")}}</Button>
<Button v-if="userIsAdmin" @click="showType = showType == 1 ? 2 : 1">
{{ showType == 1 ? $L("流程设置") : $L("返回") }}
</Button>
</div>
<Tabs :value="tabsValue" @on-click="tabsClick" style="margin: 0 20px;height: 100%;" size="small">
<Tabs v-if="showType==1" :value="tabsValue" @on-click="tabsClick" style="margin: 0 20px;height: 100%;" size="small">
<TabPane :label="$L('待办') + (unreadTotal > 0 ? ('('+unreadTotal+')') : '')" name="unread" style="height: 100%;">
<div class="approve-main-search">
<div>
@ -132,6 +135,8 @@
</TabPane>
</Tabs>
<ApproveSetting v-else/>
</div>
<!--详情-->
@ -214,13 +219,16 @@ import list from "./list.vue";
import listDetails from "./details.vue";
import DrawerOverlay from "../../../components/DrawerOverlay";
import ImgUpload from "../../../components/ImgUpload";
import ApproveSetting from "./setting";
import {mapState} from 'vuex'
export default {
components:{list,listDetails,DrawerOverlay,ImgUpload},
components:{list,listDetails,DrawerOverlay,ImgUpload,ApproveSetting},
name: "approve",
data() {
return {
showType: 1,
modalTransferIndex: window.modalTransferIndex,
minDate: new Date(2020, 0, 1),
@ -340,6 +348,11 @@ export default {
if(!val){
this.addData.other = ""
}
},
showType(val){
if(val == 1){
this.tabsClick()
}
}
},
mounted() {
@ -682,6 +695,9 @@ export default {
});
}
});
},
workflowSetting() {
console.log(1)
}
}
}

View File

@ -1,18 +1,18 @@
<template>
<div class="setting-item submit">
<Row class="approve-row" :gutter="8">
<Col :xxl="{ span: 6 }" :xl="{ span: 8 }" :lg="{ span: 12 }" :sm="{ span: 24 }" :xs="{ span: 24 }" >
<div class="page-approve-setting">
<Row class="approve-row" :gutter="16">
<Col :xxl="{ span: 6 }" :xl="{ span: 8 }" :lg="{ span: 12 }" :sm="{ span: 12 }" :xs="{ span: 24 }" >
<div class="approve-col-box approve-col-add" @click="add">
<Icon type="md-add" />
</div>
</Col>
<Col v-for="(item, key) in list" :xxl="{ span: 6 }" :xl="{ span: 8 }" :lg="{ span: 12 }" :sm="{ span: 24 }" :xs="{ span: 24 }" :key="key">
<Col v-for="(item, key) in list" :xxl="{ span: 6 }" :xl="{ span: 8 }" :lg="{ span: 12 }" :sm="{ span: 12 }" :xs="{ span: 24 }" :key="key">
<div class="approve-col-box approve-col-for" @click="edit(item)">
<p>{{$L('流程名称')}}<span style="font-weight: 500;color: #135de6;">{{$L(item.name)}}</span></p>
<Divider style="margin: 12px 0;margin-bottom: 9px;"/>
<p>{{$L('流程名称')}}<span class="approve-name">{{$L(item.name)}}</span></p>
<Divider class="divider"/>
<div class="approve-button-box" @click.stop="edit(item)">
<p>{{$L('已发布')}}</p>
<p @click.stop="change(item)" style="position: relative;">
<p class="icon-warp" @click.stop="change(item)" >
<Icon type="md-trash" size="16" class="delcon"/>
</p>
</div>
@ -33,7 +33,7 @@ import DrawerOverlay from "../../../components/DrawerOverlay";
import store from '../../../store/state'
import {languageType} from "../../../language";
export default {
name: "approve",
name: "ApproveSetting",
components: {DrawerOverlay},
data(){
return{

View File

@ -453,6 +453,18 @@ export default {
if (['dialog', 'contacts'].includes(params.dialogAction)) {
this.tabActive = params.dialogAction
}
if(this.tabActive=='dialog'){
if(params.dialog_id){
const id = $A.runNum(params.dialog_id);
if (id > 0) {
this.openDialog(id)
}
this.clickAgainSubscribe = Store.subscribe('clickAgainDialog', this.shakeUnread);
}
if(params.search){
this.dialogSearchKey = params.search
}
}
},
immediate: true
},

View File

@ -74,7 +74,6 @@ export default {
{path: 'personal', name: '个人设置'},
{path: 'password', name: '密码设置'},
{path: 'email', name: '修改邮箱'},
{path: 'checkin', name: '签到设置', desc: ' (Beta)'},
{path: 'language', name: '语言设置', divided: true},
{path: 'theme', name: '主题设置'},
]
@ -93,7 +92,6 @@ export default {
if (this.userIsAdmin) {
menu.push(...[
{path: 'system', name: '系统设置', divided: true},
{path: 'approve', name: '审批设置', desc: ' (Beta)'},
{path: 'license', name: 'License Key'},
])
}

View File

@ -10,24 +10,6 @@
<TabPane :label="$L('项目模板')" name="columnTemplate">
<SystemColumnTemplate/>
</TabPane>
<TabPane :label="$L('AI机器人')" name="aibot">
<SystemAibot/>
</TabPane>
<TabPane :label="$L('会议功能')" name="meeting">
<SystemMeeting/>
</TabPane>
<TabPane :label="$L('签到功能')" name="checkin">
<SystemCheckin/>
</TabPane>
<TabPane :label="$L('邮件设置')" name="emailSetting">
<SystemEmailSetting/>
</TabPane>
<TabPane :label="$L('认证设置')" name="thirdAccess">
<SystemThirdAccess/>
</TabPane>
<TabPane v-if="$A.isDooServer()" :label="$L('APP推送')" name="appPush">
<SystemAppPush/>
</TabPane>
</Tabs>
</div>
</template>
@ -36,20 +18,9 @@
import SystemSetting from "./components/SystemSetting";
import SystemTaskPriority from "./components/SystemTaskPriority";
import SystemColumnTemplate from "./components/SystemColumnTemplate";
import SystemEmailSetting from "./components/SystemEmailSetting";
import SystemAppPush from "./components/SystemAppPush";
import SystemMeeting from "./components/SystemMeeting";
import SystemCheckin from "./components/SystemCheckin";
import SystemThirdAccess from "./components/SystemThirdAccess";
import SystemAibot from "./components/SystemAibot.vue";
export default {
components: {
SystemAibot,
SystemThirdAccess,
SystemCheckin,
SystemMeeting,
SystemAppPush, SystemColumnTemplate, SystemTaskPriority, SystemSetting, SystemEmailSetting},
components: {SystemColumnTemplate, SystemTaskPriority, SystemSetting},
data() {
return {
tabAction: 'setting',

View File

@ -54,11 +54,6 @@ export default [
path: 'checkin',
component: () => import('./pages/manage/setting/checkin.vue'),
},
{
name: 'manage-setting-approve',
path: 'approve',
component: () => import('./pages/manage/setting/approve.vue'),
},
{
name: 'manage-setting-language',
path: 'language',

View File

@ -3,6 +3,7 @@
height: 100%;
display: flex;
flex-direction: column;
.apply-wrapper {
flex: 1;
height: 0;
@ -10,29 +11,35 @@
flex-direction: column;
position: relative;
background-color: #fafafa;
.apply-head {
display: flex;
align-items: center;
padding-bottom: 16px;
margin: 32px 32px 0 32px;
border-bottom: 1px solid #F4F4F5;
.apply-nav {
flex: 1;
display: flex;
align-items: center;
> h1 {
>h1 {
color: $primary-title-color;
font-size: 28px;
font-weight: 600;
}
}
}
.apply-row{
.apply-row {
flex: 1;
padding: 16px 30px;
.apply-col{
.apply-col {
margin-bottom: 16px;
>div{
>div {
font-size: 12px;
font-weight: bold;
background: #ffffff;
@ -44,12 +51,23 @@
gap: 10px;
cursor: pointer;
position: relative;
border: 1px solid #ececec;
>img{
border: 1px solid #f1f1f1;
@media (max-width: 510px) {
display: block;
text-align: center;
}
>img {
width: 40px;
height: 40px;
@media (max-width: 510px) {
margin-bottom: 5px;
}
}
.manage-box-top-report{
.manage-box-top-report {
position: absolute;
right: -6px;
top: -6px;
@ -60,29 +78,37 @@
}
}
.ivu-modal-wrap-apply{
.ivu-modal-wrap-apply {
position: relative;
overflow: auto;
overflow: auto;
height: 100%;
display: flex;
flex-direction: column;
.ivu-modal-wrap-apply-title{
max-width: calc(100vw - 40px);
overflow: auto;
.ivu-modal-wrap-apply-title {
line-height: 40px;
font-size: 20px;
font-weight: 500;
padding: 12px 30px;
>p{
>p {
float: right;
cursor: pointer;
color: #2b85e4;
font-size: 14px;
}
}
.ivu-modal-wrap-apply-body{
.ivu-modal-wrap-apply-body {
position: relative;
flex: 1;
padding: 8px 30px;
.setting-component-item,.setting-item{
//
.setting-component-item,
.setting-item {
position: absolute;
top: 0;
left: 0;
@ -91,29 +117,34 @@
flex: 1;
display: flex;
flex-direction: column;
>.ivu-form{
>.ivu-form {
padding: 8px 30px;
overflow: auto;
flex: 1;
.ivu-form-item{
padding: 12px 0 0 0;
.ivu-form-item .ivu-form-item-content{
display: flex;
>.ivu-form{
margin-bottom: 8px;
.ivu-form-item {
padding: 12px 0 0 0;
.ivu-form-item .ivu-form-item-content {
display: flex;
>.ivu-form {
margin-bottom: 8px;
}
}
}
}
.block-setting-box{
.block-setting-box {
position: relative;
padding: 24px 24px 4px;
margin: 24px 0 12px;
border-radius: 8px;
border: 1px solid #eeeeee;
transition: box-shadow 0.3s;
h3{
h3 {
position: absolute;
top: 0;
left: 24px;
@ -127,17 +158,21 @@
transform: translateY(-50%)
}
}
.setting-template{
.setting-template {
margin-bottom: 12px;
>div{
>div {
padding-right: 12px;
}
}
.export-data > p {
.export-data>p {
cursor: pointer;
color: #2b85e4;
}
.setting-footer{
.setting-footer {
flex-shrink: 0;
position: static;
padding: 16px;
@ -148,36 +183,47 @@
}
}
.ivu-tabs-content{
flex: 1;
//
.ivu-tabs {
display: flex;
flex-direction: column;
height: 100%;
.ivu-tabs-content {
height: 100%;
flex: 1;
}
}
// 机器人
.aibot-ul {
//
.ivu-modal-wrap-ul {
list-style-type: none;
overflow: hidden;
border-radius: 3px;
margin-right: -10px;
li{
li {
float: left;
width: calc(50% - 10px);
border: 1px solid #eeeeee;
box-sizing: border-box;
padding: 28px;
padding: 28px 20px;
position: relative;
text-align: center;
margin-right: 10px;
margin-bottom: 10px;
border-radius: 5px;
cursor: pointer;
img{
img {
display: block;
width: 50px;
height: 50px;
border-radius: 16px;
margin: 0 auto 12px;
}
h4{
h4 {
word-break: break-all;
text-overflow: ellipsis;
white-space: nowrap;
@ -192,21 +238,46 @@
padding: 0 12px;
margin-bottom: 6px;
}
p{
p {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 4;
@media (max-width: 510px) {
-webkit-line-clamp: 2;
}
}
.btn{
.btn {
color: #2b85e4;
margin: 26px auto 0;
cursor: pointer;
}
.load {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #9797971c;
line-height: 300px;
}
}
}
}
}
// 机器人
.aibot-warp {
position: relative;
height: 100%;
.ivu-form {
padding: 0;
overflow: hidden;
}
}
}
}

View File

@ -18,6 +18,7 @@
margin: 32px 20px 16px;
margin-bottom: 5px;
border-bottom: 1px solid #F4F4F5;
gap: 10px;
.approve-nav {
flex: 1;
@ -374,3 +375,86 @@
}
}
}
.page-approve-setting{
.approve-row {
padding: 24px;
overflow: auto;
margin: 0 !important;
.ivu-col {
margin-bottom: 16px;
.approve-col-box {
border-radius: 8px;
border: 1px solid #eeeeee;
transition: box-shadow 0.3s;
cursor: pointer;
&:hover {
box-shadow: 0 0 10px #e6ecfa;
}
}
.approve-col-add {
height: 100%;
font-size: 48px;
display: flex;
justify-content: center;
align-items: center;
color: #ededed;
min-height: 95px;
}
.approve-col-for {
padding: 16px;
padding-bottom: 13px;
display: flex;
flex-direction: column;
.approve-name{
font-weight: 500;
color: #135de6;
}
.divider{
margin: 12px 0;
margin-bottom: 9px;
}
.icon-warp{
position: relative;
}
> p {
display: flex;
align-items: center;
}
.approve-button-box {
display: flex;
justify-content: space-between;
align-items: center;
> p {
display: flex;
align-items: center;
> i {
font-size: 16px;
margin-left: 8px;
color: rgb(96, 98, 102);
}
}
}
}
}
}
}
//
.window-portrait .page-approve .approve-mains {
height: calc(100vh - 250px);
}

View File

@ -349,65 +349,6 @@
.setting-button {
margin-left: 8px;
}
.approve-row {
padding: 24px 40px;
overflow: auto;
.ivu-col {
margin-bottom: 8px;
.approve-col-box {
border-radius: 8px;
border: 1px solid #eeeeee;
transition: box-shadow 0.3s;
cursor: pointer;
&:hover {
box-shadow: 0 0 10px #e6ecfa;
}
}
.approve-col-add {
height: 100%;
font-size: 48px;
display: flex;
justify-content: center;
align-items: center;
color: #ededed;
min-height: 95px;
}
.approve-col-for {
padding: 16px;
padding-bottom: 13px;
display: flex;
flex-direction: column;
> p {
display: flex;
align-items: center;
}
.approve-button-box {
display: flex;
justify-content: space-between;
align-items: center;
> p {
display: flex;
align-items: center;
> i {
font-size: 16px;
margin-left: 8px;
color: rgb(96, 98, 102);
}
}
}
}
}
}
}
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="48" height="48" viewBox="0 0 48 48"><defs><clipPath id="master_svg0_3054_25658"><rect x="12" y="12" width="24" height="24" rx="0"/></clipPath></defs><g><rect x="0" y="0" width="48" height="48" rx="12" fill="#72A1F7" fill-opacity="1"/><g clip-path="url(#master_svg0_3054_25658)"><g><path d="M33.1767,19.46395L30.5723,21.34133L30.5723,19.01332C30.5723,17.34516,29.217,15.99442094,27.5489,16L15.01332,16C13.34911,15.999999801611,12,17.34911,12,19.01332L12,29.5822C12,31.2464,13.34911,32.595600000000005,15.01332,32.595600000000005L27.5489,32.595600000000005C29.217,32.6011,30.5723,31.2504,30.5723,29.5822L30.5723,27.2542L33.182500000000005,29.1259C33.7237,29.5146,34.436800000000005,29.5683,35.0302,29.2651C35.623599999999996,28.9619,35.9979,28.3525,36,27.6861L36,20.907980000000002C36.0011,20.23879,35.626599999999996,19.62559,35.0308,19.32086C34.4351,19.01614,33.7187,19.07142,33.1767,19.46395Z" fill="#FFFFFF" fill-opacity="1"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB