Commit 47b626e4 authored by 张豪's avatar 张豪

Merge branch 'dev'

parents 8fdd8b35 dd9517ec
......@@ -36,7 +36,7 @@ pipeline:
- /var/run/docker.sock:/var/run/docker.sock
base: registry.cn-qingdao.aliyuncs.com/wod-devops/ui-base:2.0.0
repo: wod/apaas-ui
version: "v3.1.0"
version: "v3.2.0"
channel: alpha
registry: registry.cn-qingdao.aliyuncs.com
secrets:
......@@ -52,7 +52,7 @@ pipeline:
- /var/run/docker.sock:/var/run/docker.sock
base: registry.cn-qingdao.aliyuncs.com/wod-devops/ui-base:2.0.0
repo: wod/apaas-ui
version: "v3.1.0"
version: "v3.2.0"
registry: registry.cn-qingdao.aliyuncs.com
secrets:
- source: REGISTRY_USER_ALIYUN
......@@ -87,3 +87,4 @@ pipeline:
- source: REGISTRY_PASSWORD_ALIYUN
target: REGISTRY_PASSWORD
branches: [master,dev]
......@@ -35,12 +35,27 @@ module.exports = {
rules: [
{
test: /\.vue$/,
use:[
{
loader: 'thread-loader'
},
{
loader: 'vue-loader',
options: vueLoaderConfig
},
],
},
{
test: /\.js$/,
use:[
{
loader: 'thread-loader'
},
{
loader: 'babel-loader',
}
],
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
......
......@@ -24,6 +24,13 @@ module.exports = {
"^/awecloud": ""
}
},
"/vmap": {
target: "https://apaas3.wodcloud.com/vmap/",
changeOrigin: true,
pathRewrite: {
"^/vmap": ""
}
},
},
// Various Dev Server settings
host: "localhost", // can be overwritten by process.env.HOST
......
This diff is collapsed.
......@@ -7,6 +7,7 @@ export const lang = {
personal_center: "个人中心",
profile: "个人档案",
message_center: "消息中心",
my_questions_and_answers: "我的问答",
// unit of purchase duration
by_year: "按年",
......
src/assets/imgs/img_head.png

2.15 KB | W: | H:

src/assets/imgs/img_head.png

3.09 KB | W: | H:

src/assets/imgs/img_head.png
src/assets/imgs/img_head.png
src/assets/imgs/img_head.png
src/assets/imgs/img_head.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -80,9 +80,12 @@
</div>
<div class="list-container" v-else>
<list-table
ref="listTable"
:header="listHeader"
:data="listData"
:padding-left="listPaddingLeft"
:select="listSelect"
@select="selectAction"
></list-table>
</div>
......@@ -146,6 +149,10 @@ export default {
type: String,
default: () => "请输入关键字",
},
listSelect: {
type: Boolean,
default: false,
},
},
data: () => ({
showListFilter: false,
......@@ -223,6 +230,15 @@ export default {
});
}, 200);
},
selectAction(selectedItems) {
this.$emit("list-select", selectedItems);
},
clearSelection() {
this.$refs.listTable.clearSelection();
},
setSelectedRow(row, flag) {
this.$refs.listTable.setSelectedRow(row, flag);
},
},
mounted() {
this.initOtherFilter();
......
<template>
<div class="apass_table">
<el-table
ref="apassTable"
:data="data"
@sort-change="sortChange"
@row-click="rowClick"
@selection-change="selectAction"
:row-class-name="rowClassName"
>
<el-table-column
v-if="paddingLeft > 10"
:width="paddingLeft - 10"
></el-table-column>
<el-table-column type="selection" width="80" align="center" v-if="select">
<!-- checkbox -->
</el-table-column>
<el-table-column
v-for="(item, index) in header"
:label="item.label"
......@@ -296,13 +301,17 @@ export default {
default: () => 50,
},
height: {
type: Number,
type: [Number,String],
default: null,
},
rowClassName: {
type: Function,
default: null,
},
select: {
type: Boolean,
default: false,
},
},
data() {
return {
......@@ -395,6 +404,15 @@ export default {
leaveMoreActionList() {
this.showMoreActionList = false;
},
selectAction(selectedItems) {
this.$emit("select", selectedItems);
},
clearSelection() {
this.$refs.apassTable.clearSelection();
},
setSelectedRow(row, flag) {
this.$refs.apassTable.toggleRowSelection(row, flag);
},
},
};
</script>
......
<template>
<el-upload
ref="upload"
drag
action="/apaas/static/file/upload"
:data="{
directory: 'sdk',
uniqueCode: false,
}"
:file-list="fileList"
:before-upload="beforeUpload"
:on-success="uploadSuccess"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
<p>将文件拖到此处,或<em>点击上传</em></p>
<p class="upload_tip" v-if="tip" v-text="tip"></p>
</div>
</el-upload>
</template>
<script>
export default {
model: {
prop: "url",
event: "change",
},
props: {
url: {
type: String,
default: "",
},
tip: {
type: String,
default: "",
},
},
data() {
return {
preUrl: "",
};
},
computed: {
fileList() {
let list = [];
if (this.url) {
let path = this.url.split("/");
list = [
{
name: path[path.length - 1],
url: this.url,
},
];
}
return list;
},
},
methods: {
getFileType(fileName) {
let startIndex = fileName.lastIndexOf(".");
if (startIndex != -1) {
return fileName
.substring(startIndex + 1, fileName.length)
.toLowerCase();
} else {
return "";
}
},
beforeUpload(file) {
const filtType = this.getFileType(file.name);
if (filtType === "rar" || filtType === "zip") {
this.preUrl = this.url;
return true;
} else {
this.$message.error("仅支持rar和zip格式!");
return false;
}
},
uploadSuccess({ data }) {
this.$emit("change", data);
// 替换文件后要把旧文件删除掉
if (this.preUrl) {
this.$http
.delete("/apaas/static/file/delete", {
params: {
url: this.preUrl,
},
})
.then(({ data }) => {
if (data.success === 1) {
this.preUrl = "";
}
});
}
},
},
};
</script>
<style scoped>
.upload_tip {
font-size: 12px;
line-height: 20px;
color: #a9aec0;
}
</style>
<template>
<div class="doc_width_nav">
<div class="part doc_part">
<h3 class="part_title">
<span>{{ title || "-" }}</span>
<span>更新时间:{{ time || "-" }}</span>
</h3>
<div
class="part_content doc_content apaas_scroll"
v-html="content"
ref="docContent"
></div>
</div>
<div class="part nav_part">
<h3 class="part_title">
<span>导航</span>
</h3>
<ul class="part_content nav_content apaas_scroll">
<li
v-for="(item, index) in navTree"
:class="[
'text_clip',
'level_' + item.level,
item.id === curNav ? ' current' : '',
]"
:key="index"
>
<a v-text="item.title" @click="clickNav(item)"></a>
</li>
</ul>
</div>
</div>
</template>
<script>
export default {
props: {
richText: {
type: String,
defalut: "",
},
title: {
type: String,
defalut: "",
},
time: {
type: String,
defalut: "",
},
},
data() {
return {
content: "",
navTree: [],
curNav: "",
};
},
watch: {
richText() {
this.translate();
},
},
mounted() {
this.translate();
},
methods: {
translate() {
let content = this.richText || "";
if (content) {
let titles =
content.match(
/<h1(([\s\S])*?)<\/h1>|<h2(([\s\S])*?)<\/h2>|<h3(([\s\S])*?)<\/h3>/g
) || [];
let time = new Date().getTime();
let pre_h1_index = 0;
let pre_h2_index = 0;
let pre_h3_index = 0;
let newTitles = titles
.map((title, index) => {
let newTitle = title;
let level = 0;
let id = "";
if (title.match(/<h1(([\s\S])*?)<\/h1>/g)) {
pre_h1_index++;
pre_h2_index = 0;
pre_h3_index = 0;
level = 1;
id = `nav_${pre_h1_index}` + "_" + time;
newTitle = title.replace(/<h1/g, `<h1 id="${id}"`);
} else if (title.match(/<h2(([\s\S])*?)<\/h2>/g)) {
pre_h2_index++;
pre_h3_index = 0;
level = 2;
id = `nav_${pre_h1_index}_${pre_h2_index}` + "_" + time;
newTitle = title.replace(/<h2/g, `<h2 id="${id}"`);
} else if (title.match(/<h3(([\s\S])*?)<\/h3>/g)) {
pre_h3_index++;
level = 3;
id = `nav_${pre_h1_index}_${pre_h2_index}_${pre_h3_index}`;
newTitle = title.replace(/<h3/g, `<h3 id="${id}"`) + "_" + time;
}
content = content.replace(new RegExp(title), newTitle);
return {
level,
id,
title: title.replace(/<\/?.+?>/g, ""),
};
})
.filter((item) => item.title);
this.content = content;
this.navTree = newTitles;
this.curNav = (newTitles[0] && newTitles[0].id) || "";
}
},
clickNav(item) {
let target = document.querySelector(`#${item.id}`);
this.setScroll(target, this.$refs.docContent);
this.curNav = item.id;
},
setScroll(el, parentEl) {
let actualTop = el.offsetTop;
let current = el.offsetParent;
while (current !== null) {
actualTop += current.offsetTop;
current = current.offsetParent;
}
parentEl.scrollTop = actualTop - parentEl.offsetTop;
},
},
};
</script>
<style scoped>
.doc_width_nav {
display: flex;
justify-content: flex-start;
align-items: stretch;
}
.doc_width_nav > .part {
background-color: #fff;
border-radius: 10px;
padding-bottom: 20px;
box-sizing: border-box;
box-sizing: 0;
}
.doc_width_nav > .part + .part {
margin-left: 20px;
}
.doc_part {
flex-grow: 1;
}
.nav_part {
width: 270px;
flex-shrink: 0;
}
.part_title {
padding: 10px 20px;
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
}
.part_title::after {
content: "";
position: absolute;
right: 0;
left: 0;
bottom: 0;
border-bottom: 1px solid #e3e5ef;
}
.part_title > span:nth-child(1) {
font-size: 18px;
font-weight: bold;
line-height: 36px;
color: #58617a;
position: relative;
padding-left: 15px;
}
.part_title > span:nth-child(1)::before {
content: "";
width: 4px;
height: 18px;
background-color: #515fe7;
border-radius: 2px;
position: absolute;
top: 10px;
left: 0;
}
.part_title > span:nth-child(2) {
font-size: 14px;
line-height: 24px;
color: #8890a7;
padding-left: 20px;
background-image: url("/../assets/imgs/shop_ic_updatetime.png");
background-repeat: no-repeat;
background-position: left center;
}
.part_content {
height: calc(100% - 76px);
margin-top: 20px;
box-sizing: border-box;
overflow: auto;
}
.doc_content {
padding: 0 20px;
}
.nav_content {
padding-left: 20px;
}
.nav_content > li > a {
display: block;
height: 30px;
padding: 0 20px;
font-size: 14px;
line-height: 30px;
color: #58617a;
text-decoration: none;
cursor: pointer;
}
.nav_content > li.level_1 > a {
color: #242c43;
}
.nav_content > li.level_2 > a {
text-indent: 2em;
}
.nav_content > li.level_3 > a {
text-indent: 4em;
}
.nav_content > li.current > a {
background-color: #e6ebfe;
color: #515fe7;
}
</style>
......@@ -14,28 +14,34 @@
class="eeupload"
action="/apaas/static/image/upload"
:file-list="fileArray"
:list-type="type=='picture'?'picture-card':''"
:list-type="type == 'picture' ? 'picture-card' : ''"
:limit="max"
:multiple="multiple"
:on-remove="handleRemove"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
:class="{hide:hideUpload || readOnly}"
:class="{ hide: hideUpload || readOnly }"
:readOnly="readOnly"
:data="anotherData"
:drag="drag"
:disabled="disabled"
:accept="accepts"
>
<div v-if="drag">
<i class="el-icon-upload"></i>
<div class="el-upload__text">
将文件拖到此处,或
<em>点击上传</em>
<span class="up_fz">将文件拖到此处,或</span>
<em>点击上传</em><br />
<span class="up_fz">{{ up_fz }}</span>
</div>
</div>
<el-button size="small" type="primary" v-if="!drag && type=='default'">上传文件</el-button>
<div slot="tip" class="el-upload__tip" v-if="!drag && type=='mp3'">支持文件格式:.mp3,单个文件不能超过20M。</div>
<i class="el-icon-plus" v-if="!drag && type=='picture'"></i>
<el-button size="small" type="primary" v-if="!drag && type == 'default'"
>上传文件</el-button
>
<div slot="tip" class="el-upload__tip" v-if="!drag && type == 'mp3'">
支持文件格式:.mp3,单个文件不能超过20M。
</div>
<i class="el-icon-plus" v-if="!drag && type == 'picture'"></i>
</el-upload>
</div>
</div>
......@@ -97,9 +103,30 @@ export default {
type: Boolean,
default: false,
},
up_fz: {
type: String,
default: "",
},
accepts: {
type: String,
default: "",
},
},
watch: {
list(value) {
this.getFileArray(value);
},
},
created() {
if (!this.unique) {
this.anotherData.uniqueCode = this.unique;
}
},
mounted() {
this.getFileArray(this.list);
},
methods: {
getFileArray(value) {
var getListImg = [];
if (value && value.length != 0) {
for (var i = 0; i < value.length; i++) {
......@@ -112,13 +139,6 @@ export default {
this.fileArray = [...getListImg];
this.hideUpload = this.fileArray.length >= this.max;
},
},
created() {
if (!this.unique) {
this.anotherData.uniqueCode = this.unique;
}
},
methods: {
beforeAvatarUpload(file) {
if (this.type == "mp3") {
const isMP3 = file.type === "audio/mp3";
......@@ -217,4 +237,7 @@ export default {
.hide .el-upload--picture-card {
display: none;
}
.up_fz {
color: #a9aec0;
}
</style>
\ No newline at end of file
......@@ -254,7 +254,7 @@ export default {
if (v.visit_url) {
if (v.visit_url == "/fwgl/" || v.visit_url == "/yygl/") {
this.$router.push(v.visit_url + this.$store.getters.level);
} else if (parent == "/shop") {
} else if (parent == "/services_shop") {
this.$store.commit("serviceShopMenuAct", v.visit_url);
this.$router.push(v.visit_url);
} else {
......@@ -400,6 +400,7 @@ export default {
font-size: 14px;
display: none;
z-index: 1;
text-align: center;
}
.shop_menu {
width: 280px;
......@@ -435,7 +436,7 @@ export default {
height: 44px;
line-height: 44px;
padding: 0 30px;
text-align: left;
text-align: center;
color: #0d1847;
}
.user_menu div:hover {
......
This diff is collapsed.
<template>
<el-form :inline="true" ref="formInline" :model="formInline" class="demo-form-inline formsearch d_ui_form">
<el-form-item
:label="item.label"
v-for="(item,index) in data"
:key="index+500"
:prop="item.key"
>
<el-input
v-if="item.type == 'input'"
class="d_search_input"
v-model="formInline[item.key]"
:placeholder="item.placeholder"
></el-input>
<el-date-picker
v-if="item.type == 'daterange'"
v-model="formInline[item.key]"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
:clearable="false"
></el-date-picker>
<el-select
v-if="item.type == 'select'"
v-model="formInline[item.key]"
:placeholder="item.placeholder"
>
<el-option v-for="(it,idx) in item.arr" :key="idx+600" :label="it.label" :value="it.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button class="primary_btn" type="primary" @click="onSubmit">查询</el-button>
<el-button class="defaule_btn" @click="remove_data">重置</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
props: ["data"],
components: {},
data() {
return {
formInline: {},
};
},
watch: {},
computed: {},
created() {
var temp = {};
this.data.forEach((e) => {
temp[e.key] = "";
});
this.formInline = temp;
},
mounted() {},
methods: {
onSubmit() {
this.$emit("serach", this.formInline);
},
remove_data() {
this.$refs["formInline"].resetFields();
this.$emit("serach", "");
},
},
};
</script>
<style scoped>
.primary_btn {
width: 100px;
background-color: #515fe7;
color: #e6ebfe;
}
.defaule_btn {
width: 100px;
background-color: #c3caf8;
color: #0f2683;
}
</style>
<style>
.formsearch .el-form-item {
/* margin-left: 50px; */
margin-left: 30px;
}
.formsearch .el-form-item:nth-last-of-type(1) {
position: absolute;
right: -210px;
}
.formsearch .el-form-item .el-form-item__label {
color: #242c43;
font-weight: 600;
}
.d_search_input.el-input {
width: 200px;
}
</style>
<style scoped>
.formsearch {
position: relative;
width: calc(100% - 220px);
}
</style>
<style>
.from_content1 .el-input__inner {
background-color: #f7f8f9;
}
.from_content1 .el-date-editor.el-range-editor .el-range-input {
background-color: #f7f8f9;
width: 80px;
}
.from_content1 .el-date-editor.el-range-editor .el-range-separator {
width: 40px;
position: relative;
top: 2px;
}
.from_content1 .el-date-editor.el-range-editor {
width: 260px;
padding: 3px 10px 3px 15px;
}
.from_content1 .el-date-editor .el-range__icon {
margin-right: 8px;
}
</style>
\ No newline at end of file
<template>
<div class="tab_btns">
<div
class="btn"
v-for="(item, index) in data"
:key="index + 100"
@click="clickFunc(item.func)"
:style="{
float: item.position,
backgroundColor: item.type == 'warn' ? '#ad3a4a' : '',
}"
:class="item.position == 'right' ? 'left_marg' : ''"
>
{{ item.label }}
</div>
<span class="selectnum"
>已选择
<span style="color: #242c43; font-weight: 600">{{ num }}</span></span
>
<span class="clean" @click="clean">清空</span>
</div>
</template>
<script>
export default {
props: ["data", "num"],
components: {},
data() {
return {};
},
watch: {},
computed: {},
created() {},
mounted() {},
methods: {
clickFunc(type) {
this.$emit(type);
},
clean() {
this.$emit("clean");
},
},
};
</script>
<style scoped>
.btn {
height: 40px;
line-height: 40px;
background-color: #2b4695;
border-radius: 8px;
padding: 0 30px;
float: left;
color: #fefefe;
cursor: pointer;
}
.selectnum {
/* float: right; */
line-height: 40px;
margin: 0 30px;
color: #8890a7;
}
.clean {
/* float: right; */
text-decoration: underline;
color: #2b4695;
line-height: 40px;
margin-right: 20px;
cursor: pointer;
}
.left_marg {
margin-left: 10px;
}
.tab_btns {
position: relative;
margin-bottom: 25px;
}
.tab_btns::after {
content: "";
position: absolute;
width: calc(100% + 40px);
height: 1px;
background-color: #e3e5ef;
left: -20px;
bottom: -20px;
}
</style>
......@@ -13,9 +13,10 @@
<span
v-for="(item, index) in buttonList"
:key="'btn' + index"
:class="item.state ? 'btn_default btn_actice':'btn_default'"
:class="item.state ? 'btn_default btn_actice' : 'btn_default'"
@click="btnClick(index)"
>{{ item.name }}</span>
>{{ item.name }}</span
>
</div>
<div class="input_right">
<el-input
......@@ -58,7 +59,10 @@
:disabled="pagination.page == 1"
></el-button>
&nbsp;&nbsp;{{ pagination.page }}页 / 共{{
Math.ceil((pagination.total == 0 ? 1 : pagination.total) / pagination.rowsPerPage)
Math.ceil(
(pagination.total == 0 ? 1 : pagination.total) /
pagination.rowsPerPage
)
}}
<el-button
icon="el-icon-arrow-right"
......@@ -67,7 +71,10 @@
@click="handleCurrentChange(1)"
:disabled="
pagination.page >=
Math.ceil((pagination.total == 0 ? 1 : pagination.total) / pagination.rowsPerPage)
Math.ceil(
(pagination.total == 0 ? 1 : pagination.total) /
pagination.rowsPerPage
)
"
></el-button>
</div>
......@@ -304,11 +311,12 @@ export default {
border-right-color: #dcdfe6;
border-left-color: #dcdfe6;
border-top: 4px solid #e56600;
height: 48px;
height: 50px !important;
}
.order_block .el-tabs--border-card > .el-tabs__header .el-tabs__item {
border-top: 4px solid transparent;
height: 48px;
height: 50px !important;
line-height: 46px !important;
}
.order_block .el-tabs--border-card > .el-tabs__header .el-tabs__item:hover {
color: #e56600;
......
......@@ -2,10 +2,12 @@
<div class="order_list">
<div class="order_th_pad">
<el-row class="order_th">
<el-col :span="10">服务信息</el-col>
<el-col :span="6">规格</el-col>
<el-col :span="4">申请状态</el-col>
<el-col :span="4">操作</el-col>
<el-col :span="7">服务信息</el-col>
<el-col :span="5">规格</el-col>
<el-col :span="3">购买时长</el-col>
<el-col :span="3">总价</el-col>
<el-col :span="3">申请状态</el-col>
<el-col :span="3">操作</el-col>
</el-row>
</div>
<order-cell v-for="item in datas" :key="item.id" :cellItem="item" @updateList="updateList"></order-cell>
......
<template>
<div class="info_logo">
<div class="logo">
<img :src="data.url" alt="" style="width:100%;" />
<img :src="data.url" alt="" style="width:100%;" v-if="!data.isProcess" />
<workflows-view :zoom="0.4" :id="data.workflows_id" :hideDetail="true" v-if="data.isProcess"></workflows-view>
<map-view v-if="data.isMap" :id="data.portal_id"></map-view>
<process-view v-if="data.isProcess" :id="data.workflows_id"></process-view>
</div>
<div class="info">
<p class="info_title">
......@@ -122,10 +124,12 @@
<script>
import MapView from "./service-info/map-view";
import processView from '@/components/service-info/process-view'
import workflowsView from '@/components/work-flow/workflows-view'
export default {
props: ["data"],
components: { MapView },
components: { MapView,processView,workflowsView },
data() {
return {};
},
......
......@@ -34,17 +34,33 @@
<span v-text="data.create_date"></span>
</li>
</ul>
<div class="and_wid">
<div class="dbn_wkdn">
&nbsp;&nbsp;格:
<span class="ndwa_indowa"> {{ data.price * duration }} </span>
<span class="kfdf_jffa">金币</span>
</div>
<div class="nmd_kwd">
月售:
<span class="ndwa_dn"> {{ data.sale }}</span>
<img src="@/assets/imgs/shop_ic_star.png" class="dwin_diwa" />
<span class="dn_wjd"> {{ data.star }} </span>
</div>
</div>
<div class="commodity_information">
<span>&emsp;&emsp;格:</span>
<div class="btn_container_ddaw">
{{ data.price }} 金币/月
</div>
</div>
<div class="commodity_information">
<span>购买时长:</span>
<div class="btn_container">
<el-button
v-for="(item, index) in specifications"
:key="'specifications_' + index"
:type="item.value === specificationID ? 'primary' : 'default'"
@click="changeSpecification(item)"
>
{{ item.name }}
</el-button>
<el-input-number
v-model="duration"
:min="1"
:disabled="actionDisabled"
></el-input-number>
</div>
</div>
<div class="commodity_action">
......@@ -80,7 +96,13 @@ export default {
},
],
specificationID: 1,
duration: 1,
}),
computed: {
actionDisabled() {
return this.specifications.length == 0;
},
},
methods: {
changeSpecification({ value }) {
this.specificationID = value;
......@@ -244,6 +266,10 @@ export default {
.commodity_information > .btn_container > .el-input-number {
margin: 0 20px 15px 0;
}
.btn_container_ddaw {
line-height: 40px;
margin-left: 5px;
}
.commodity_action {
margin-top: 60px;
text-align: right;
......@@ -253,6 +279,55 @@ export default {
margin-left: 20px;
font-size: 16px;
}
.and_wid {
background-color: #f9fafc;
border-radius: 8px;
padding: 20px;
display: flex;
justify-content: space-between;
margin-top: 20px;
align-items: center;
}
.dbn_wkdn {
color: #8890a7;
font-size: 14px;
}
.ndwa_indowa {
color: #e56600;
font-size: 26px;
font-weight: bold;
}
.kfdf_jffa {
color: #e56600;
font-size: 14px;
}
.nmd_kwd {
color: #8890a7;
}
.ndwa_dn {
color: #242c43;
}
.dn_wjd {
color: #ea7d19;
font-size: 18px;
position: relative;
}
.dwin_diwa {
width: 14px;
height: 14px;
margin-left: 20px;
margin-right: 4px;
position: relative;
}
.dn_wjd::after {
content: "";
position: absolute;
width: 2px;
height: 16px;
background-color: #e3e5ef;
top: 5px;
left: -35px;
}
</style>
<style>
......
<template>
<div class="map_view">
<a class="map_view_action" href="#" @click.prevent.stop="viewAction">
<img :src="require('../../assets/imgs/ic_yulan.png')" />
</a>
<transition name="mask-bg-fade">
<el-dialog
class="map_view_dialog"
title="预览"
width="1200px"
:visible.sync="showDialog"
:before-close="beforeClose"
>
<div class="map_view_container">
<workflows-view :zoom="0.8" :id="id" :hideDetail="true"></workflows-view>
</div>
</el-dialog>
</transition>
</div>
</template>
<script>
import workflowsView from '@/components/work-flow/workflows-view'
export default {
name: "map-view",
components:{
workflowsView
},
data: () => ({
showDialog: false,
}),
props: {
id: {
type: Number,
required: true,
}
},
methods: {
viewAction() {
this.showDialog = true;
},
beforeClose(done) {
done();
},
},
};
</script>
<style scoped>
.map_view_action {
display: flex;
justify-content: center;
align-items: center;
width: 40px;
height: 40px;
padding: 10px 0 0 10px;
box-sizing: border-box;
border-top-left-radius: 40px;
background-color: #8f93a1;
}
.map_view_container {
height: 666px;
}
.map_view_container > iframe {
display: block;
width: 100%;
height: 100%;
}
</style>
<style>
.map_view_dialog .el-dialog {
overflow: hidden;
}
.map_view_dialog .el-dialog__header {
padding: 18px 20px 17px;
border-bottom: 1px solid #edf0ff;
text-align: left;
}
.map_view_dialog .el-dialog__body {
padding: 0;
}
</style>
......@@ -18,11 +18,21 @@
</div>
<div class="main_container">
<div class="main_container-left" v-if="data.cover">
<img :src="data.cover" width="100%" />
<img :src="data.cover" width="100%" v-if="data.type !== 'workflow'" />
<workflows-view
:zoom="0.6"
:id="parseInt(data.workflows_id)"
:hideDetail="true"
v-if="data.type == 'workflow'"
></workflows-view>
<map-view
v-if="data.type === 'Map Service'"
:id="data.portal_id"
></map-view>
<process-view
:id="parseInt(data.workflows_id)"
v-if="data.type == 'workflow'"
></process-view>
</div>
<div class="main_container-right">
<ul class="service_base_info">
......@@ -51,54 +61,91 @@
<span v-text="data.descript"></span>
</li>
</ul>
<div class="and_wid">
<div class="dbn_wkdn">
&nbsp;&nbsp;格:<span class="ndwa_indowa">
{{
specification && specification.money
? specification.money * (showTime ? duration : 1)
: 0
}}
</span>
<span class="kfdf_jffa">金币</span>
</div>
<div class="nmd_kwd">
月售:<span class="ndwa_dn">{{ data.month_sale }}</span
><img src="@/assets/imgs/shop_ic_star.png" class="dwin_diwa" />
<span class="dn_wjd">{{ data.scoreDetail.avgScore }}</span>
</div>
</div>
<div class="commodity_information">
<span>&emsp;&emsp;格:</span>
<span v-if="actionDisabled" class="commodity_text">暂无</span>
<span>计次收费规格:</span>
<span
v-if="
(data.serviceRequestSpcs.spcs_type_1 &&
data.serviceRequestSpcs.spcs_type_1.length == 0) ||
!data.serviceRequestSpcs.spcs_type_1
"
class="commodity_text"
>暂无</span
>
<div v-else class="btn_container">
<el-button
v-for="(item, index) in specifications"
v-for="(item, index) in data.serviceRequestSpcs.spcs_type_1"
:key="'spcs_' + index"
:type="item.id === specification.id ? 'primary' : 'default'"
@click="changeSpecification(item)"
@click="changeSpecification(item, 0)"
>
{{ item.name }}
{{ item.money }}金币/{{ item.spcs_count }}
</el-button>
</div>
</div>
<div class="commodity_information">
<span>规格说明:</span>
<span v-if="actionDisabled" class="commodity_text">暂无</span>
<span>时长收费规格:</span>
<span
v-else
v-if="
(data.serviceRequestSpcs.spcs_type_2 &&
data.serviceRequestSpcs.spcs_type_2.length == 0) ||
!data.serviceRequestSpcs.spcs_type_2
"
class="commodity_text"
v-text="(specification && specification.descript) || '-'"
></span>
</div>
<div class="commodity_information">
<span>购买方式:</span>
<span v-if="actionDisabled" class="commodity_text">暂无</span>
>暂无</span
>
<div v-else class="btn_container">
<el-button
v-for="(item, index) in types"
v-text="item.name"
:key="'type_' + index"
:type="item.value === type ? 'primary' : 'default'"
@click="changeType(item)"
v-for="(item, index) in data.serviceRequestSpcs.spcs_type_2"
:key="'spcs_' + index"
:type="item.id === specification.id ? 'primary' : 'default'"
@click="changeSpecification(item, 1)"
>
{{ item.money }}金币/月
</el-button>
</div>
</div>
<div class="commodity_information">
<span>规格说明:</span>
<span v-if="actionDisabled" class="commodity_text">暂无</span>
<span
v-else
class="commodity_text"
v-text="(specification && specification.descript) || '-'"
></span>
</div>
<div class="commodity_information">
<span>购买时长:</span>
<div class="btn_container">
<div v-if="showTime" class="btn_container">
<el-input-number
v-model="duration"
:min="1"
:disabled="actionDisabled"
></el-input-number>
</div>
<div v-else class="btn_container">
<el-button type="primary"> 不限时长 </el-button>
</div>
</div>
<div class=" commodity_action">
<div class="commodity_action">
<el-button
type="warning"
plain
......@@ -123,10 +170,14 @@
<script>
import helper from "@/services/helper.js";
import MapView from "./map-view";
import workflowsView from "@/components/work-flow/workflows-view";
import processView from "@/components/service-info/process-view";
export default {
components: {
MapView,
workflowsView,
processView,
},
props: {
data: {
......@@ -136,42 +187,38 @@ export default {
},
data: () => ({
types: [],
type: 0, // 购买方式 1:按月,2:按年
type: 1, // 购买方式 1:按月,2:按年
specification: {}, // 规格
duration: 1, // 时长
showTime: false,
}),
computed: {
specifications() {
let specifications = (this.data.serviceRequestSpcs || []).filter(
(item) => item.type == this.type || item.type == 3
);
return specifications;
},
actionDisabled() {
return this.specifications.length == 0;
},
},
watch: {
specifications: {
handler() {
this.specification = this.specifications[0];
},
deep: true,
let a = this.data.serviceRequestSpcs;
return (
a &&
a.spcs_type_1 &&
a.spcs_type_1.length == 0 &&
a.spcs_type_2 &&
a.spcs_type_2.length == 0
);
},
},
watch: {},
methods: {
dateTransform(datestr = "") {
return helper.dateStringTransform(datestr);
},
changeSpecification(specification) {
changeSpecification(specification, type) {
this.specification = specification;
if (type == 0) {
this.showTime = false;
} else if (type == 1) {
this.showTime = true;
}
},
changeType({ value }) {
this.type = value;
if (this.specifications.length > 0) {
this.specification = this.specifications[0];
}
},
addToCart() {
// console.log("addToCart");
......@@ -211,6 +258,7 @@ export default {
query: {
service_id: parseFloat(this.data.service_id),
spec_id: this.specification.id,
spcs_type: this.specification.spcs_type,
duration: this.duration,
duration_unit: this.type,
},
......@@ -255,8 +303,18 @@ export default {
}
// 初始化规格
if (this.specifications.length > 0) {
this.specification = this.specifications[0];
if (
this.data.serviceRequestSpcs &&
this.data.serviceRequestSpcs.spcs_type_1 &&
this.data.serviceRequestSpcs.spcs_type_1.length > 0
) {
this.specification = this.data.serviceRequestSpcs.spcs_type_1[0];
} else if (
this.data.serviceRequestSpcs &&
this.data.serviceRequestSpcs.spcs_type_2 &&
this.data.serviceRequestSpcs.spcs_type_2.length > 0
) {
this.specification = this.data.serviceRequestSpcs.spcs_type_2[0];
}
},
};
......@@ -402,6 +460,55 @@ export default {
margin-left: 20px;
font-size: 16px;
}
.and_wid {
background-color: #f9fafc;
border-radius: 8px;
padding: 20px;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20px;
}
.dbn_wkdn {
color: #8890a7;
font-size: 14px;
}
.ndwa_indowa {
color: #e56600;
font-size: 26px;
font-weight: bold;
}
.kfdf_jffa {
color: #e56600;
font-size: 14px;
}
.nmd_kwd {
color: #8890a7;
}
.ndwa_dn {
color: #242c43;
}
.dn_wjd {
color: #ea7d19;
font-size: 18px;
position: relative;
}
.dwin_diwa {
width: 14px;
height: 14px;
margin-left: 20px;
margin-right: 4px;
position: relative;
}
.dn_wjd::after {
content: "";
position: absolute;
width: 2px;
height: 16px;
background-color: #e3e5ef;
top: 5px;
left: -35px;
}
</style>
<style>
......
......@@ -53,12 +53,12 @@ export default {
if (response.data.success == 1) {
let arr = response.data.data[0].Child;
let shopArr = [];
arr.forEach((item) => {
if (item.visit_url == "/services_shop") {
shopArr = item.Child;
}
});
shopArr.forEach((item) => {
let asd = arr.find(item => {
return item.visit_url == "/services_shop"
})
shopArr = asd.Child;
if (shopArr && shopArr.length != 0) {
Array.from(shopArr).forEach((item) => {
let uri = item.visit_url.substring(6);
if (uri.indexOf("/") != -1) {
uri = uri.substring(0, uri.indexOf("/"));
......@@ -98,6 +98,7 @@ export default {
break;
}
});
}
this.menuList = shopArr;
}
});
......
......@@ -64,7 +64,7 @@ export default {
computed: {},
created() {},
mounted() {
this.formInline.depart = this.$store.state.userInfo.department_name;
this.formInline.depart = this.$store.state.userInfo&&this.$store.state.userInfo.department_name || "";
},
methods: {
submitForm() {
......
......@@ -37,10 +37,10 @@
</div>
</div>
<div class="size">
<p>{{ data.size }}</p>
<P>{{ data.applytype }}</P>
<p>{{data.size}}</p>
</div>
<div class="num">{{ data.num }}</div>
<div class="count">{{ data.count }}</div>
<div class="oprate">
<upload-file
v-if="data.isMg"
......@@ -156,18 +156,18 @@ export default {
}
.serviceinfo {
width: 415px;
margin-right: 90px;
margin-right: 66px;
}
.pic {
width: 116px;
height: 116px;
float: left;
background-size: contain;
margin-right: 20px;
margin-right: 15px;
}
.info {
float: left;
width: 270px;
width: 230px;
}
.info p {
color: rgba(136, 144, 167, 1);
......@@ -193,27 +193,29 @@ export default {
.size {
width: 240px;
height: 107px;
background-color: rgba(249, 250, 252, 1);
line-height: 107px;
border-radius: 8px;
margin-right: 70px;
padding: 20px;
color: rgba(136, 144, 167, 1);
}
.size p:nth-of-type(1) {
line-height: 22px;
margin-bottom: 10px;
color: #242c43;
}
.num {
width: 138px;
height: 107px;
line-height: 107px;
font-size: 16px;
color: rgba(88, 97, 122, 1);
margin-right: 55px;
font-size: 14px;
color: #242c43;
margin-right: 20px;
text-align: center;
}
.count{
width: 108px;
height: 107px;
line-height: 107px;
font-size: 14px;
color: #242c43;
text-align: center;
}
.oprate {
width: 130px;
width: 150px;
height: 107px;
padding-top: 34px;
padding-left: 30px;
......
......@@ -3,7 +3,8 @@
<p class="list_title">
<span>服务信息</span>
<span>规格</span>
<span>数量</span>
<span>购买时长</span>
<span>小计</span>
<span>操作</span>
</p>
<apply-service-state ref="apply_service_state" v-for="(item,index) in service_arr" :idx="index" :key="index+5000" :data="item"></apply-service-state>
......@@ -67,13 +68,15 @@ export default {
font-weight: bold;
}
.list_title span:nth-of-type(1){
margin-right: 460px;
margin-right: 414px;
}
.list_title span:nth-of-type(2){
margin-right: 315px;
margin-right: 246px;
}
.list_title span:nth-of-type(3){
margin-right: 155px;
margin-right: 96px;
}
.list_title span:nth-of-type(4){
margin-right: 124px;
}
</style>
This diff is collapsed.
<template>
<div class="side_nav_bar">
<div class="side_nav_bar apaas_scroll">
<h3 class="side_nav_bar_title" @click="titleAction">
<img :src="titleIcon" width="20" style="margin-right: 10px;" />
<span v-text="title"></span>
</h3>
<ul class="side_nav_bar_list">
<!-- active-class="current" -->
<template v-for="(nav, index) in navList">
<li v-if="nav.children && nav.children.length" :key="'nav_' + index">
<a class="text_clip toggle_bar" @click.prevent="toggleNav(nav)">
{{ nav.name }}
<i
:class="nav.open ? 'el-icon-arrow-down' : 'el-icon-arrow-right'"
></i>
</a>
<ul class="second_list" v-show="nav.open">
<li v-for="(v, i) in nav.children" :key="'nav_' + index + 'v_' + i">
<router-link
class="text_clip"
:class="{ current: $route.path.indexOf(v.path) > -1 }"
:to="v.path"
>
{{ v.name }}
</router-link>
</li>
</ul>
</li>
<li v-else-if="nav.disabled" :key="'nav_' + index">
<a class="disabled text_clip">
{{ nav.name }}
</a>
</li>
<li v-else :key="'nav_' + index">
<router-link
tag="li"
v-for="(nav, index) in navList"
class="text_clip"
:class="{ current: $route.path.indexOf(nav.path) > -1 }"
:key="'nav' + index"
:to="nav.path"
>
<span v-text="nav.name"></span>
{{ nav.name }}
</router-link>
</li>
</template>
</ul>
</div>
</template>
......@@ -41,8 +68,8 @@ export default {
},
imgSrc: {
type: String,
default: "tool_fuwu"
}
default: "tool_fuwu",
},
},
methods: {
titleAction() {
......@@ -50,6 +77,9 @@ export default {
this.$router.push(this.titlePath);
}
},
toggleNav(nav) {
this.$set(nav, "open", !nav.open);
},
},
};
</script>
......@@ -57,6 +87,8 @@ export default {
<style scoped>
.side_nav_bar {
background-color: #0d1847;
overflow-x: hidden;
overflow-y: auto;
}
.side_nav_bar_title {
height: 40px;
......@@ -73,16 +105,48 @@ export default {
font-size: 16px;
color: #c3caf8;
}
.side_nav_bar_list > li {
.side_nav_bar_list > li > a {
display: block;
padding: 12px 10px 12px 42px;
border-left: 5px solid #0d1847;
font-size: 14px;
font-weight: bold;
line-height: 24px;
color: #6573ae;
color: #e6ebfe;
text-decoration: none;
cursor: pointer;
user-select: none;
}
.side_nav_bar_list > li > a.disabled {
opacity: 0.5;
cursor: not-allowed;
}
.side_nav_bar_list > li > a:hover,
.side_nav_bar_list > li > a.current {
border-left: 5px solid #e56600;
background-color: #182665;
color: #e6ebfe;
}
.toggle_bar {
padding-right: 30px !important;
position: relative;
}
.toggle_bar > i {
position: absolute;
top: 16px;
right: 8px;
}
.second_list > li > a {
display: block;
padding: 12px 10px 12px 56px;
border-left: 5px solid #0d1847;
font-size: 14px;
line-height: 24px;
color: #6573ae;
text-decoration: none;
}
.side_nav_bar_list > li:hover,
.side_nav_bar_list > li.current {
.second_list > li > a:hover,
.second_list > li > a.current {
border-left: 5px solid #e56600;
background-color: #182665;
color: #e6ebfe;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -17,8 +17,7 @@ export default {
'/intelligent_details',
'/intelligent_appbuilder',
'/intelligent_fwzc',
'/search_engine',
'/technical_support'
'/search_engine'
]
}),
created(){
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment