fixed 修改产品类型和新闻导入导出

This commit is contained in:
lwh 2023-06-29 10:33:00 +08:00
parent b8366d732e
commit a3ed8d0a73
6 changed files with 295 additions and 232 deletions

View File

@ -12,11 +12,17 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="24">
<el-form-item :label-width="labelWidth" label="新闻标题" prop="news_title"> <el-form-item :label-width="labelWidth" label="新闻标题" prop="news_title">
<el-input v-model='formData.news_title' type="text" placeholder='请输入新闻标题'></el-input> <el-input v-model='formData.news_title' type="text" placeholder='请输入新闻标题'></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='24'>
<el-form-item :label-width='labelWidth' label='新闻封面' prop='news_cover'>
<UploadImage ref='uploadRef' v-model='formData.news_cover' :data=uoloadData :limit='1' :fileSize='5'
:drag='true' :isShowTip='false' />
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item :label-width="labelWidth" label="新闻简介" prop="news_intro"> <el-form-item :label-width="labelWidth" label="新闻简介" prop="news_intro">
<el-input v-model='formData.news_intro' type="textarea" :rows="5" placeholder='请输入新闻简介'></el-input> <el-input v-model='formData.news_intro' type="textarea" :rows="5" placeholder='请输入新闻简介'></el-input>
@ -34,13 +40,12 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item :label-width="labelWidth" label="发布日期" prop="news_issue_date"> <el-form-item :label-width="labelWidth" label="发布日期" prop="news_issue_date">
<el-date-picker v-model="formData.news_issue_date" type="datetime" value-format="YYYY-MM-DD HH:mm" <el-date-picker v-model="formData.news_issue_date" type="date" value-format="YYYY-MM-DD" placeholder="发布日期" />
placeholder="发布日期" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item :label-width="labelWidth" label="浏览次数" prop="news_views_num"> <el-form-item :label-width="labelWidth" label="浏览次数" prop="news_views_num">
<el-input-number v-model='formData.news_views_num' controls-position='right' :min='1'></el-input-number> <el-input-number v-model='formData.news_views_num' controls-position='right' :min='0'></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -50,6 +55,9 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item :label-width="labelWidth" label="新闻内容" prop="news_content"> <el-form-item :label-width="labelWidth" label="新闻内容" prop="news_content">
<div class="copy-btn-box">
<el-button @click="handleCopyRichText" class="copy-btn">获取富文本内容</el-button>
</div>
<RichText v-model='formData.news_content' :min-height='196'></RichText> <RichText v-model='formData.news_content' :min-height='196'></RichText>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -70,6 +78,7 @@
import { reactive, ref, watch } from "vue"; import { reactive, ref, watch } from "vue";
import { addNews, getDictionary } from "~/service/news"; import { addNews, getDictionary } from "~/service/news";
import { useLoginStore } from "~/store"; import { useLoginStore } from "~/store";
import { ElMessage } from "element-plus";
// -- // --
@ -85,6 +94,11 @@ async function get_news_type() {
}) })
} }
//
async function handleCopyRichText() {
let text = await navigator.clipboard.writeText(formData.news_content);
ElMessage.success("富文本内容复制成功")
}
@ -127,6 +141,12 @@ const rules = reactive({
message: '新闻标题不能为空' message: '新闻标题不能为空'
} }
], ],
news_cover: [
{
required: true,
message: '新闻封面不能为空'
}
],
news_sort: [ news_sort: [
{ {
required: true, required: true,
@ -175,4 +195,11 @@ const handleResetClick = async (formEl) => {
}; };
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped>
.copy-btn-box {
width: 100%;
display: flex;
justify-content: right;
margin-bottom: 15px;
}
</style>

View File

@ -1,68 +1,65 @@
<template> <template>
<el-dialog v-model="props.modelValue" title="新闻详情" width="900px" @closed="closeDialog" @open="openDialog"> <el-dialog v-model="props.modelValue" title="新闻详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true"> <el-form ref="formRef" :model="formData" :disabled="true">
<el-row> <el-row>
<el-col :span="12">
<el-col :span="12"> <el-form-item :label-width="labelWidth" label="新闻类型" prop="news_type">
<el-form-item label="新闻类型" prop="news_type"> <el-select v-model="formData.news_type" clearable>
<el-select v-model="formData.news_type" clearable placeholder="请选择"> <el-option v-for="item in news_type" :key="item.dictionary_guid" :label="item.dictionary_name"
<el-option :value="item.dictionary_value"></el-option>
v-for="item in news_type" </el-select>
:key="item.dictionary_guid" :label="item.dictionary_name" </el-form-item>
:value="item.dictionary_value" </el-col>
></el-option> <el-col :span="24">
</el-select> <el-form-item :label-width="labelWidth" label="新闻标题" prop="news_title">
</el-form-item> <el-input v-model='formData.news_title' type="text"></el-input>
</el-col> </el-form-item>
<el-col :span="12"> </el-col>
<el-form-item :label-width="labelWidth" label="新闻标题" prop="news_title"> <el-col :span='24'>
<el-input v-model='formData.news_title' type="text" placeholder='请输入新闻标题'></el-input> <el-form-item :label-width='labelWidth' label='新闻封面' prop='news_cover'>
</el-form-item> <UploadImage ref='uploadRef' v-model='formData.news_cover' :data=uoloadData :limit='1' :fileSize='5'
</el-col> :drag='true' :isShowTip='false' />
<el-col :span="24"> </el-form-item>
<el-form-item :label-width="labelWidth" label="新闻简介" prop="news_intro"> </el-col>
<el-input v-model='formData.news_intro' type="textarea" :rows="5" placeholder='请输入新闻简介'></el-input> <el-col :span="24">
</el-form-item> <el-form-item :label-width="labelWidth" label="新闻简介" prop="news_intro">
</el-col> <el-input v-model='formData.news_intro' type="textarea" :rows="5"></el-input>
<el-col :span="12"> </el-form-item>
<el-form-item :label-width="labelWidth" label="文章来源" prop="news_source"> </el-col>
<el-input v-model='formData.news_source' type="text" placeholder='请输入文章来源'></el-input> <el-col :span="12">
</el-form-item> <el-form-item :label-width="labelWidth" label="文章来源" prop="news_source">
</el-col> <el-input v-model='formData.news_source' type="text"></el-input>
<el-col :span="12"> </el-form-item>
<el-form-item :label-width="labelWidth" label="跳转链接" prop="news_link"> </el-col>
<el-input v-model='formData.news_link' type="text" placeholder='请输入跳转链接'></el-input> <el-col :span="12">
</el-form-item> <el-form-item :label-width="labelWidth" label="跳转链接" prop="news_link">
</el-col> <el-input v-model='formData.news_link' type="text"></el-input>
<el-col :span="12"> </el-form-item>
<el-form-item </el-col>
:label-width="labelWidth" <el-col :span="12">
label="发布日期" prop="news_issue_date" <el-form-item :label-width="labelWidth" label="发布日期" prop="news_issue_date">
> <el-date-picker v-model="formData.news_issue_date" type="date" value-format="YYYY-MM-DD" />
<el-date-picker </el-form-item>
v-model="formData.news_issue_date" </el-col>
type="datetime" <el-col :span="12">
value-format="YYYY-MM-DD HH:mm" <el-form-item :label-width="labelWidth" label="浏览次数" prop="news_views_num">
placeholder="发布日期" <el-input-number v-model='formData.news_views_num' controls-position='right' :min='0'></el-input-number>
/> </el-form-item>
</el-form-item> </el-col>
</el-col> <el-col :span="12">
<el-col :span="12"> <el-form-item :label-width="labelWidth" label="新闻排序" prop="news_sort">
<el-form-item :label-width="labelWidth" label="浏览次数" prop="news_views_num"> <el-input-number v-model='formData.news_sort' controls-position='right' :min='1'></el-input-number>
<el-input-number v-model='formData.news_views_num' controls-position='right' :min='1'></el-input-number> </el-form-item>
</el-form-item> </el-col>
</el-col> <el-col :span="24">
<el-col :span="12"> <el-form-item :label-width="labelWidth" label="新闻内容" prop="news_content">
<el-form-item :label-width="labelWidth" label="新闻排序" prop="news_sort"> <!-- <div class="copy-btn-box">
<el-input-number v-model='formData.news_sort' controls-position='right' :min='1'></el-input-number> <el-button @click="handleCopyRichText" class="copy-btn" >获取富文本内容</el-button>
</el-form-item> </div> -->
</el-col> <RichText v-model='formData.news_content' :min-height='196'></RichText>
<el-col :span="24"> </el-form-item>
<el-form-item :label-width="labelWidth" label="新闻内容" prop="news_content"> </el-col>
<RichText v-model='formData.news_content' :min-height='196'></RichText>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
@ -71,24 +68,34 @@
<script setup> <script setup>
import { reactive, ref, watch } from "vue"; import { reactive, ref, watch } from "vue";
import { isEmptyObject } from "~/utils/index";
import { getDictionary } from '~/service/news'; import { getDictionary } from '~/service/news';
//
const openDialog = async () => {
await get_news_type()
};
// -- // --
// -- // --
// //
const news_type = ref([]); const news_type = ref([]);
async function get_news_type() { async function get_news_type() {
await getDictionary({ dictionary_value: 'news_type'}).then((res) => { await getDictionary({ dictionary_value: 'news_type' }).then((res) => {
news_type.value = res news_type.value = res
}) })
} }
//
async function handleCopyRichText() {
let text = await navigator.clipboard.writeText(formData.news_content);
ElMessage.success("富文本内容复制成功")
}
// -- // --
const formRef = ref(); const formRef = ref();
@ -112,18 +119,16 @@ watch(props, (v) => {
}); });
//
const openDialog = () => {
get_news_type()
};
const closeDialog = () => { const closeDialog = () => {
emits("update:modelValue", false); emits("update:modelValue", false);
}; };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.copy-btn-box {
width: 100%;
display: flex;
justify-content: right;
margin-bottom: 15px;
}
</style> </style>

View File

@ -4,65 +4,63 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="新闻类型" prop="news_type"> <el-form-item :label-width="labelWidth" label="新闻类型" prop="news_type">
<el-select v-model="formData.news_type" clearable placeholder="请选择"> <el-select v-model="formData.news_type" clearable placeholder="请选择">
<el-option <el-option v-for="item in news_type" :key="item.dictionary_guid" :label="item.dictionary_name"
v-for="item in news_type" :value="item.dictionary_value"></el-option>
:key="item.dictionary_guid" :label="item.dictionary_name" </el-select>
:value="item.dictionary_value" </el-form-item>
></el-option> </el-col>
</el-select> <el-col :span="24">
</el-form-item> <el-form-item :label-width="labelWidth" label="新闻标题" prop="news_title">
</el-col> <el-input v-model='formData.news_title' type="text" placeholder='请输入新闻标题'></el-input>
<el-col :span="12"> </el-form-item>
<el-form-item :label-width="labelWidth" label="新闻标题" prop="news_title"> </el-col>
<el-input v-model='formData.news_title' type="text" placeholder='请输入新闻标题'></el-input> <el-col :span='24'>
</el-form-item> <el-form-item :label-width='labelWidth' label='新闻封面' prop='news_cover'>
</el-col> <UploadImage ref='uploadRef' v-model='formData.news_cover' :data=uoloadData :limit='1' :fileSize='5'
<el-col :span="24"> :drag='true' :isShowTip='false' />
<el-form-item :label-width="labelWidth" label="新闻简介" prop="news_intro"> </el-form-item>
<el-input v-model='formData.news_intro' type="textarea" :rows="5" placeholder='请输入新闻简介'></el-input> </el-col>
</el-form-item> <el-col :span="24">
</el-col> <el-form-item :label-width="labelWidth" label="新闻简介" prop="news_intro">
<el-col :span="12"> <el-input v-model='formData.news_intro' type="textarea" :rows="5" placeholder='请输入新闻简介'></el-input>
<el-form-item :label-width="labelWidth" label="文章来源" prop="news_source"> </el-form-item>
<el-input v-model='formData.news_source' type="text" placeholder='请输入文章来源'></el-input> </el-col>
</el-form-item> <el-col :span="12">
</el-col> <el-form-item :label-width="labelWidth" label="文章来源" prop="news_source">
<el-col :span="12"> <el-input v-model='formData.news_source' type="text" placeholder='请输入文章来源'></el-input>
<el-form-item :label-width="labelWidth" label="跳转链接" prop="news_link"> </el-form-item>
<el-input v-model='formData.news_link' type="text" placeholder='请输入跳转链接'></el-input> </el-col>
</el-form-item> <el-col :span="12">
</el-col> <el-form-item :label-width="labelWidth" label="跳转链接" prop="news_link">
<el-col :span="12"> <el-input v-model='formData.news_link' type="text" placeholder='请输入跳转链接'></el-input>
<el-form-item </el-form-item>
:label-width="labelWidth" </el-col>
label="发布日期" prop="news_issue_date" <el-col :span="12">
> <el-form-item :label-width="labelWidth" label="发布日期" prop="news_issue_date">
<el-date-picker <el-date-picker v-model="formData.news_issue_date" type="date" value-format="YYYY-MM-DD" placeholder="发布日期" />
v-model="formData.news_issue_date" </el-form-item>
type="datetime" </el-col>
value-format="YYYY-MM-DD HH:mm" <el-col :span="12">
placeholder="发布日期" <el-form-item :label-width="labelWidth" label="浏览次数" prop="news_views_num">
/> <el-input-number v-model='formData.news_views_num' controls-position='right' :min='0'></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item :label-width="labelWidth" label="浏览次数" prop="news_views_num"> <el-form-item :label-width="labelWidth" label="新闻排序" prop="news_sort">
<el-input-number v-model='formData.news_views_num' controls-position='right' :min='1'></el-input-number> <el-input-number v-model='formData.news_sort' controls-position='right' :min='1'></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="24">
<el-form-item :label-width="labelWidth" label="新闻排序" prop="news_sort"> <el-form-item :label-width="labelWidth" label="新闻内容" prop="news_content">
<el-input-number v-model='formData.news_sort' controls-position='right' :min='1'></el-input-number> <div class="copy-btn-box">
</el-form-item> <el-button @click="handleCopyRichText" class="copy-btn">获取富文本内容</el-button>
</el-col> </div>
<el-col :span="24"> <RichText v-model='formData.news_content' :min-height='196'></RichText>
<el-form-item :label-width="labelWidth" label="新闻内容" prop="news_content"> </el-form-item>
<RichText v-model='formData.news_content' :min-height='196'></RichText> </el-col>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
@ -77,7 +75,7 @@
<script setup> <script setup>
import { reactive, ref, watch } from "vue"; import { reactive, ref, watch } from "vue";
import { editNews , getDictionary } from "~/service/news"; import { editNews, getDictionary } from "~/service/news";
import { useLoginStore } from "~/store"; import { useLoginStore } from "~/store";
// -- // --
@ -86,15 +84,19 @@ import { useLoginStore } from "~/store";
// -- // --
// //
const news_type = ref([]); const news_type = ref([]);
async function get_news_type() { async function get_news_type() {
await getDictionary({ dictionary_value: 'news_type'}).then((res) => { await getDictionary({ dictionary_value: 'news_type' }).then((res) => {
news_type.value = res news_type.value = res
}) })
} }
//
async function handleCopyRichText() {
let text = await navigator.clipboard.writeText(formData.news_content);
ElMessage.success("富文本内容复制成功")
}
// -- // --
@ -140,23 +142,29 @@ const closeDialog = () => {
const rules = reactive({ const rules = reactive({
news_type: [ news_type: [
{ {
required: true, required: true,
message: '新闻类型不能为空' message: '新闻类型不能为空'
} }
], ],
news_title: [ news_title: [
{ {
required: true, required: true,
message: '新闻标题不能为空' message: '新闻标题不能为空'
} }
], ],
news_sort: [ news_cover: [
{ {
required: true, required: true,
message: '新闻排序不能为空' message: '新闻封面不能为空'
} }
], ],
news_sort: [
{
required: true,
message: '新闻排序不能为空'
}
],
}); });
@ -185,5 +193,10 @@ const handleResetClick = async (formEl) => {
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.copy-btn-box {
width: 100%;
display: flex;
justify-content: right;
margin-bottom: 15px;
}
</style> </style>

View File

@ -65,6 +65,12 @@
<dict-tag :options='news_type' :value='scope.row.news_type' /> <dict-tag :options='news_type' :value='scope.row.news_type' />
</template> </template>
<template #news_cover="scope">
<el-image v-if="scope.row.news_cover" :src="scope.row.news_cover.split(',')[0]" lazy
:preview-src-list="scope.row.news_cover.split(',')" :preview-teleported="true" :hide-on-click-modal="true"
fit="contain" class="el-avatar"></el-image>
<template v-else>暂无图片</template>
</template>
<!-- 排序 --> <!-- 排序 -->
<template #news_sort='scope'> <template #news_sort='scope'>
@ -146,16 +152,23 @@ const column = [
prop: "news_type", prop: "news_type",
label: '新闻类型', label: '新闻类型',
}, },
{
prop: "news_cover",
label: '新闻封面',
width: "200",
},
{ {
prop: "news_title", prop: "news_title",
label: '新闻标题', label: '新闻标题',
showOverflowTooltip: true, showOverflowTooltip: true,
width: "500",
}, },
{ // {
prop: "news_intro", // prop: "news_intro",
label: '新闻简介', // label: '',
showOverflowTooltip: true, // showOverflowTooltip: true,
}, // width: "400",
// },
{ {
prop: "news_issue_date", prop: "news_issue_date",
label: '发布日期', label: '发布日期',
@ -164,11 +177,13 @@ const column = [
{ {
prop: "news_views_num", prop: "news_views_num",
label: '浏览次数', label: '浏览次数',
sortable: true sortable: true,
width: "150",
}, },
{ {
prop: "news_sort", prop: "news_sort",
label: '新闻排序', label: '新闻排序',
width: "180",
sortable: true sortable: true
}, },
{ {

View File

@ -23,18 +23,17 @@
<el-button type="primary" @click="addProductTypeDialogVisible = true"> 添加 </el-button> <el-button type="primary" @click="addProductTypeDialogVisible = true"> 添加 </el-button>
</el-col> </el-col>
<!-- 导出 -->
<!-- <el-button icon="ElIconDocument" @click="exportExcel(params)">导出</el-button> -->
<!-- 导入 --> <!-- 导入 -->
<!-- <el-upload class="upload-demo" :action="importExcel" :headers="headers" :on-success="handleExcelSuccess" <el-upload class="upload-demo" :action="importExcel" :headers="headers" :on-success="handleExcelSuccess"
:on-progress="uploadLoading" :on-error="closeUploadLoading" style="margin-left: 10px" :show-file-list="false"> :on-progress="uploadLoading" :on-error="closeUploadLoading" style="margin-left: 10px" :show-file-list="false">
<el-button type="primary">导入</el-button> <el-button type="primary">导入</el-button>
</el-upload> --> </el-upload>
<!-- 导出 -->
<el-button icon="ElIconDocument" @click="exportExcel(params)">导出</el-button>
<!-- 下载导入模板 --> <!-- 下载导入模板 -->
<!-- <el-button icon="ElIconDownload" @click="downloadTemplate()">下载导入模板</el-button> --> <el-button icon="ElIconDownload" @click="downloadTemplate()">下载导入模板</el-button>
<!-- 下拉操作 --> <!-- 下拉操作 -->
@ -57,7 +56,8 @@
:tree-props="{ children: 'children' }"> :tree-props="{ children: 'children' }">
<el-table-column type="selection" width="50" align="center" /> <el-table-column type="selection" width="50" align="center" />
<el-table-column prop="product_type_name" width="200" label="产品类目名称" :show-overflow-tooltip="true"> </el-table-column> <el-table-column prop="product_type_name" width="200" label="产品类目名称" :show-overflow-tooltip="true"> </el-table-column>
<el-table-column prop="product_type_title" width="200" label="产品类目标题" :show-overflow-tooltip="true"> </el-table-column> <el-table-column prop="product_type_title" width="200" label="产品类目标题" :show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="product_type_icon" width="200" label="产品类目图标" :show-overflow-tooltip="true"> <el-table-column prop="product_type_icon" width="200" label="产品类目图标" :show-overflow-tooltip="true">
<template #default="scope"> <template #default="scope">
<el-image :src="scope.row.product_type_icon" :preview-src-list="[scope.row.product_type_icon]" <el-image :src="scope.row.product_type_icon" :preview-src-list="[scope.row.product_type_icon]"
@ -82,7 +82,8 @@
</el-table> </el-table>
<!-- 添加产品类目 --> <!-- 添加产品类目 -->
<AddProductTypeDialog v-model="addProductTypeDialogVisible" :data="AddProductTypeDialogRow" :done="() => getList()"></AddProductTypeDialog> <AddProductTypeDialog v-model="addProductTypeDialogVisible" :data="AddProductTypeDialogRow" :done="() => getList()">
</AddProductTypeDialog>
<!-- 编辑产品类目 --> <!-- 编辑产品类目 -->
<EditProductTypeDialog v-model="EditProductTypeDialogVisible" :data="EditProductTypeDialogRow" :done="() => getList()"> <EditProductTypeDialog v-model="EditProductTypeDialogVisible" :data="EditProductTypeDialogRow" :done="() => getList()">
</EditProductTypeDialog> </EditProductTypeDialog>
@ -125,7 +126,6 @@ const headers = {
// //
const params = reactive({ const params = reactive({
product_type_name: "", product_type_name: "",
}); });
const handleCommand = ({ type, row }) => { const handleCommand = ({ type, row }) => {

View File

@ -1,30 +1,34 @@
import { api, downloadFile, createApiUrl} from '~/utils/axios'; import {
api,
downloadFile,
createApiUrl
} from '~/utils/axios';
/** /**
* 导出新闻 * 导出新闻
* @param {Object} data * @param {Object} data
* @return {Promise} api * @return {Promise} api
*/ */
export function exportExcel(data) { export function exportExcel(data) {
downloadFile(createApiUrl('News.News/exportExcel'), data); downloadFile(createApiUrl('News.News/exportExcel'), data);
} }
/** /**
* 下载新闻模板 * 下载新闻模板
* @param {Object} data * @param {Object} data
* @return {Promise} api * @return {Promise} api
*/ */
export function downloadTemplate(data) { export function downloadTemplate(data) {
downloadFile(createApiUrl('News.News/downloadTemplate'), data); downloadFile(createApiUrl('News.News/downloadTemplate'), data);
} }
/** /**
* 导入新闻 * 导入新闻
* @param {Object} data * @param {Object} data
* @return {Promise} api * @return {Promise} api
*/ */
export const importExcel = createApiUrl('News.News/importExcel'); export const importExcel = createApiUrl('News.News/importExcel');
@ -32,15 +36,14 @@ import { api, downloadFile, createApiUrl} from '~/utils/axios';
/** /**
* 获取字典值 * 获取字典值
* @param {Object} data * @param {Object} data
* @return {Promise} api * @return {Promise} api
*/ */
export function getDictionary(data) { export function getDictionary(data) {
return api.post('Dictionary.Dictionary/getDictionary', data, { return api.post('Dictionary.Dictionary/getDictionary', data, {});
}); }
}
/** /**