This commit is contained in:
caoqianming 2020-04-29 16:23:14 +08:00
parent 48c4edb7ea
commit 17f68ef261
28 changed files with 414 additions and 23 deletions

View File

@ -32,3 +32,9 @@ export function getArticle(id) {
method: 'get', method: 'get',
}) })
} }
export function topArticle(id) {
return request({
url: `/cms/article/${id}/top/`,
method: 'put',
})
}

View File

@ -69,6 +69,9 @@
<el-table-column align="left" label="消费者"> <el-table-column align="left" label="消费者">
<template slot-scope="scope">{{ scope.row.consumer_name }}</template> <template slot-scope="scope">{{ scope.row.consumer_name }}</template>
</el-table-column> </el-table-column>
<el-table-column align="left" label="单位">
<template slot-scope="scope">{{ scope.row.consumer_company_name }}</template>
</el-table-column>
<el-table-column align="left" label="工作类别"> <el-table-column align="left" label="工作类别">
<template slot-scope="scope">{{ scope.row.workscope_name }}</template> <template slot-scope="scope">{{ scope.row.workscope_name }}</template>
</el-table-column> </el-table-column>

View File

@ -33,7 +33,7 @@
</el-select> --> </el-select> -->
<el-input <el-input
v-model="listQuery.search" v-model="listQuery.search"
placeholder="姓名或手机号" placeholder="姓名/手机号/单位"
style="width: 200px;" style="width: 200px;"
class="filter-item" class="filter-item"
@keyup.enter.native="handleFilter" @keyup.enter.native="handleFilter"

View File

@ -33,6 +33,15 @@
<el-table-column align="left" label="标题"> <el-table-column align="left" label="标题">
<template slot-scope="scope">{{ scope.row.title }}</template> <template slot-scope="scope">{{ scope.row.title }}</template>
</el-table-column> </el-table-column>
<el-table-column align="left" label="来源">
<template slot-scope="scope">{{ scope.row.ifrom }}</template>
</el-table-column>
<el-table-column align="left" label="外链">
<template slot-scope="scope">
{{ scope.row.elink }}
<el-tag v-if="!scope.row.elink">原创</el-tag>
</template>
</el-table-column>
<el-table-column align="left" label="新建时间"> <el-table-column align="left" label="新建时间">
<template slot-scope="scope">{{ scope.row.create_time }}</template> <template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column> </el-table-column>
@ -41,6 +50,22 @@
</el-table-column> </el-table-column>
<el-table-column align="center" label="操作"> <el-table-column align="center" label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button
v-show="scope.row.is_top"
type="danger"
size="small"
@click="handleTop(scope)"
icon=""
:disabled="!checkPermission(['article_top'])"
>取消置顶</el-button>
<el-button
v-show="!scope.row.is_top"
type="primary"
size="small"
@click="handleTop(scope)"
icon="el-icon-upload2"
:disabled="!checkPermission(['article_top'])"
>置顶</el-button>
<el-button <el-button
type="primary" type="primary"
size="small" size="small"
@ -69,7 +94,7 @@
</template> </template>
<script> <script>
import { getArticleList, deleteArticle } from "@/api/cms"; import { getArticleList, deleteArticle, topArticle } from "@/api/cms";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
@ -140,6 +165,19 @@ export default {
}).catch(() => { }).catch(() => {
}); });
}, },
handleTop(scope) {
topArticle(scope.row.id).then(response => {
if(response.code>=200){
this.$message({
type: 'success',
message: '操作成功!'
});
this.getList()
}
});
}
} }
}; };
</script> </script>

View File

@ -14,7 +14,10 @@
<el-form-item label="来源" prop="ifrom"> <el-form-item label="来源" prop="ifrom">
<el-input v-model="Form.ifrom" style="width: 500"></el-input> <el-input v-model="Form.ifrom" style="width: 500"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="内容" prop="content"> <el-form-item label="外部链接" prop="elink" >
<el-input v-model="Form.elink" style="width: 500"></el-input>
</el-form-item>
<el-form-item label="内容" prop="content" v-show="is_show">
<tinymce v-model="Form.content" :height="400" :width="600"/> <tinymce v-model="Form.content" :height="400" :width="600"/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -39,6 +42,7 @@ export default {
Form:{ Form:{
title:'', title:'',
ifrom:'', ifrom:'',
elink:'',
content:'' content:''
}, },
submitLoding: false, submitLoding: false,
@ -49,12 +53,13 @@ export default {
ifrom: [ ifrom: [
{ required: true, message: "请输入", trigger: "blur" } { required: true, message: "请输入", trigger: "blur" }
], ],
content: [
{ required: true, message: "请输入", trigger: "blur" }
],
}, },
is_show: true
} }
}, },
watch:{
'Form.elink':'showEditor'
},
methods:{ methods:{
goBack() { goBack() {
this.$router.go(-1) this.$router.go(-1)
@ -80,6 +85,14 @@ export default {
} }
}); });
}, },
showEditor(){
if(this.Form.elink){
this.Form.content = ''
this.is_show = false
}else{
this.is_show = true
}
}
} }
} }
</script> </script>

View File

@ -14,7 +14,10 @@
<el-form-item label="来源" prop="ifrom"> <el-form-item label="来源" prop="ifrom">
<el-input v-model="Form.ifrom" style="width: 500"></el-input> <el-input v-model="Form.ifrom" style="width: 500"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="内容" prop="content"> <el-form-item label="外部链接" prop="elink" >
<el-input v-model="Form.elink" style="width: 500"></el-input>
</el-form-item>
<el-form-item label="内容" prop="content" v-show="is_show">
<tinymce v-model="Form.content" :height="400" :width="600"/> <tinymce v-model="Form.content" :height="400" :width="600"/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -39,6 +42,7 @@ export default {
Form:{ Form:{
title:'', title:'',
ifrom:'', ifrom:'',
elink:'',
content:'' content:''
}, },
submitLoding: false, submitLoding: false,
@ -49,16 +53,17 @@ export default {
ifrom: [ ifrom: [
{ required: true, message: "请输入", trigger: "blur" } { required: true, message: "请输入", trigger: "blur" }
], ],
content: [
{ required: true, message: "请输入", trigger: "blur" }
],
}, },
is_show: false
} }
}, },
created() { created() {
this.Form.id = this.$route.query.id // this.Form.id = this.$route.query.id //
this.getArticle(); this.getArticle();
}, },
watch:{
'Form.elink':'showEditor'
},
methods:{ methods:{
goBack() { goBack() {
this.$router.go(-1) this.$router.go(-1)
@ -89,6 +94,14 @@ export default {
this.Form = response.data ; this.Form = response.data ;
}); });
}, },
showEditor(){
if(this.Form.elink){
this.Form.content = ''
this.is_show = false
}else{
this.is_show = true
}
}
} }
} }
</script> </script>

View File

@ -56,9 +56,9 @@ App({
globalData: { globalData: {
userInfo: null, userInfo: null,
userinfo: null, // 服务器传回的消费者信息 userinfo: null, // 服务器传回的消费者信息
host: 'https://apitest.ctcshe.com', // host: 'https://apitest.ctcshe.com',
mediahost: 'https://apitest.ctcshe.com', mediahost: 'https://apitest.ctcshe.com',
//host: 'http://127.0.0.1:8000', host: 'http://127.0.0.1:8000',
//mediahost: 'http://127.0.0.1:8000', //mediahost: 'http://127.0.0.1:8000',
token : '', token : '',
} }

View File

@ -19,7 +19,9 @@
"pages/my/index", "pages/my/index",
"pages/collect/main", "pages/collect/main",
"pages/workscope/index", "pages/workscope/index",
"pages/yati/index" "pages/yati/index",
"pages/article/index",
"pages/article/detail"
], ],
"window": { "window": {
"backgroundTextStyle": "light", "backgroundTextStyle": "light",
@ -39,11 +41,17 @@
"selectedIconPath": "images/homec.png", "selectedIconPath": "images/homec.png",
"text": "主页" "text": "主页"
}, },
{
"pagePath": "pages/article/index",
"iconPath": "images/icon_doc.png",
"selectedIconPath": "images/icon_doc_fill.png",
"text": "资讯"
},
{ {
"pagePath": "pages/my/index", "pagePath": "pages/my/index",
"iconPath": "images/me.png", "iconPath": "images/me.png",
"selectedIconPath": "images/mec.png", "selectedIconPath": "images/mec.png",
"text": "个人中心" "text": "我的"
} }
] ]
}, },

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
test_mini/images/feeds.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,75 @@
// pages/article/detail.js
const api = require("../../utils/request.js");
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.getDetail(options.id)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
getDetail: function (id) {
var that = this
api.request(`/cms/article/${id}/`,'GET').then(res => {
that.setData(res.data)
})
},
})

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

View File

@ -0,0 +1,16 @@
<web-view wx:if="{{elink}}" src="{{elink}}"></web-view>
<view class="page" wx:else>
<view class="page__hd" style="padding:20px">
<view class="page__title" >{{title}}</view>
<view class="page__desc">
<span style="font-weight:bold;color:darkblue;font-size:16px">{{ifrom}} </span>
<text class="weui-badge" style="background:orange" wx:if="{{is_top}}">置顶</text>
<text class="weui-badge" style="background:green">原创</text>
</view>
</view>
<view class="page__bd">
<view class="weui-article">
<rich-text nodes="{{content}}"></rich-text>
</view>
</view>
</view>

View File

@ -0,0 +1 @@
/* pages/article/detail.wxss */

View File

@ -0,0 +1,100 @@
// pages/lianxi/index.js
const api = require("../../utils/request.js");
Page({
/**
* 页面的初始数据
*/
data: {
results: [],
query: {
page: 1,
limit: 10
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function () {
var that = this
that.getList(that.data.query)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
getList: function () {
var that = this
api.request('/cms/article/', 'GET', that.data.query).then(res => {
if (that.data.query.page == 1) {
that.data.results = res.data.results
} else {
that.data.results = that.data.results.concat(res.data.results)
}
that.setData({
results: that.data.results,
count: res.data.count
})
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
var that = this
that.data.query.page = 1;
that.getList();
wx.stopPullDownRefresh();
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
var that = this
if (that.data.count <= that.data.query.page * that.data.query.limit) {
wx.showToast({
title: '没有更多了',
icon: 'none'
})
} else {
that.data.query.page = that.data.query.page + 1
that.getList()
}
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
})

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

View File

@ -0,0 +1,22 @@
<view class="head">
{{count}}条资讯</view>
<view class="weui-cells weui-cells_after-title">
<block wx:for="{{results}}" wx:key="unique">
<navigator url="detail?id={{item.id}}" class="weui-media-box weui-media-box_appmsg" hover-class="weui-cell_active">
<view class="weui-media-box__bd weui-media-box__bd_in-appmsg">
<view class="weui-media-box__title">
<text class="weui-badge" style="background:orange" wx:if="{{item.is_top}}">置顶</text>
{{item.title}}</view>
<view class="weui-media-box__desc">
来源:
<span style="font-weight:bold;color:darkblue">{{item.ifrom}}</span>
{{item.update_time}}
</view>
</view>
<view class="weui-panel__ft weui-cell__ft_in-access">
<view class="weui-media-box__desc">查看详情</view>
</view>
</navigator>
</block>
</view>

View File

@ -0,0 +1,5 @@
.head{
color:#fff;
background-color: cornflowerblue;
text-align: center;
}

View File

@ -0,0 +1,23 @@
# Generated by Django 3.0.4 on 2020-04-29 01:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cms', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='article',
name='frame',
field=models.URLField(blank=True, null=True, verbose_name='外部链接'),
),
migrations.AddField(
model_name='article',
name='is_top',
field=models.BooleanField(default=False, verbose_name='置顶'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.4 on 2020-04-29 03:47
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('cms', '0002_auto_20200429_0944'),
]
operations = [
migrations.RenameField(
model_name='article',
old_name='frame',
new_name='elink',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.4 on 2020-04-29 04:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cms', '0003_auto_20200429_1147'),
]
operations = [
migrations.AlterField(
model_name='article',
name='content',
field=models.TextField(blank=True, verbose_name='内容'),
),
]

View File

@ -8,8 +8,10 @@ class Article(CommonModel):
文章 文章
''' '''
title = models.CharField(max_length=60, verbose_name='标题') title = models.CharField(max_length=60, verbose_name='标题')
content = models.TextField(verbose_name='内容') elink = models.URLField(verbose_name='外部链接', null=True, blank=True)
content = models.TextField(verbose_name='内容', blank=True)
ifrom = models.CharField(max_length=60, verbose_name='来源') ifrom = models.CharField(max_length=60, verbose_name='来源')
is_top = models.BooleanField('置顶', default=False)
class Meta: class Meta:
verbose_name = '文章' verbose_name = '文章'

View File

@ -11,3 +11,13 @@ class ArticelSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Article model = Article
fields = '__all__' fields = '__all__'
class ArticelListSerializer(serializers.ModelSerializer):
"""
文章列表序列化
"""
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
class Meta:
model = Article
exclude = ('content',)

View File

@ -22,7 +22,7 @@ from rest_framework_jwt.settings import api_settings
# Create your views here. # Create your views here.
from .models import Article from .models import Article
from .serializers import ArticelSerializer from .serializers import ArticelSerializer, ArticelListSerializer
from utils.custom import CommonPagination from utils.custom import CommonPagination
class ArticleViewSet(ModelViewSet): class ArticleViewSet(ModelViewSet):
""" """
@ -36,5 +36,21 @@ class ArticleViewSet(ModelViewSet):
pagination_class = CommonPagination pagination_class = CommonPagination
filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter] filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
search_fields = ('^title','^content') search_fields = ('^title','^content')
ordering_fields = ('id',) ordering_fields = ('title','update_time')
ordering = ['-id'] ordering = ['-is_top', '-update_time']
def get_serializer_class(self):
if self.action=='list':
return ArticelListSerializer
else:
return ArticelSerializer
@action(methods=['put'], detail=True, url_name='top_article', perms_map=[{'*':'top_article'}])
def top(self, request, *args, **kwargs):
'''
置顶文章
'''
instance = self.get_object()
instance.is_top = False if instance.is_top else True
instance.save()
return Response(status=status.HTTP_200_OK)

View File

@ -12,6 +12,7 @@ ConsumerPerms = [
'my_subjects', 'my_subjects',
'my_examtest', 'my_examtest',
'examtest_create', 'examtest_create',
'article_list'
] ]
class MyPermission(RbacPermission): class MyPermission(RbacPermission):

View File

@ -85,7 +85,7 @@ class ConsumerViewSet(ModelViewSet):
ordering = ['-create_time'] ordering = ['-create_time']
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ('company',) filterset_fields = ('company',)
search_fields = ('^name','^username') search_fields = ('^name','^username','^company__name')
def get_queryset(self): def get_queryset(self):
queryset = self.queryset queryset = self.queryset
@ -202,10 +202,7 @@ class ConsumerViewSet(ModelViewSet):
companyname = sheet['C'+str(m)].value companyname = sheet['C'+str(m)].value
if companyname: if companyname:
companyname = companyname.replace(' ', '') companyname = companyname.replace(' ', '')
if companyname not in companydict: companyobj = Company.objects.get_or_create(id=companydict[companyname])[0]
return Response({"error":"不存在单位("+companyname+")!请先新建"})
else:
companyobj = Company.objects.get(id=companydict[companyname])
workscope = sheet['d'+str(m)].value workscope = sheet['d'+str(m)].value
if Consumer.objects.filter(username = username).exists(): if Consumer.objects.filter(username = username).exists():
obj = Consumer.objects.filter(username = username).first() obj = Consumer.objects.filter(username = username).first()