mirror of
https://github.com/kuaifan/dootask.git
synced 2026-01-19 22:58:12 +00:00
feat: 添加投票功能 - 100%
This commit is contained in:
parent
e9fd223808
commit
9a942c483d
@ -1993,7 +1993,7 @@ class DialogController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @api {post} api/dialog/msg/wordchain 15. 发送接龙消息
|
* @api {post} api/dialog/msg/wordchain 44. 发送接龙消息
|
||||||
*
|
*
|
||||||
* @apiDescription 需要token身份
|
* @apiDescription 需要token身份
|
||||||
* @apiVersion 1.0.0
|
* @apiVersion 1.0.0
|
||||||
@ -2018,8 +2018,6 @@ class DialogController extends AbstractController
|
|||||||
$text = trim(Request::input('text'));
|
$text = trim(Request::input('text'));
|
||||||
$list = Request::input('list');
|
$list = Request::input('list');
|
||||||
//
|
//
|
||||||
$result = [];
|
|
||||||
//
|
|
||||||
WebSocketDialog::checkDialog($dialog_id);
|
WebSocketDialog::checkDialog($dialog_id);
|
||||||
$strlen = mb_strlen($text);
|
$strlen = mb_strlen($text);
|
||||||
$noimglen = mb_strlen(preg_replace("/<img[^>]*?>/i", "", $text));
|
$noimglen = mb_strlen(preg_replace("/<img[^>]*?>/i", "", $text));
|
||||||
@ -2054,8 +2052,118 @@ class DialogController extends AbstractController
|
|||||||
'userid' => $userid,
|
'userid' => $userid,
|
||||||
'uuid' => $uuid ?: Base::generatePassword(36),
|
'uuid' => $uuid ?: Base::generatePassword(36),
|
||||||
];
|
];
|
||||||
$result = WebSocketDialogMsg::sendMsg(null, $dialog_id, 'word-chain', $msgData, $user->userid);
|
return WebSocketDialogMsg::sendMsg(null, $dialog_id, 'word-chain', $msgData, $user->userid);
|
||||||
//
|
|
||||||
return $result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {post} api/dialog/msg/vote 45. 发起投票
|
||||||
|
*
|
||||||
|
* @apiDescription 需要token身份
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup dialog
|
||||||
|
* @apiName msg__vote
|
||||||
|
*
|
||||||
|
* @apiParam {Number} dialog_id 对话ID
|
||||||
|
* @apiParam {String} text 投票内容
|
||||||
|
* @apiParam {Array} type 投票类型
|
||||||
|
* @apiParam {String} [uuid] 投票ID
|
||||||
|
* @apiParam {Array} [list] 投票列表
|
||||||
|
* @apiParam {Number} [multiple] 多选
|
||||||
|
* @apiParam {Number} [anonymous] 匿名
|
||||||
|
* @apiParam {Array} [vote] 投票
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function msg__vote()
|
||||||
|
{
|
||||||
|
$user = User::auth();
|
||||||
|
//
|
||||||
|
$dialog_id = intval(Request::input('dialog_id'));
|
||||||
|
$uuid = trim(Request::input('uuid'));
|
||||||
|
$text = trim(Request::input('text'));
|
||||||
|
$type = trim(Request::input('type','create'));
|
||||||
|
$multiple = intval(Request::input('multiple')) ?: 0;
|
||||||
|
$anonymous = intval(Request::input('anonymous')) ?: 0;
|
||||||
|
$list = Request::input('list');
|
||||||
|
$vote = Request::input('vote') ?: [];
|
||||||
|
$votes = is_array($vote) ? $vote : [$vote];
|
||||||
|
//
|
||||||
|
WebSocketDialog::checkDialog($dialog_id);
|
||||||
|
//
|
||||||
|
$action = null;
|
||||||
|
$userid = $user->userid;
|
||||||
|
$result = [];
|
||||||
|
if($type != 'create'){
|
||||||
|
if($type == 'vote' && empty($votes)){
|
||||||
|
return Base::retError('参数错误');
|
||||||
|
}
|
||||||
|
if (empty($uuid)) {
|
||||||
|
return Base::retError('参数错误');
|
||||||
|
}
|
||||||
|
$dialogMsgs = WebSocketDialogMsg::whereDialogId($dialog_id)
|
||||||
|
->whereType('vote')
|
||||||
|
->orderByDesc('created_at')
|
||||||
|
->where('msg','like',"%$uuid%")
|
||||||
|
->get();
|
||||||
|
//
|
||||||
|
if($type == 'again'){
|
||||||
|
$res = WebSocketDialogMsg::sendMsg(null, $dialog_id, 'vote', $dialogMsgs[0]->msg, $user->userid);
|
||||||
|
if(Base::isError($res)){
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
$result[] = $res['data'];
|
||||||
|
}else{
|
||||||
|
foreach($dialogMsgs as $dialogMsg){
|
||||||
|
$action = "change-{$dialogMsg->id}";
|
||||||
|
$msgData = $dialogMsg->msg;
|
||||||
|
if($type == 'finish'){
|
||||||
|
$msgData['state'] = 0;
|
||||||
|
}else{
|
||||||
|
$msgDataVotes = $msgData['votes'] ?? [];
|
||||||
|
if(in_array($userid,array_column($msgDataVotes,'userid'))){
|
||||||
|
return Base::retError('不能重复投票');
|
||||||
|
}
|
||||||
|
$msgDataVotes[] = [
|
||||||
|
'userid' => $userid,
|
||||||
|
'votes' => $votes,
|
||||||
|
];
|
||||||
|
$msgData['votes'] = $msgDataVotes;
|
||||||
|
}
|
||||||
|
$res = WebSocketDialogMsg::sendMsg($action, $dialog_id, 'vote', $msgData, $user->userid);
|
||||||
|
if(Base::isError($res)){
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
$result[] = $res['data'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
$strlen = mb_strlen($text);
|
||||||
|
$noimglen = mb_strlen(preg_replace("/<img[^>]*?>/i", "", $text));
|
||||||
|
if ($strlen < 1) {
|
||||||
|
return Base::retError('内容不能为空');
|
||||||
|
}
|
||||||
|
if ($noimglen > 200000) {
|
||||||
|
return Base::retError('内容最大不能超过200000字');
|
||||||
|
}
|
||||||
|
$msgData = [
|
||||||
|
'text' => $text,
|
||||||
|
'list' => $list,
|
||||||
|
'userid' => $userid,
|
||||||
|
'uuid' => $uuid ?: Base::generatePassword(36),
|
||||||
|
'multiple' => $multiple,
|
||||||
|
'anonymous' => $anonymous,
|
||||||
|
'votes' => [],
|
||||||
|
'state' => 1
|
||||||
|
];
|
||||||
|
$res = WebSocketDialogMsg::sendMsg($action, $dialog_id, 'vote', $msgData, $user->userid);
|
||||||
|
if(Base::isError($res)){
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
$result[] = $res['data'];
|
||||||
|
}
|
||||||
|
return Base::retSuccess('发送成功', $result);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -522,6 +522,7 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
switch ($data['type']) {
|
switch ($data['type']) {
|
||||||
case 'text':
|
case 'text':
|
||||||
case 'word-chain':
|
case 'word-chain':
|
||||||
|
case 'vote':
|
||||||
return $this->previewTextMsg($data['msg']['text'], $preserveHtml);
|
return $this->previewTextMsg($data['msg']['text'], $preserveHtml);
|
||||||
case 'record':
|
case 'record':
|
||||||
return "[语音]";
|
return "[语音]";
|
||||||
@ -860,10 +861,10 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
if (empty($dialogMsg)) {
|
if (empty($dialogMsg)) {
|
||||||
throw new ApiException('消息不存在');
|
throw new ApiException('消息不存在');
|
||||||
}
|
}
|
||||||
if ($dialogMsg->type !== 'text') {
|
if ($dialogMsg->type !== 'text' && $dialogMsg->type !== 'vote') {
|
||||||
throw new ApiException('此消息不支持此操作');
|
throw new ApiException('此消息不支持此操作');
|
||||||
}
|
}
|
||||||
if ($dialogMsg->userid != $sender) {
|
if ($dialogMsg->userid != $sender && $dialogMsg->type !== 'vote') {
|
||||||
throw new ApiException('仅支持修改自己的消息');
|
throw new ApiException('仅支持修改自己的消息');
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
|||||||
@ -480,3 +480,5 @@ Api接口文档
|
|||||||
保存任务详情至文件失败
|
保存任务详情至文件失败
|
||||||
保存任务详情至文件失败,请重试
|
保存任务详情至文件失败,请重试
|
||||||
移动成功
|
移动成功
|
||||||
|
|
||||||
|
不能重复投票
|
||||||
|
|||||||
@ -1434,6 +1434,7 @@ APP推送
|
|||||||
发起接龙
|
发起接龙
|
||||||
由
|
由
|
||||||
发起接龙,参与接龙目前共(*)人
|
发起接龙,参与接龙目前共(*)人
|
||||||
|
请输入接龙主题
|
||||||
请输入接龙内容
|
请输入接龙内容
|
||||||
可填写接龙格式
|
可填写接龙格式
|
||||||
重复内容将不再计入接龙结果
|
重复内容将不再计入接龙结果
|
||||||
@ -1443,3 +1444,24 @@ APP推送
|
|||||||
接龙结果
|
接龙结果
|
||||||
选择群组发起接龙
|
选择群组发起接龙
|
||||||
来自
|
来自
|
||||||
|
发起投票
|
||||||
|
投票结果
|
||||||
|
发起
|
||||||
|
请输入投票主题
|
||||||
|
请输入选项内容
|
||||||
|
允许多选
|
||||||
|
匿名投票
|
||||||
|
投票
|
||||||
|
匿名
|
||||||
|
实名
|
||||||
|
单选
|
||||||
|
多选
|
||||||
|
请选择后投票
|
||||||
|
立即投票
|
||||||
|
票
|
||||||
|
再次发送
|
||||||
|
再次发送投票?
|
||||||
|
结束投票
|
||||||
|
确定结束投票?
|
||||||
|
已发送
|
||||||
|
选择群组发起投票
|
||||||
|
|||||||
21
public/images/application/vote.svg
Normal file
21
public/images/application/vote.svg
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.4.1, 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{fill:#FFFFFF;}
|
||||||
|
</style>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path class="st0" d="M36,48H12C5.4,48,0,42.6,0,36V12C0,5.4,5.4,0,12,0h24c6.6,0,12,5.4,12,12v24C48,42.6,42.6,48,36,48z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="st1" d="M34.4,33.5H25l9.3-9.3c1.2-1.2,1.2-3.3,0-4.5l-6.8-6.8c-1.2-1.2-3.3-1.2-4.5,0L12.9,23.1
|
||||||
|
c-1.2,1.2-1.2,3.3,0,4.5l6,6h-6c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9H22c0,0,0,0,0,0c0,0,0,0,0,0h12.4
|
||||||
|
c0.5,0,0.9-0.4,0.9-0.9C35.3,33.9,34.9,33.5,34.4,33.5z M17.1,25.5c0.3-0.3,0.9-0.3,1.2,0l3.4,3.4c0.1,0.1,0.3,0.1,0.4,0l6.7-6.7
|
||||||
|
c0.3-0.3,0.9-0.3,1.2,0c0.3,0.3,0.3,0.9,0,1.2l-6.7,6.7c-0.4,0.4-0.9,0.6-1.5,0.6c-0.5,0-1.1-0.2-1.5-0.6l-3.4-3.4
|
||||||
|
C16.8,26.4,16.8,25.9,17.1,25.5L17.1,25.5z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@ -1 +1,38 @@
|
|||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1701947484494" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14371" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M671.1 405.7C524.4 405.7 405 525.1 405 671.8s119.4 266.1 266.1 266.1 266.1-119.4 266.1-266.1-119.4-266.1-266.1-266.1z m74.5 298.1H703v42.6c0 17.6-14.3 31.9-31.9 31.9-17.6 0-31.9-14.3-31.9-31.9v-42.6h-42.6c-17.6 0-31.9-14.3-31.9-31.9 0-17.6 14.3-31.9 31.9-31.9h42.6v-42.6c0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9V640h42.6c17.6 0 31.9 14.3 31.9 31.9 0 17.6-14.3 31.9-31.9 31.9zM202.6 509.7c0-170.2 138.5-308.7 308.7-308.7 22.3 0 44 2.5 65 7-47.5-73.3-129.8-122-223.4-122C206.2 86 86.8 205.4 86.8 352.1c0 94.1 49.3 176.8 123.2 224.1-4.7-21.4-7.4-43.6-7.4-66.5z" p-id="14372" fill="#1296db"></path><path d="M362.4 671.8c0-170.2 138.5-308.7 308.7-308.7 22.9 0 45.2 2.7 66.6 7.4-46.9-76-130.7-127-226.4-127-146.7 0-266.1 119.4-266.1 266.1 0 94.2 49.4 177 123.5 224.3-4.2-20-6.3-40.8-6.3-62.1z" p-id="14373" fill="#1296db"></path></svg>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.4.1, 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_00000018941778426702510620000006481262296390689922_);}
|
||||||
|
.st2{fill:#FFFFFF;}
|
||||||
|
</style>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path class="st0" d="M36,48H12C5.4,48,0,42.6,0,36V12C0,5.4,5.4,0,12,0h24c6.6,0,12,5.4,12,12v24C48,42.6,42.6,48,36,48z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<defs>
|
||||||
|
<rect id="SVGID_1_" x="12" y="12" width="24" height="24"/>
|
||||||
|
</defs>
|
||||||
|
<clipPath id="SVGID_00000141444668484078751200000003089482387513471677_">
|
||||||
|
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
|
||||||
|
</clipPath>
|
||||||
|
<g style="clip-path:url(#SVGID_00000141444668484078751200000003089482387513471677_);">
|
||||||
|
<g>
|
||||||
|
<path class="st2" d="M28.5,21c-4.1,0-7.5,3.4-7.5,7.5c0,4.1,3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5C36,24.4,32.6,21,28.5,21z
|
||||||
|
M30.6,29.4h-1.2v1.2c0,0.5-0.4,0.9-0.9,0.9c-0.5,0-0.9-0.4-0.9-0.9v-1.2h-1.2c-0.5,0-0.9-0.4-0.9-0.9c0-0.5,0.4-0.9,0.9-0.9
|
||||||
|
h1.2v-1.2c0-0.5,0.4-0.9,0.9-0.9c0.5,0,0.9,0.4,0.9,0.9v1.2h1.2c0.5,0,0.9,0.4,0.9,0.9C31.5,29,31,29.4,30.6,29.4z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="st2" d="M15.3,23.9c0-4.8,3.9-8.7,8.7-8.7c0.6,0,1.2,0.1,1.8,0.2c-1.3-2.1-3.7-3.4-6.3-3.4c-4.1,0-7.5,3.4-7.5,7.5
|
||||||
|
c0,2.7,1.4,5,3.5,6.3C15.3,25.2,15.3,24.6,15.3,23.9z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="st2" d="M19.8,28.5c0-4.8,3.9-8.7,8.7-8.7c0.6,0,1.3,0.1,1.9,0.2c-1.3-2.1-3.7-3.6-6.4-3.6c-4.1,0-7.5,3.4-7.5,7.5
|
||||||
|
c0,2.7,1.4,5,3.5,6.3C19.8,29.7,19.8,29.1,19.8,28.5z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.7 KiB |
5
resources/assets/js/functions/web.js
vendored
5
resources/assets/js/functions/web.js
vendored
@ -818,8 +818,11 @@
|
|||||||
if ($A.isJson(data)) {
|
if ($A.isJson(data)) {
|
||||||
switch (data.type) {
|
switch (data.type) {
|
||||||
case 'text':
|
case 'text':
|
||||||
case 'word-chain':
|
|
||||||
return $A.getMsgTextPreview(data.msg.text, imgClassName)
|
return $A.getMsgTextPreview(data.msg.text, imgClassName)
|
||||||
|
case 'word-chain':
|
||||||
|
return `[${$A.L('接龙')}]` + $A.getMsgTextPreview(data.msg.text, imgClassName)
|
||||||
|
case 'vote':
|
||||||
|
return `[${$A.L('投票')}]` + $A.getMsgTextPreview(data.msg.text, imgClassName)
|
||||||
case 'record':
|
case 'record':
|
||||||
return `[${$A.L('语音')}]`
|
return `[${$A.L('语音')}]`
|
||||||
case 'meeting':
|
case 'meeting':
|
||||||
|
|||||||
@ -191,11 +191,11 @@
|
|||||||
|
|
||||||
<!-- 发起接龙 -->
|
<!-- 发起接龙 -->
|
||||||
<UserSelect
|
<UserSelect
|
||||||
ref="wordChainRef"
|
ref="wordChainAndVoteRef"
|
||||||
v-model="sendData"
|
v-model="sendData"
|
||||||
:multiple-max="50"
|
:multiple-max="50"
|
||||||
:title="$L('选择群组发起接龙')"
|
:title="sendType == 'vote' ? $L('选择群组发起投票') : $L('选择群组发起接龙')"
|
||||||
:before-submit="onWordChain"
|
:before-submit="goWordChainAndVote"
|
||||||
:show-select-all="false"
|
:show-select-all="false"
|
||||||
:forced-radio="true"
|
:forced-radio="true"
|
||||||
:group="true"
|
:group="true"
|
||||||
@ -293,7 +293,8 @@ export default {
|
|||||||
scanLoginLoad: false,
|
scanLoginLoad: false,
|
||||||
scanLoginCode: '',
|
scanLoginCode: '',
|
||||||
//
|
//
|
||||||
sendData: []
|
sendData: [],
|
||||||
|
sendType: '',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
activated() {
|
activated() {
|
||||||
@ -319,41 +320,49 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
initList() {
|
initList() {
|
||||||
let applyList = [
|
let applyList = [
|
||||||
{ value: "approve", label: "审批中心" },
|
{ value: "approve", label: "审批中心", sort: 1 },
|
||||||
{ value: "report", label: "工作报告" },
|
{ value: "report", label: "工作报告", sort: 2 },
|
||||||
{ value: "okr", label: "OKR管理" },
|
{ value: "okr", label: "OKR管理", sort: 3 },
|
||||||
{ value: "robot", label: "AI机器人" },
|
{ value: "robot", label: "AI机器人", sort: 4 },
|
||||||
{ value: "signin", label: "签到" },
|
{ value: "signin", label: "签到", sort: 5 },
|
||||||
{ value: "meeting", label: "会议" },
|
{ value: "meeting", label: "会议", sort: 6 },
|
||||||
{ value: "calendar", label: "日历" },
|
{ value: "calendar", label: "日历", sort: 7 },
|
||||||
{ value: "word-chain", label: "接龙" },
|
{ value: "word-chain", label: "接龙", sort: 9 },
|
||||||
{ value: "vote", label: "投票" },
|
{ value: "vote", label: "投票", sort: 10 },
|
||||||
];
|
];
|
||||||
// wap模式
|
// wap模式
|
||||||
let appApplyList = this.windowOrientation != 'portrait' ? (
|
let appApplyList = this.windowOrientation != 'portrait' ? (
|
||||||
$A.isEEUiApp ? [
|
$A.isEEUiApp ? [
|
||||||
{ value: "scan", label: "扫一扫" }
|
{ value: "scan", label: "扫一扫", sort: 13 }
|
||||||
] : []
|
] : []
|
||||||
) : [
|
) : [
|
||||||
{ value: "file", label: "文件" },
|
{ value: "file", label: "文件", sort: 8 },
|
||||||
{ value: "addProject", label: "创建项目" },
|
{ value: "addProject", label: "创建项目", sort: 11 },
|
||||||
{ value: "addTask", label: "添加任务" },
|
{ value: "addTask", label: "添加任务", sort: 12 },
|
||||||
{ value: "scan", label: "扫一扫", show: $A.isEEUiApp },
|
{ value: "scan", label: "扫一扫", sort: 13 , show: $A.isEEUiApp },
|
||||||
{ value: "setting", label: "设置" }
|
{ value: "setting", label: "设置", sort: 14 }
|
||||||
];
|
];
|
||||||
// 管理员
|
// 管理员
|
||||||
let adminApplyList = !this.userIsAdmin ? [] : [
|
let adminApplyList = !this.userIsAdmin ? [] : [
|
||||||
{ value: "okrAnalyze", label: "OKR结果" },
|
{ value: "okrAnalyze", label: "OKR结果", sort: 15 },
|
||||||
{ value: "ldap", label: "LDAP" },
|
{ value: "ldap", label: "LDAP", sort: 16 },
|
||||||
{ value: "mail", label: "邮件" },
|
{ value: "mail", label: "邮件", sort: 17 },
|
||||||
{ value: "appPush", label: "APP推送" },
|
{ value: "appPush", label: "APP推送", sort: 18 },
|
||||||
{ value: "allUser", label: "团队管理" }
|
{ value: "allUser", label: "团队管理", sort: 19 }
|
||||||
].map((h) => {
|
].map((h) => {
|
||||||
h.type = 'admin';
|
h.type = 'admin';
|
||||||
return h;
|
return h;
|
||||||
});
|
});
|
||||||
//
|
//
|
||||||
this.applyList = [...applyList, ...appApplyList, ...adminApplyList];
|
this.applyList = [...applyList, ...appApplyList, ...adminApplyList].sort((a, b) => {
|
||||||
|
if (a.sort < b.sort) {
|
||||||
|
return -1;
|
||||||
|
} else if (a.sort > b.sort) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
getLogoPath(name) {
|
getLogoPath(name) {
|
||||||
name = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
name = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
||||||
@ -418,12 +427,10 @@ export default {
|
|||||||
$A.eeuiAppScan(this.scanResult);
|
$A.eeuiAppScan(this.scanResult);
|
||||||
return;
|
return;
|
||||||
case 'word-chain':
|
case 'word-chain':
|
||||||
this.sendData = [];
|
|
||||||
this.$refs.wordChainRef.onSelection()
|
|
||||||
return;
|
|
||||||
case 'vote':
|
case 'vote':
|
||||||
this.sendData = [];
|
this.sendData = [];
|
||||||
this.$refs.wordChainRef.onSelection()
|
this.sendType = item.value;
|
||||||
|
this.$refs.wordChainAndVoteRef.onSelection()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.$emit("on-click", item.value)
|
this.$emit("on-click", item.value)
|
||||||
@ -554,12 +561,12 @@ export default {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
// 前往接龙
|
// 前往接龙与投票
|
||||||
onWordChain(){
|
goWordChainAndVote(){
|
||||||
const dialog_id = Number(this.sendData[0].replace('d:', ''))
|
const dialog_id = Number(this.sendData[0].replace('d:', ''))
|
||||||
if(this.windowPortrait){
|
if(this.windowPortrait){
|
||||||
this.$store.dispatch("openDialog", dialog_id ).then(() => {
|
this.$store.dispatch("openDialog", dialog_id ).then(() => {
|
||||||
this.$store.state.dialogDroupWordChain = {
|
this.$store.state[ this.sendType == 'word-chain' ?'dialogDroupWordChain' : 'dialogGroupVote'] = {
|
||||||
type: 'create',
|
type: 'create',
|
||||||
dialog_id: dialog_id
|
dialog_id: dialog_id
|
||||||
}
|
}
|
||||||
@ -567,7 +574,7 @@ export default {
|
|||||||
}else{
|
}else{
|
||||||
this.goForward({ name: 'manage-messenger', params: { dialog_id: dialog_id}});
|
this.goForward({ name: 'manage-messenger', params: { dialog_id: dialog_id}});
|
||||||
setTimeout(()=>{
|
setTimeout(()=>{
|
||||||
this.$store.state.dialogDroupWordChain = {
|
this.$store.state[ this.sendType == 'word-chain' ?'dialogDroupWordChain' : 'dialogGroupVote'] = {
|
||||||
type: 'create',
|
type: 'create',
|
||||||
dialog_id: dialog_id
|
dialog_id: dialog_id
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
{{ $L('取消') }}
|
{{ $L('取消') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="chain-modal-title">
|
<div class="chain-modal-title">
|
||||||
{{ dialogGroupVote.type == 'create' ? $L('发起接龙') : $L('接龙结果') }}
|
{{ dialogGroupVote.type == 'create' ? $L('发起投票') : $L('投票结果') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="chain-modal-submit" :class="{'disabled': !isEdit}" @click="onSend" >
|
<div class="chain-modal-submit" :class="{'disabled': !isEdit}" @click="onSend" >
|
||||||
<div v-if="loadIng > 0" class="submit-loading"><Loading /></div>
|
<div v-if="loadIng > 0" class="submit-loading"><Loading /></div>
|
||||||
@ -44,15 +44,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<ul ref="wordChainListRef">
|
<ul ref="wordChainListRef">
|
||||||
<li v-for="(item,index) in list">
|
<li v-for="(item,index) in list">
|
||||||
<span>
|
<i class="taskfont" :class="{'disabled': list.length <= 2}" @click="onDel(index)"></i>
|
||||||
<i class="taskfont" @click="del"></i>
|
<Input v-model="item.text" :placeholder="$L('请输入选项内容')"/>
|
||||||
</span>
|
|
||||||
<Input v-model="item.text" :disabled="item.userid != userId" :placeholder="$L('请输入选项内容')"/>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="add">
|
<li class="add">
|
||||||
<i class="taskfont" @click="add"></i>
|
<i class="taskfont" @click="onAdd"></i>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<div class="switch-row" v-if="dialogGroupVote.type == 'create'">
|
||||||
|
<span class="label">{{ $L('允许多选') }}</span>
|
||||||
|
<iSwitch v-model="multiple" :true-value="1" :false-value="0"/>
|
||||||
|
</div>
|
||||||
|
<div class="switch-row" v-if="dialogGroupVote.type == 'create'">
|
||||||
|
<span class="label">{{ $L('匿名投票') }}</span>
|
||||||
|
<iSwitch v-model="anonymous" :true-value="1" :false-value="0"/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<Button type="default" @click="show=false">{{$L('取消')}}</Button>
|
<Button type="default" @click="show=false">{{$L('取消')}}</Button>
|
||||||
@ -73,6 +79,8 @@ export default {
|
|||||||
createId: 0,
|
createId: 0,
|
||||||
value: "",
|
value: "",
|
||||||
list: [],
|
list: [],
|
||||||
|
multiple: 0,
|
||||||
|
anonymous: 0,
|
||||||
|
|
||||||
oldData: '',
|
oldData: '',
|
||||||
loadIng: 0,
|
loadIng: 0,
|
||||||
@ -131,12 +139,10 @@ export default {
|
|||||||
this.createId = this.userId;
|
this.createId = this.userId;
|
||||||
this.list.push({
|
this.list.push({
|
||||||
id: Date.now(),
|
id: Date.now(),
|
||||||
userid: this.userId,
|
|
||||||
text: ""
|
text: ""
|
||||||
});
|
});
|
||||||
this.list.push({
|
this.list.push({
|
||||||
id: Date.now() + 1,
|
id: Date.now() + 1,
|
||||||
userid: this.userId,
|
|
||||||
text: ""
|
text: ""
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -151,23 +157,18 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
add(){
|
onAdd(){
|
||||||
this.list.push({
|
this.list.push({
|
||||||
id: Date.now(),
|
id: Date.now(),
|
||||||
type: 'text',
|
text: "",
|
||||||
userid: this.userId,
|
|
||||||
text: this.userInfo.nickname,
|
|
||||||
});
|
});
|
||||||
this.scrollTo();
|
this.scrollTo();
|
||||||
},
|
},
|
||||||
|
|
||||||
del(){
|
onDel(index){
|
||||||
this.list.push({
|
if( this.list.length > 2 ){
|
||||||
id: Date.now(),
|
this.list.splice(index, 1);
|
||||||
type: 'text',
|
}
|
||||||
userid: this.userId,
|
|
||||||
text: this.userInfo.nickname,
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
scrollTo(){
|
scrollTo(){
|
||||||
@ -177,44 +178,30 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
onSend() {
|
onSend() {
|
||||||
if( !this.isEdit ){
|
if(!this.isEdit){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const texts = this.list.map(h=> h.text);
|
//
|
||||||
if( texts.length != [...new Set(texts)].length ){
|
if(!this.value){
|
||||||
$A.modalConfirm({
|
$A.messageError("请输入投票主题");
|
||||||
content: '重复内容将不再计入接龙结果',
|
return;
|
||||||
cancelText: '返回编辑',
|
}
|
||||||
okText: '继续发送',
|
if(this.list.find(h=> !h.text)){
|
||||||
onOk: () => {
|
$A.messageError("请输入选项内容");
|
||||||
this.send()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.send();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 发送消息
|
|
||||||
*/
|
|
||||||
send() {
|
|
||||||
const list = [];
|
|
||||||
this.list.forEach(h=>{
|
|
||||||
if( list.map(h=> h.text).indexOf(h.text) == -1){
|
|
||||||
list.push(h);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//
|
//
|
||||||
this.loadIng++;
|
this.loadIng++;
|
||||||
this.$store.dispatch("call", {
|
this.$store.dispatch("call", {
|
||||||
url: 'dialog/msg/wordchain',
|
url: 'dialog/msg/vote',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: {
|
data: {
|
||||||
dialog_id: this.dialogGroupVote.dialog_id,
|
dialog_id: this.dialogGroupVote.dialog_id,
|
||||||
text: this.value,
|
text: this.value,
|
||||||
list: list,
|
list: this.list,
|
||||||
uuid: this.dialogGroupVote.msgData?.msg?.uuid || ''
|
uuid: this.dialogGroupVote.msgData?.msg?.uuid || '',
|
||||||
|
multiple: this.multiple,
|
||||||
|
anonymous: this.anonymous
|
||||||
}
|
}
|
||||||
}).then(({data}) => {
|
}).then(({data}) => {
|
||||||
this.show = false;
|
this.show = false;
|
||||||
|
|||||||
@ -35,10 +35,16 @@
|
|||||||
<span> {{ $L('发起,参与接龙目前共'+num+'人') }}</span>
|
<span> {{ $L('发起,参与接龙目前共'+num+'人') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="textarea">
|
<div class="textarea">
|
||||||
<Input ref="wordChainTextareaRef" v-model="value" type="textarea" :autosize="{minRows: 3,maxRows: 5}" :disabled="dialogDroupWordChain.type != 'create'" />
|
<Input ref="wordChainTextareaRef"
|
||||||
|
v-model="value"
|
||||||
|
type="textarea"
|
||||||
|
:autosize="{minRows: 3,maxRows: 5}"
|
||||||
|
:disabled="dialogDroupWordChain.type != 'create'"
|
||||||
|
:placeholder="$L('请输入接龙主题')"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<ul ref="wordChainListRef">
|
<ul ref="wordChainListRef">
|
||||||
<li v-for="(item,index) in list" v-if="item.type == 'case' && (dialogDroupWordChain.type == 'create' || item.text)">
|
<li v-for="(item) in list" v-if="item.type == 'case' && (dialogDroupWordChain.type == 'create' || item.text)">
|
||||||
<span>{{ $L('例') }}</span>
|
<span>{{ $L('例') }}</span>
|
||||||
<Input v-model="item.text" :placeholder="$L('可填写接龙格式')" :disabled="dialogDroupWordChain.type != 'create'" />
|
<Input v-model="item.text" :placeholder="$L('可填写接龙格式')" :disabled="dialogDroupWordChain.type != 'create'" />
|
||||||
</li>
|
</li>
|
||||||
@ -47,7 +53,7 @@
|
|||||||
<Input v-model="item.text" :disabled="item.userid != userId" :placeholder="$L('请输入接龙内容')"/>
|
<Input v-model="item.text" :disabled="item.userid != userId" :placeholder="$L('请输入接龙内容')"/>
|
||||||
</li>
|
</li>
|
||||||
<li class="add">
|
<li class="add">
|
||||||
<i class="taskfont" @click="add"></i>
|
<i class="taskfont" @click="onAdd"></i>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@ -154,7 +160,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
add(){
|
onAdd(){
|
||||||
this.list.push({
|
this.list.push({
|
||||||
id: Date.now(),
|
id: Date.now(),
|
||||||
type: 'text',
|
type: 'text',
|
||||||
@ -174,6 +180,16 @@ export default {
|
|||||||
if( !this.isEdit ){
|
if( !this.isEdit ){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
if(!this.value){
|
||||||
|
$A.messageError("请输入接龙主题");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( this.list.find(h=> !h.text && h.type != "case") ){
|
||||||
|
$A.messageError("请输入接龙内容");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//
|
||||||
const texts = this.list.map(h=> h.text);
|
const texts = this.list.map(h=> h.text);
|
||||||
if( texts.length != [...new Set(texts)].length ){
|
if( texts.length != [...new Set(texts)].length ){
|
||||||
$A.modalConfirm({
|
$A.modalConfirm({
|
||||||
@ -194,20 +210,11 @@ export default {
|
|||||||
*/
|
*/
|
||||||
send() {
|
send() {
|
||||||
const list = [];
|
const list = [];
|
||||||
let isEmpty = false;
|
|
||||||
this.list.forEach(h=>{
|
this.list.forEach(h=>{
|
||||||
if(!h.text && h.type != "case"){
|
if(h.text && list.map(h=> h.text).indexOf(h.text) == -1){
|
||||||
isEmpty = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( h.text && list.map(h=> h.text).indexOf(h.text) == -1){
|
|
||||||
list.push(h);
|
list.push(h);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if(isEmpty){
|
|
||||||
$A.messageError("请输入接龙内容");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
this.loadIng++;
|
this.loadIng++;
|
||||||
this.$store.dispatch("call", {
|
this.$store.dispatch("call", {
|
||||||
|
|||||||
@ -84,6 +84,54 @@
|
|||||||
<li @click="onWordChain" class="participate">{{ $L('参与接龙') }}<span>></span></li>
|
<li @click="onWordChain" class="participate">{{ $L('参与接龙') }}<span>></span></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
<!--投票-->
|
||||||
|
<div v-else-if="msgData.type === 'vote'" class="content-text content-word-vote no-dark-content">
|
||||||
|
<div class="vote-msg-head">
|
||||||
|
<i class="taskfont"></i> {{ $L('投票') }}
|
||||||
|
<span>{{ msgData.msg.multiple == 1 ? $L('多选') : $L('单选')}}</span>
|
||||||
|
<span>{{ msgData.msg.multiple == 1 ? $L('匿名') : $L('实名')}}</span>
|
||||||
|
</div>
|
||||||
|
<pre v-html="$A.formatTextMsg(msgData.msg.text, userId)"></pre>
|
||||||
|
<template v-if="(msgData.msg.votes || []).filter(h=>h.userid == userId).length == 0">
|
||||||
|
<RadioGroup v-if="msgData.msg.multiple == 0" v-model="msgData.msg._vote" vertical>
|
||||||
|
<Radio v-for="(item,index) in (msgData.msg.list || [])" :label="item.id" :key="index">
|
||||||
|
{{item.text}}
|
||||||
|
</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
<CheckboxGroup v-else v-model="msgData.msg._vote">
|
||||||
|
<Checkbox v-for="(item,index) in (msgData.msg.list || [])" :label="item.id" :key="index">
|
||||||
|
{{item.text}}
|
||||||
|
</Checkbox>
|
||||||
|
</CheckboxGroup>
|
||||||
|
<div class="btn-row no-dark-content">
|
||||||
|
<Button v-if="(msgData.msg._vote || []).length == 0" class="ivu-btn" disabled>{{$L("请选择后投票")}}</Button>
|
||||||
|
<Button v-else class="ivu-btn" :loading="msgData.msg._loadIng > 0" @click="onVote('vote',msgData)">{{$L("立即投票")}}</Button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="vote-result-body">
|
||||||
|
<ul>
|
||||||
|
<li v-for="item in (msgData.msg.list || [])">
|
||||||
|
<div class="vote-option-title">{{ item.text }}</div>
|
||||||
|
<div class="ticket-num">
|
||||||
|
<span>{{ getVoteProgress(msgData.msg,item.id).num }}{{$L('票')}}</span>
|
||||||
|
<span>{{ getVoteProgress(msgData.msg,item.id).progress + '%' }}</span>
|
||||||
|
</div>
|
||||||
|
<Progress :percent="Number(getVoteProgress(msgData.msg,item.id).progress)" :stroke-width="5" hide-info/>
|
||||||
|
<div v-if="msgData.msg.anonymous" class="avatar-row">
|
||||||
|
<template v-for="votes in (msgData.msg.votes || []).filter(h=>h.votes.indexOf(item.id) != -1)">
|
||||||
|
<UserAvatar :userid="votes.userid" :size="18" />
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="btn-row no-dark-content" v-if="msgData.msg.state == 1 && msgData.msg.userid == userId">
|
||||||
|
<Button class="ivu-btn" :loading="msgData.msg._loadIng > 0" @click="onVote('again',msgData)">{{$L("再次发送")}}</Button>
|
||||||
|
<Button class="ivu-btn" :loading="msgData.msg._loadIng > 0" @click="onVote('finish',msgData)">{{$L("结束投票")}}</Button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
<!--等待-->
|
<!--等待-->
|
||||||
<div v-else-if="msgData.type === 'loading'" class="content-loading">
|
<div v-else-if="msgData.type === 'loading'" class="content-loading">
|
||||||
<Icon v-if="msgData.error === true" type="ios-alert-outline" />
|
<Icon v-if="msgData.error === true" type="ios-alert-outline" />
|
||||||
@ -533,6 +581,55 @@ export default {
|
|||||||
|
|
||||||
unfoldWordChain(e){
|
unfoldWordChain(e){
|
||||||
e.target.parentNode?.parentNode?.classList.add('expand')
|
e.target.parentNode?.parentNode?.classList.add('expand')
|
||||||
|
},
|
||||||
|
|
||||||
|
onVote(type,msgData){
|
||||||
|
if(type != 'vote'){
|
||||||
|
$A.modalConfirm({
|
||||||
|
content: type == 'finish' ? '确定结束投票?': '再次发送投票?',
|
||||||
|
cancelText: '取消',
|
||||||
|
okText: '确定',
|
||||||
|
onOk: () => {
|
||||||
|
this.vote(type,msgData);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.vote(type,msgData);
|
||||||
|
},
|
||||||
|
|
||||||
|
vote(type,msgData){
|
||||||
|
this.$set(msgData.msg,'_loadIng',1)
|
||||||
|
this.$store.dispatch("call", {
|
||||||
|
url: 'dialog/msg/vote',
|
||||||
|
method: 'post',
|
||||||
|
data: {
|
||||||
|
dialog_id: msgData.dialog_id,
|
||||||
|
uuid: msgData.msg.uuid,
|
||||||
|
vote: msgData.msg._vote || [],
|
||||||
|
type: type
|
||||||
|
}
|
||||||
|
}).then(({data}) => {
|
||||||
|
if(type == 'again'){
|
||||||
|
$A.messageSuccess("已发送");
|
||||||
|
}
|
||||||
|
data.forEach(d => {
|
||||||
|
this.$store.dispatch("saveDialogMsg", d );
|
||||||
|
});
|
||||||
|
}).catch(({msg}) => {
|
||||||
|
$A.modalError(msg);
|
||||||
|
}).finally(_ => {
|
||||||
|
this.$set(msgData.msg,'_loadIng',0)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
getVoteProgress(msgData, id){
|
||||||
|
const num = msgData.votes.filter(h=>(h.votes || '').indexOf(id) != -1).length
|
||||||
|
let progress = '0.00';
|
||||||
|
if(num){
|
||||||
|
progress = (msgData.votes.length / num * 100).toFixed(2)
|
||||||
|
}
|
||||||
|
return {num, progress};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,7 +57,6 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
max-height: calc(100vh - 370px);
|
max-height: calc(100vh - 370px);
|
||||||
.source{
|
.source{
|
||||||
padding-top: 10px;
|
|
||||||
margin-right: 32px;
|
margin-right: 32px;
|
||||||
span{
|
span{
|
||||||
color: #84C56A;
|
color: #84C56A;
|
||||||
@ -93,26 +92,47 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
padding: 5px 0;
|
padding: 5px 0;
|
||||||
|
color: #7f7f7f;
|
||||||
span{
|
span{
|
||||||
min-width: 30px;
|
min-width: 28px;
|
||||||
height: 30px;
|
height: 28px;
|
||||||
line-height: 30px;
|
line-height: 28px;
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
background-color: #f2f2f2;
|
background-color: #f2f2f2;
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #7f7f7f;
|
|
||||||
|
}
|
||||||
|
.taskfont{
|
||||||
|
font-size: 28px;
|
||||||
|
cursor: pointer;
|
||||||
|
line-height: 34px;
|
||||||
|
user-select: none;
|
||||||
|
transform: scale(0.92);
|
||||||
|
&.disabled{
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: no-drop;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
&.add{
|
&.add{
|
||||||
.taskfont{
|
.taskfont{
|
||||||
font-size: 30px;
|
line-height: 32px;
|
||||||
cursor: pointer;
|
transform: scale(1);
|
||||||
line-height: 30px;
|
|
||||||
user-select: none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.switch-row{
|
||||||
|
padding: 10px 5px;
|
||||||
|
margin: 0 32px 0 0;
|
||||||
|
display: flex;
|
||||||
|
border-top: 1px solid #f0f0f0;
|
||||||
|
span.label{
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
&:last-child{
|
||||||
|
border-bottom: 1px solid #f0f0f0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,6 +147,9 @@ body.window-portrait {
|
|||||||
}
|
}
|
||||||
.word-chain-body{
|
.word-chain-body{
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
|
ul{
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -990,6 +990,86 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.content-word-vote{
|
||||||
|
min-width: 200px;
|
||||||
|
max-width: 260px;
|
||||||
|
.vote-msg-head{
|
||||||
|
margin-bottom: 8px;
|
||||||
|
color: #0bc037;
|
||||||
|
line-height: 18px;
|
||||||
|
span{
|
||||||
|
padding: 2px 4px;
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #dee2fa;
|
||||||
|
margin: 0 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #7076e4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ivu-checkbox-group,.ivu-radio-group{
|
||||||
|
margin-top: 10px;
|
||||||
|
width: 100%;
|
||||||
|
.ivu-checkbox-wrapper,.ivu-radio-wrapper{
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 34px;
|
||||||
|
line-height: 34px;
|
||||||
|
.ivu-checkbox-inner{
|
||||||
|
border-radius: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.vote-result-body{
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: 14px;
|
||||||
|
ul{
|
||||||
|
list-style-type:none;
|
||||||
|
li{
|
||||||
|
margin-bottom: 14px;
|
||||||
|
.vote-option-title{
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
.ivu-progress-inner{
|
||||||
|
background-color: #e2e2e2;
|
||||||
|
}
|
||||||
|
.avatar-row{
|
||||||
|
gap: 2px;
|
||||||
|
margin-top: 2px;
|
||||||
|
display: flex;
|
||||||
|
overflow: auto;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
background: none;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
}
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background: #d4d4d4;
|
||||||
|
-webkit-border-radius: 10px;
|
||||||
|
-moz-border-radius: 10px;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
li:last-child{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
>span,.ticket-num span{
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn-row{
|
||||||
|
display: flex;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0 5px 0;
|
||||||
|
gap: 10px;
|
||||||
|
.ivu-btn{
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dialog-emoji {
|
.dialog-emoji {
|
||||||
@ -1242,16 +1322,17 @@
|
|||||||
|
|
||||||
.content-word-chain{
|
.content-word-chain{
|
||||||
ul{
|
ul{
|
||||||
li{
|
li.participate, li .expand{
|
||||||
.expand{
|
|
||||||
color: #23241f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
li.participate{
|
|
||||||
color: #23241f;
|
color: #23241f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.content-word-vote{
|
||||||
|
.vote-msg-head{
|
||||||
|
color: #23241f;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dialog-emoji {
|
.dialog-emoji {
|
||||||
|
|||||||
21
resources/assets/statics/public/images/application/vote.svg
Normal file
21
resources/assets/statics/public/images/application/vote.svg
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.4.1, 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{fill:#FFFFFF;}
|
||||||
|
</style>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path class="st0" d="M36,48H12C5.4,48,0,42.6,0,36V12C0,5.4,5.4,0,12,0h24c6.6,0,12,5.4,12,12v24C48,42.6,42.6,48,36,48z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="st1" d="M34.4,33.5H25l9.3-9.3c1.2-1.2,1.2-3.3,0-4.5l-6.8-6.8c-1.2-1.2-3.3-1.2-4.5,0L12.9,23.1
|
||||||
|
c-1.2,1.2-1.2,3.3,0,4.5l6,6h-6c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9H22c0,0,0,0,0,0c0,0,0,0,0,0h12.4
|
||||||
|
c0.5,0,0.9-0.4,0.9-0.9C35.3,33.9,34.9,33.5,34.4,33.5z M17.1,25.5c0.3-0.3,0.9-0.3,1.2,0l3.4,3.4c0.1,0.1,0.3,0.1,0.4,0l6.7-6.7
|
||||||
|
c0.3-0.3,0.9-0.3,1.2,0c0.3,0.3,0.3,0.9,0,1.2l-6.7,6.7c-0.4,0.4-0.9,0.6-1.5,0.6c-0.5,0-1.1-0.2-1.5-0.6l-3.4-3.4
|
||||||
|
C16.8,26.4,16.8,25.9,17.1,25.5L17.1,25.5z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@ -1 +1,38 @@
|
|||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1701947484494" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14371" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M671.1 405.7C524.4 405.7 405 525.1 405 671.8s119.4 266.1 266.1 266.1 266.1-119.4 266.1-266.1-119.4-266.1-266.1-266.1z m74.5 298.1H703v42.6c0 17.6-14.3 31.9-31.9 31.9-17.6 0-31.9-14.3-31.9-31.9v-42.6h-42.6c-17.6 0-31.9-14.3-31.9-31.9 0-17.6 14.3-31.9 31.9-31.9h42.6v-42.6c0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9V640h42.6c17.6 0 31.9 14.3 31.9 31.9 0 17.6-14.3 31.9-31.9 31.9zM202.6 509.7c0-170.2 138.5-308.7 308.7-308.7 22.3 0 44 2.5 65 7-47.5-73.3-129.8-122-223.4-122C206.2 86 86.8 205.4 86.8 352.1c0 94.1 49.3 176.8 123.2 224.1-4.7-21.4-7.4-43.6-7.4-66.5z" p-id="14372" fill="#1296db"></path><path d="M362.4 671.8c0-170.2 138.5-308.7 308.7-308.7 22.9 0 45.2 2.7 66.6 7.4-46.9-76-130.7-127-226.4-127-146.7 0-266.1 119.4-266.1 266.1 0 94.2 49.4 177 123.5 224.3-4.2-20-6.3-40.8-6.3-62.1z" p-id="14373" fill="#1296db"></path></svg>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.4.1, 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_00000018941778426702510620000006481262296390689922_);}
|
||||||
|
.st2{fill:#FFFFFF;}
|
||||||
|
</style>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path class="st0" d="M36,48H12C5.4,48,0,42.6,0,36V12C0,5.4,5.4,0,12,0h24c6.6,0,12,5.4,12,12v24C48,42.6,42.6,48,36,48z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<defs>
|
||||||
|
<rect id="SVGID_1_" x="12" y="12" width="24" height="24"/>
|
||||||
|
</defs>
|
||||||
|
<clipPath id="SVGID_00000141444668484078751200000003089482387513471677_">
|
||||||
|
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
|
||||||
|
</clipPath>
|
||||||
|
<g style="clip-path:url(#SVGID_00000141444668484078751200000003089482387513471677_);">
|
||||||
|
<g>
|
||||||
|
<path class="st2" d="M28.5,21c-4.1,0-7.5,3.4-7.5,7.5c0,4.1,3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5C36,24.4,32.6,21,28.5,21z
|
||||||
|
M30.6,29.4h-1.2v1.2c0,0.5-0.4,0.9-0.9,0.9c-0.5,0-0.9-0.4-0.9-0.9v-1.2h-1.2c-0.5,0-0.9-0.4-0.9-0.9c0-0.5,0.4-0.9,0.9-0.9
|
||||||
|
h1.2v-1.2c0-0.5,0.4-0.9,0.9-0.9c0.5,0,0.9,0.4,0.9,0.9v1.2h1.2c0.5,0,0.9,0.4,0.9,0.9C31.5,29,31,29.4,30.6,29.4z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="st2" d="M15.3,23.9c0-4.8,3.9-8.7,8.7-8.7c0.6,0,1.2,0.1,1.8,0.2c-1.3-2.1-3.7-3.4-6.3-3.4c-4.1,0-7.5,3.4-7.5,7.5
|
||||||
|
c0,2.7,1.4,5,3.5,6.3C15.3,25.2,15.3,24.6,15.3,23.9z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="st2" d="M19.8,28.5c0-4.8,3.9-8.7,8.7-8.7c0.6,0,1.3,0.1,1.9,0.2c-1.3-2.1-3.7-3.6-6.4-3.6c-4.1,0-7.5,3.4-7.5,7.5
|
||||||
|
c0,2.7,1.4,5,3.5,6.3C19.8,29.7,19.8,29.1,19.8,28.5z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.7 KiB |
Loading…
x
Reference in New Issue
Block a user