<template>
	<div>
		<el-container>
			<el-main>
				<el-form :inline="true" :model="formInline" class="demo-form-inline">
					<el-form-item>
						<el-input size="small" clearable v-model="formInline.articleId" placeholder="请输入文章id" @keydown.enter.native="articleInfoPage"></el-input>
					</el-form-item>
					<el-form-item>
						<el-input size="small" clearable v-model="formInline.userName" placeholder="请输入用户名" @keydown.enter.native="articleInfoPage"></el-input>
					</el-form-item>
					<el-form-item>
						<el-input size="small" clearable v-model="formInline.nickName" placeholder="请输入用户昵称" @keydown.enter.native="articleInfoPage"></el-input>
					</el-form-item>
					<el-form-item>
						<el-input size="small" clearable v-model="formInline.articleScoreStart" placeholder="质量分Start" @keydown.enter.native="articleInfoPage"></el-input>
					</el-form-item>
					<el-form-item>
						<el-input size="small" clearable v-model="formInline.articleScoreEnd" placeholder="质量分End" @keydown.enter.native="articleInfoPage"></el-input>
					</el-form-item>
					<el-form-item>
						<el-select size="small" v-model="formInline.likeStatus" placeholder="请选择点赞状态" @change="articleInfoPage">
							<el-option v-for="item in likeStatus" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>

					<el-form-item>
						<el-select size="small" v-model="formInline.collectStatus" placeholder="请选择收藏状态" @change="articleInfoPage">
							<el-option v-for="item in collectStatus" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>

					<el-form-item>
						<el-select size="small" v-model="formInline.commentStatus" placeholder="请选择评论状态" @change="articleInfoPage">
							<el-option v-for="item in commentStatus" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>
					<el-form-item>
						<el-select size="small" v-model="formInline.isMyself" placeholder="自己的文章" @change="articleInfoPage">
							<el-option v-for="item in isMyself" :key="item.type" :label="item.name" :value="item.type"></el-option>
						</el-select>
					</el-form-item>

					<br />
					<el-form-item>
						<el-button type="primary" @click="articleInfoPage">查询</el-button>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareAdd">新增</el-button>
						<el-dialog title="新增用户" :visible.sync="dialogAddFormVisible" style="width: 100%">
							<el-form :model="form" class="custom-form">
								<el-form-item label="用户名称" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.userName" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<br />
								<el-form-item label="文章Id" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.articleId" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
							</el-form>
							<div slot="footer" class="dialog-footer">
								<el-button @click="dialogAddFormVisible = false">取 消</el-button>
								<el-button type="primary" @click="handleConfirm(0)">确 定</el-button>
							</div>
						</el-dialog>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareAllTriplet">三连</el-button>
						<el-dialog title="提示" :visible.sync="allTripletDialogVisible" width="30%" :before-close="handleClose">
							<span>确认三连吗?</span>
							<span slot="footer" class="dialog-footer">
								<el-button @click="allTripletDialogVisible = false">取 消</el-button>
								<el-button type="primary" @click.prevent="allTriplet()">确 定</el-button>
							</span>
						</el-dialog>
					</el-form-item>

					<el-form-item>
						<el-button type="primary" @click="prepareGetScore">质量分查询</el-button>
						<el-dialog title="质量分查询" :visible.sync="getScoreFormVisible" style="width: 100%">
							<el-form :model="form" class="custom-form">
								<el-row :gutter="20">
									<el-col :span="18">
										<el-input v-model="form.articleUrl" placeholder="请输入文章链接" autocomplete="off"></el-input>
									</el-col>
								</el-row>
								<br />
								<el-row :gutter="20">
									<el-col :span="12">
										<el-input v-model="form.articleScore" placeholder="质量分待查询" autocomplete="off"></el-input>
									</el-col>
								</el-row>
							</el-form>
							<div slot="footer" class="dialog-footer">
								<el-button @click="getScoreFormVisible = false">取 消</el-button>
								<el-button type="primary" @click="getScore">查 询</el-button>
							</div>
						</el-dialog>
					</el-form-item>
				</el-form>
				<el-table ref="multipleTable" v-loading="loading" :data="articleInfoList" tooltip-effect="dark" style="width: 100%" @selection-change="handleSelectionChange">
					<el-table-column type="selection" width="50"></el-table-column>
					<el-table-column prop="articleId" label="文章id" show-overflow-tooltip></el-table-column>
					<el-table-column prop="userName" label="用户名称" show-overflow-tooltip></el-table-column>
					<el-table-column prop="nickName" label="用户昵称" show-overflow-tooltip></el-table-column>
					<el-table-column prop="articleTitle" label="文章标题" show-overflow-tooltip>
						<template slot-scope="scope">
							<a :href="scope.row.articleUrl" target="_blank">{{ scope.row.articleTitle }}</a>
						</template>
					</el-table-column>
					<el-table-column sortable prop="articleScore" label="质量分" show-overflow-tooltip></el-table-column>
					<el-table-column prop="articleDescription" label="文章描述" show-overflow-tooltip></el-table-column>

					<el-table-column prop="likeStatusName" label="点赞状态" width="130" show-overflow-tooltip>
						<template slot-scope="scope">
							<el-tag :type="getTagType(scope.row.likeStatusName)">{{ scope.row.likeStatusName }}</el-tag>
						</template>
					</el-table-column>

					<el-table-column prop="collectStatusName" label="收藏状态" width="130" show-overflow-tooltip>
						<template slot-scope="scope">
							<el-tag :type="getTagType(scope.row.collectStatusName)">{{ scope.row.collectStatusName }}</el-tag>
						</template>
					</el-table-column>

					<el-table-column prop="commentStatusName" label="评论状态" width="130" show-overflow-tooltip>
						<template slot-scope="scope">
							<el-tag :type="getTagType(scope.row.commentStatusName)">{{ scope.row.commentStatusName }}</el-tag>
						</template>
					</el-table-column>

					<el-table-column label="更新时间">
						<template slot-scope="props">
							{{ props.row.updateTime | dateFormat }}
						</template>
					</el-table-column>
					<el-table-column prop="操作" label="操作" width="310px">
						<template slot-scope="props">
							<el-button type="primary" @click="prepareTriplet(props.row.articleId)">三连</el-button>
							<el-dialog title="提示" :visible.sync="tripletVisible" width="30%" :before-close="handleClose">
								<span>确认三连?</span>
								<span slot="footer" class="dialog-footer">
									<el-button @click="tripletVisible = false">取 消</el-button>
									<el-button type="primary" @click.prevent="triplet(articleId)">确 定</el-button>
								</span>
							</el-dialog>
							<el-button type="success" @click.prevent="preEdit(props.row.id, props.row.articleId, props.row.userName, props.row.nickName, props.row.articleUrl)" width="200">编辑</el-button>
							<el-dialog title="编辑用户信息" :visible.sync="editVisible">
								<el-form :model="form">
									<el-form-item label="文章id" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.articleId" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="用户名称" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.userName" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="用户昵称" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.nickName" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="文章链接" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.articleUrl" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
								</el-form>
								<div slot="footer" class="dialog-footer">
									<el-button @click="editVisible = false">取 消</el-button>
									<el-button type="primary" @click="editConfirm">确 定</el-button>
								</div>
							</el-dialog>
							<el-button type="danger" @click="prepareDelete(props.row.id)">删除</el-button>
							<el-dialog title="提示" :visible.sync="dialogDelVisible" width="30%" :before-close="handleClose">
								<span>确认删除?</span>
								<span slot="footer" class="dialog-footer">
									<el-button @click="dialogDelVisible = false">取 消</el-button>
									<el-button type="primary" @click.prevent="onDelete(currentRowId)">确 定</el-button>
								</span>
							</el-dialog>
						</template>
					</el-table-column>
				</el-table>

				<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[8, 100, 200, 300, 400]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
			</el-main>
			<el-backtop class="backtop"></el-backtop>
		</el-container>
	</div>
</template>

<script>
import axios from 'axios'
export default {
    name: 'MyArticleInfo',

    data() {
        return {
            form: {
                userName: '',
                articleId: '',
                articleUrl: '',
                articleScore: '',
            },
            formInline: {
                articleId: '',
                userName: '',
                nickName: '',
                articleUrl: '',
                isMyself: -1,
                articleScoreStart: 0,
                articleScoreEnd: 100,
                likeStatus: null,
                collectStatus: null,
                commentStatus: null,
            },
            likeStatus: [
                {
                    type: -1,
                    name: '全部',
                },
                {
                    type: 0,
                    name: '未处理',
                },
                { type: 1, name: '已经点过赞' },
                { type: 2, name: '点赞已满' },
                { type: 3, name: '取消点赞' },
                { type: 9, name: '点赞成功' },
            ],
            collectStatus: [
                {
                    type: -1,
                    name: '全部',
                },
                {
                    type: 0,
                    name: '未处理',
                },
                { type: 1, name: '已经收藏过' },
                { type: 2, name: '收藏已满' },
                { type: 3, name: '参数缺失' },
                { type: 9, name: '收藏成功' },
            ],
            isMyself: [
                {
                    type: -1,
                    name: '全部',
                },
                {
                    type: 0,
                    name: '否',
                },
                { type: 1, name: '是' },
            ],
            commentStatus: [
                {
                    type: -1,
                    name: '全部',
                },
                {
                    type: 0,
                    name: '未处理',
                },
                { type: 1, name: '已经评论过' },
                { type: 2, name: '评论已满' },
                { type: 3, name: '禁言' },
                { type: 4, name: '评论太快' },
                { type: 5, name: '评论已经到了49条' },
                { type: 8, name: '其他错误' },
                { type: 9, name: '评论成功' },
            ],
            dialogAddFormVisible: false,
            dialogDelVisible: false,
            editVisible: false,
            tripletVisible: false,
            allTripletDialogVisible: false,
            getScoreFormVisible: false,
            // 用户列表数据
            articleInfoList: [],
            loading: false,
            elementui_page_component_key: 0,
            currentPage: Number(localStorage.getItem('csdnUserPage')) || 1,
            pageSize: 8,
            total: 0,
            // 新增的内容
            formLabelWidth: '120px',
            currentRowId: null,
            articleId: null,
            multipleSelection: [],
        }
    },
    watch: {
        formInline: {
            handler(newVal, oldVal) {
                this.currentPage = 1
                localStorage.setItem('csdnUserPage', this.currentPage)
                this.articleInfoPage()
            },
            deep: true,
        },
        // 监听currentPage的变化，将新值保存到localStorage中
        currentPage(newPage) {
            localStorage.setItem('csdnUserPage', newPage.toString())
        },
    },
    created() {
        //获取问题类型的枚举
        this.articleInfoPage()
    },
    mounted() {
        this.currentPage = 1
    },
    methods: {
        prepareAdd() {
            this.form.userName = ''
            this.form.articleId = ''
            this.dialogAddFormVisible = true
        },
        prepareGetScore() {
            this.form.articleUrl = ''
            this.form.articleScore = ''
            this.getScoreFormVisible = true
        },
        prepareAllTriplet() {
            this.allTripletDialogVisible = true
        },
        prepareDelete(id) {
            this.currentRowId = id
            this.dialogDelVisible = true
        },
        prepareTriplet(articleId) {
            this.articleId = articleId
            this.tripletVisible = true
        },
        preEdit(id, articleId, userName, nickName, articleUrl) {
            this.form.articleId = articleId
            this.form.userName = userName
            this.form.nickName = nickName
            this.form.articleUrl = articleUrl
            this.currentRowId = id
            this.editVisible = true
        },
        handleSelectionChange(val) {
            this.multipleSelection = val
        },

        handleClose(done) {
            this.$confirm('确认关闭？')
                .then((_) => {
                    done()
                })
                .catch((_) => {})
        },
        handleConfirm(addType) {
            this.dialogAddFormVisible = false // 关闭对话框
            this.addUser(addType) // 发送请求
        },

        async addUser(addType) {
            try {
                this.loading = true
                const { data: res } = await axios.post('http://120.79.36.53:8888/csdnArticleInfo/add', {
                    addType: addType,
                    userName: this.form.userName,
                    articleId: this.form.articleId,
                })
                if (res.code === 200) {
                    this.currentPage = 1
                    this.form.userName = ''
                    this.form.articleId = ''
                    this.articleInfoPage()
                } else {
                    this.errorMsg(res.message)
                    console.error('Received non-200 status code', res)
                }
            } catch (error) {
                console.error('An error occurred while adding the questionName:', error)
                // 异常处理逻辑
            } finally {
                this.loading = false
            }
        },
        errorMsg(msg) {
            this.$message({
                showClose: true,
                message: msg,
                type: 'error',
            })
        },
        async editConfirm() {
            try {
                this.loading = true
                const { data: res } = await axios.post('http://120.79.36.53:8888/csdnArticleInfo/update', {
                    id: this.currentRowId,
                    articleId: this.form.articleId,
                    userName: this.form.userName,
                    nickName: this.form.nickName,
                    articleUrl: this.form.articleUrl,
                })
                if (res.code === 200) {
                    this.form.userName = ''
                    this.form.nickName = ''
                    this.form.articleId = ''
                    this.form.articleUrl = ''
                    this.editVisible = false
                    currentRowId: null
                    this.articleInfoPage()
                } else {
                    console.error('Received non-200 status code', res)
                }
            } catch (error) {
                console.error('An error occurred while adding the questionName:', error)
                // 异常处理逻辑
            } finally {
                this.loading = false
            }
        },
        async getScore() {
            this.loading = true
            const { data: res } = await axios.get('http://120.79.36.53:8888/csdnArticleInfo/getScore?articleUrl=' + this.form.articleUrl)
            if (res.code === 200) {
                this.form.articleScore = res.result
            } else {
                console.error('Received non-200 status code', res)
            }
            this.loading = false
        },
        async triplet(articleId) {
            this.loading = true
            this.tripletVisible = false
            const { data: res } = await axios.get('http://120.79.36.53:8888/csdnArticleInfo/triplet?articleId=' + articleId)
            if (res.code === 200) {
                this.articleId = null
                this.articleInfoPage()
            } else {
                console.error('Received non-200 status code', res)
            }
            this.loading = false
        },
        async allTriplet() {
            this.loading = true
            this.allTripletDialogVisible = false
            if (this.multipleSelection && this.multipleSelection.length === 0) {
                console.error('请选择需要三连的数据行')
            } else {
                let articleIds = this.multipleSelection.map((item) => item.articleId)
                const { data: res } = await axios.post('http://120.79.36.53:8888/csdnArticleInfo/multiTriplet', articleIds)
                if (res.code === 200) {
                    this.multipleSelection = []
                    this.articleInfoPage()
                } else {
                    console.error('Received non-200 status code', res)
                }
            }
            this.loading = false
        },
        async onDelete(id) {
            this.loading = true
            this.dialogDelVisible = false
            const { data: res } = await axios.get('http://120.79.36.53:8888/csdnArticleInfo/delete', {
                params: {
                    id: id,
                },
            })
            this.articleInfoPage()

            this.loading = false
        },
        refreshPage() {
            //获取问题类型的枚举
            this.articleInfoPage()
            location.reload()
        },
        async articleInfoPage() {
            this.loading = true
            const { data: res } = await axios.post('http://120.79.36.53:8888/csdnArticleInfo/page', {
                page: this.currentPage,
                pageSize: this.pageSize,
                articleId: this.formInline.articleId,
                userName: this.formInline.userName,
                nickName: this.formInline.nickName,
                articleScoreStart: this.formInline.articleScoreStart,
                articleScoreEnd: this.formInline.articleScoreEnd,
                isMyself: this.formInline.isMyself,
                likeStatus: this.formInline.likeStatus == -1 ? null : this.formInline.likeStatus,
                collectStatus: this.formInline.collectStatus == -1 ? null : this.formInline.collectStatus,
                commentStatus: this.formInline.commentStatus == -1 ? null : this.formInline.commentStatus,
            })
            if (res.code === 200) {
                this.total = res.result.totalElements

                const likeStatusMap = {}
                this.likeStatus.forEach((option) => {
                    likeStatusMap[option.type] = option.name
                })
                res.result.content.forEach((item) => {
                    item.likeStatusName = likeStatusMap[item.likeStatus]
                })

                const collectStatusMap = {}
                this.collectStatus.forEach((option) => {
                    collectStatusMap[option.type] = option.name
                })
                res.result.content.forEach((item) => {
                    item.collectStatusName = collectStatusMap[item.collectStatus]
                })

                const commentStatusMap = {}
                this.commentStatus.forEach((option) => {
                    commentStatusMap[option.type] = option.name
                })
                res.result.content.forEach((item) => {
                    item.commentStatusName = commentStatusMap[item.commentStatus]
                })

                this.articleInfoList = res.result.content
            }
            this.loading = false
        },
        handleCurrentChange(currentPage) {
            this.currentPage = currentPage
            this.articleInfoPage()
        },
        handleSizeChange(currentSize) {
            this.pageSize = currentSize
            this.articleInfoPage()
        },
        getTagType(statusName) {
            if (statusName == '未处理') {
                return 'info'
            } else if (statusName == '已经点过赞' || statusName == '已经收藏过' || statusName == '已经评论过') {
                return 'success'
            } else if (statusName == '点赞已满' || statusName == '收藏已满' || statusName == '评论已满' || statusName == '禁言' || statusName == '评论已经到了49条') {
                return 'danger'
            } else if (statusName == '点赞成功' || statusName == '收藏成功' || statusName == '评论成功') {
                return 'success'
            } else if (statusName == '参数缺失' || statusName == '其他错误' || statusName == '取消点赞' || statusName == '评论太快') {
                return 'warning'
            }
        },
    },
}
</script>

<style lang="less" scoped>
.el-header {
	background-color: #b3c0d1;
	color: #333;
	line-height: 60px;
}

.el-aside {
	color: #333;
}

.pagination {
	margin-top: 16px;
	text-align: right;
}
.header-button-item {
	margin-right: 15px;
	font-size: 20px;
}

.red-title {
	line-height: 24px;
	font-size: 18px;
	color: red;
}

.backtop {
	position: fixed;
	bottom: 50px;
	right: 50px;
	height: 40px;
	width: 40px;
	line-height: 40px;
	text-align: center;
	border-radius: 20px;
	background-color: #007aff;
	color: #fff;
	cursor: pointer;
	z-index: 999;
}
.custom-textarea {
	width: 100%;
	text-align: left;
}
.backtop:hover {
	background-color: #0050a0;
}
</style>