weexapp 开发流程(三)其他页面创建
1.首页
(1)轮播图
步骤一:创建 轮播图 组件(Slider.vue)
src / assets / components / Slider.vue
<!-- 轮播图 组件 -->
<template>
<slider class="slider" auto-play="true" interval="5000" @change="onchange">
<div class="frame" v-for="img in imageList">
<image class="image" resize="cover" :src="img.src"></image>
</div>
<indicator class="indicator"></indicator>
</slider>
</template> <style scoped>
.iconfont {
font-family:iconfont;
}
.image {
width: 750px;
height: 430px;
}
.slider {
width: 750px;
height: 430px;
}
.frame {
width: 750px;
height: 430px;
position: relative;
}
.indicator {
width: 750px;
height: 40px;
item-color: white;
item-selected-color: #b4282d;
item-size: 12px;
position: absolute;
bottom: 10px;
right: 0px;
}
</style> <script>
export default {
props:["imageList"],
data () {
return {
}
},
methods: {
onchange (event) {
}
}
}
</script>
步骤二:页面调用
src / assets / views / home.vue
<!-- 首页 -->
<template>
<div class="wrapper">
<!-- 标题栏 -->
<wxc-minibar
title="首页"
right-button="N"
left-button="N"
background-color="#F2F3F4"
text-color="#333333"></wxc-minibar>
<!-- 滚动视图 -->
<scroller class="main-list">
<!-- 轮播图 -->
<kx-slider :imageList="Banners"></kx-slider>
</scroller>
</div>
</template> <script>
// 引入轮播图组件
import Slider from '../components/Slider.vue';
// 引入UI组件
import { WxcMinibar } from 'weex-ui'; export default {
components: {
'kx-slider': Slider,
WxcMinibar
},
data () {
return {
Banners: [
{ title: '', src: 'http://app.kuitao8.com/images/banner/1.jpg'},
{ title: '', src: 'http://app.kuitao8.com/images/banner/2.jpg'},
{ title: '', src: 'http://app.kuitao8.com/images/banner/3.jpg'}
]
}
}
}
</script> <style scoped>
.wrapper{
}
.iconfont {
font-family:iconfont;
}
.main-list{
position: fixed;
top: 91px;
bottom: 90px;
left: 0;
right: 0;
}
</style>
效果图:
(2)滑动导航栏 wxc-tab-page
src / assets / views / home.vue
<!-- 首页 -->
<template>
<div class="wrapper">
<!-- 标题栏 -->
<wxc-minibar
title="首页"
right-button="N"
left-button="N"
background-color="#F2F3F4"
text-color="#333333"></wxc-minibar>
<!-- 滚动视图 scroller需要用一个div将内容包含 -->
<scroller class="main-list">
<!-- 请求数据成功 -->
<div v-if="network">
<!-- 轮播图 -->
<kx-slider :imageList="Banners"></kx-slider>
<!-- 顶部标签页 -->
<wxc-tab-page
ref="wxc-tab-page"
:tab-titles="tabTitles"
:tab-styles="tabStyles"
title-type="text"
:needSlider="needSlider"
:is-tab-view="isTabView"
:tab-page-height="tabPageHeight"
:spm-c="4307989"
@wxcTabPageCurrentTabSelected="wxcTabPageCurrentTabSelected">
<list
v-for="(v,index) in tabList"
:key="index"
class="item-container">
<cell class="border-cell"></cell>
<cell
class="cell"
v-for="(demo,key) in v"
:accessible="true"
:aria-label="demo.title"
:key="key">
<wxc-pan-item
:ext-id="'1-' + (v) + '-' + (key)"
@wxcPanItemPan="wxcPanItemPan" >
<wxc-cell
label=""
:title="demo.title"
:has-arrow="true"
@wxcCellClicked="wxcCellClicked(webUrl+'/'+demo.inputtime.replace('-','').replace('-','')+'/'+demo.id+'.shtml')"
spm="181.12312312.12312.d01"
:has-top-border="false"
:price="demo.inputtime"></wxc-cell>
</wxc-pan-item>
</cell>
</list>
</wxc-tab-page>
</div>
<!-- 请求数据失败 -->
<div v-if="network ==0 ">
<net-work
:type="type"
:show="show"></net-work>
</div>
</scroller>
</div>
</template> <script>
// 弹窗
const modal = weex.requireModule('modal');
// 引入 工具类
import util from '../util';
// 引入 轮播图组件
import Slider from '../components/Slider.vue';
// 引入 UI组件
import { WxcMinibar, WxcTabPage, WxcPanItem, WxcCell, Utils } from '../../../index';
// 配置文件
import Config from './config';
// 数据请求组件
var stream = weex.requireModule('stream');
// 身份验证
import jwtdecode from 'jwt-simple';
// 引入 请求失败页面
import NetWork from './network.vue'; export default {
components: {
'kx-slider': Slider,
WxcMinibar,
WxcTabPage,
WxcPanItem,
WxcCell,
Utils,
NetWork
},
data () {
return {
// 轮播图
Banners: [
{ title: '', src: 'http://app.kuitao8.com/images/banner/1.jpg'},
{ title: '', src: 'http://app.kuitao8.com/images/banner/2.jpg'},
{ title: '', src: 'http://app.kuitao8.com/images/banner/3.jpg'}
],
// 顶部标签页(wxc-tab-page) 配置信息
tabTitles: Config.tabTitles, // 顶部标签 标题
tabStyles: Config.tabStyles, // 顶部标签 样式
needSlider: true, // 是否需要滑动功能
isTabView: true, // 当设置为false,同时 tab 配置 url 参数即可跳出
tabPageHeight: 480, // Tab page 页面的高度
// 内容部分
tabList: [],
demoList: [1, 2, 3, 4, 5, 6, 7, 8, 9],
// 请求数据
lists:[],
// 是否显示'网络异常'
network:1,
// 请求类型数据
type: 'noNetwork',
show: true
}
},
created () {
// 字体图标初始化
util.initIconFont();
// 获取 类型数据
this.getCategory();
// 根据设备 设置Tab page 页面的高度
this.tabPageHeight = Utils.env.getPageHeight();
// 发起 数据请求
var me = this;
stream.fetch({
method: 'GET',
type: 'text',
url: this.webUrl+'/webservice/Api/List?catid=10&pagesize=20',
}, function(ret) {
if(ret.ok){
// 解密
var test = jwtdecode.decode(ret.data, 'michahzdee2016', 'HS256');
me.lists = test.list;
me.network = 1; // 不显示'网络异常'
} else {
me.network = 0; // 显示'网络异常'
modal.toast({
'message': '没有网络!',
'duration': 1
});
return false;
}
})
},
methods: {
// 获取 类型数据
getCategory(){
var me = this;
stream.fetch({
method: 'GET',
type: 'text',
url: this.webUrl+'/webservice/Api/getCategoryArticle?catid=9&pagesize=10',
}, function(ret) {
if(ret.ok){
me.network = 1;
var test = jwtdecode.decode(ret.data, 'michahzdee2016', 'HS256');
// 类型数据
me.tabList = test.list;
} else {
me.network = 0;
modal.toast({
'message': '没有网络!',
'duration': 1
});
return false;
}
}); var metest = this;
var mylist = new Array();
stream.fetch({
method: 'GET',
type: 'text',
url: this.webUrl+'/webservice/Api/getCategory?catid=9',
}, function(ret) {
if(ret.ok){
metest.network=1;
var test = jwtdecode.decode(ret.data, 'michahzdee2016', 'HS256');
if (Array.isArray(test.list)) {
for(var i = 0; i < test.list.length; i++) {
mylist[i] = [];
mylist[i]['title'] = test.list[i]['catname'];
mylist[i]['url'] = test.list[i]['catid'];
}
}
// 顶部标签页 标题
metest.tabTitles = mylist;
} else {
metest.network = 0;
modal.toast({
'message': '没有网络!',
'duration': 1
});
return false;
}
})
},
wxcTabPageCurrentTabSelected (e) {
const self = this;
const index = e.page;
const id = e.url;
// modal.toast({ message: id, duration: 1 });
/* 未加载tab模拟数据请求 */
if (!Utils.isNonEmptyArray(self.tabList[id])) {
setTimeout(() => {
// Vue.set(self.tabList[id], id, self.demoList);
}, 100);
}
},
wxcPanItemPan (e) {
if (Utils.env.supportsEBForAndroid()) {
// modal.toast({ message: _url, duration: 1 });
}
},
wxcCellClicked(_url) {
// 跳转视图
var urls = encodeURIComponent(_url);
this.$router.push({ path: '/webview',query:{url:urls}});
}
}
}
</script> <style scoped>
.wrapper {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.iconfont {
font-family:iconfont;
}
.main-list{
position: fixed;
top: 91px;
bottom: 90px;
left: 0;
right: 0;
/*margin-top: 167px;*/
/*margin-bottom: 90px;*/
}
.item-container {
width: 750px;
background-color: #f2f3f4;
}
.border-cell {
background-color: #f2f3f4;
width: 750px;
height: 24px;
align-items: center;
justify-content: center;
border-bottom-width: 1px;
border-style: solid;
border-color: #e0e0e0;
}
.cell {
background-color: #ffffff;
}
</style>
效果图:
2.网络加载失败页面 network
src / assets / views / network.vue
<!-- 网络异常页 -->
<template>
<div class="wrap" v-if="show" :style="wrapStyle">
<div class="wxc-result" :style="{paddingTop: setPaddingTop }">
<image
class="result-image"
:aria-hidden="true"
:src="resultType.pic"></image>
<div class="result-content" v-if="resultType.content">
<text class="content-text">{{resultType.content}}</text>
<text
class="content-text content-desc"
v-if="resultType.desc">{{resultType.desc}}</text>
</div>
<div
class="result-button"
v-if="resultType.button"
@touchend="handleTouchEnd"
@click="onClick">
<text class="button-text">{{resultType.button}}</text>
</div>
</div>
</div>
</template> <style scoped>
.wrap {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.wxc-result {
width: 750px;
flex: 1;
align-items: center;
background-color: #f2f3f4;
}
.result-image {
width: 320px;
height: 320px;
}
.result-content {
margin-top: 36px;
align-items: center;
}
.content-text {
font-size: 30px;
color: #A5A5A5;
height: 42px;
line-height: 42px;
text-align: center;
}
.content-desc {
margin-top: 10px;
}
.result-button {
margin-top: 60px;
border-width: 1px;
border-color: #979797;
background-color: #FFFFFF;
border-radius: 6px;
width: 240px;
height: 72px;
flex-direction: row;
align-items: center;
justify-content: center;
}
.button-text {
color: #666666;
font-size: 30px;
}
</style> <script>
// 页面加载失败类型
import TYPES from './network';
// 功能函数
import NetWorkUtils from '../../../packages/utils';
// 弹窗
const modal = weex.requireModule('modal'); export default {
props: {
type: {
type: String,
default: 'noNetwork'
},
show: {
type: Boolean,
default: true
},
wrapStyle: Object,
paddingTop: {
type: [Number, String],
default: 232
},
customSet: {
type: Object,
default: () => ({})
}
},
computed: {
resultType () {
const { type, customSet } = this;
const allTypes = NetWorkUtils.isEmptyObject(customSet) ? TYPES : NetWorkUtils.mergeDeep(TYPES, customSet);
let types = allTypes['errorPage'];
if (['errorPage', 'noGoods', 'noNetwork', 'errorLocation'].indexOf(type) > -1) {
types = allTypes[type];
}
return types;
},
setPaddingTop () {
const paddingTop = this.paddingTop;
return `${paddingTop}px`
}
},
methods: {
handleTouchEnd (e) {
// web上面有点击穿透问题
const { platform } = weex.config.env;
platform === 'Web' && e.preventDefault && e.preventDefault();
},
onClick () {
modal.toast({
message: '没有数据了',
duration: 1
});
this.$router.push({ path: '/home'});
}
}
};
</script>
配置文件
src / assets / views / network.js
/**
* 页面加载失败类型
*/
export default {
errorPage: {
pic: 'https://gtms01.alicdn.com/tfs/TB1HH4TSpXXXXauXVXXXXXXXXXX-320-320.png',
content: '抱歉出错了,飞猪正在全力解决中',
button: '再试一次',
title: '出错啦'
},
noGoods: {
pic: 'https://gw.alicdn.com/tfs/TB1QXlEQXXXXXcNXFXXXXXXXXXX-320-320.png',
content: '主人,这里什么都没有找到',
button: '再试一次',
title: '暂无商品'
},
noNetwork: {
pic: 'https://gw.alicdn.com/tfs/TB1rs83QXXXXXcBXpXXXXXXXXXX-320-320.png',
content: '哎呀,没有网络了......',
button: '刷新一下',
title: '无网络'
},
errorLocation: {
pic: 'https://gw.alicdn.com/tfs/TB1rs83QXXXXXcBXpXXXXXXXXXX-320-320.png',
content: '哎呀,定位失败了......',
button: '刷新一下',
title: '定位失败'
}
}
3.公共 webview
src / page / webview.vue
<!-- 公用 webview -->
<template>
<div class="wrapper">
<!-- 标题栏 -->
<div class="toolbar">
<div class="left">
<text class="btnTxt iconfont" @click="back"></text>
</div>
<text class="tlt">{{title}}</text>
<div class="right">
<text class="btnTxt iconfont" @click="reload"></text>
</div>
</div>
<!-- 页面部分 -->
<div class="webview-box">
<web ref="wv" class="webview" :src="url" @error="error"></web>
</div>
</div>
</template> <script>
// 导航器
const navigator = weex.requireModule('navigator');
// 弹窗
const modal = weex.requireModule('modal');
// 工具类
import util from '../assets/util';
// 请求数据
var stream = weex.requireModule('stream');
// 身份验证
import jwtdecode from 'jwt-simple';
// 网页视图
const webview = weex.requireModule('webview'); export default {
components: {
},
data () {
return {
url: 'http://www.baidu.com',
title: '详情页',
network: 1
}
},
computed: {
},
created (_e) {
// 检测网络
this.checknetwork();
// 初始化 矢量图标
util.initIconFont();
if (this.$route && this.$route.query) {
this.url = decodeURIComponent(this.$route.query.url);
} else {
this.url = decodeURIComponent("http://www.baidu.com");
}
if(this.$route.query.title){
this.title = this.$route.query.title;
}
},
methods: {
// 返回
back (event) {
// webview.goBack(this.$refs.wv);
window.history.go(-1)
},
// 刷新
reload (event) {
// webview.reload(this.$refs.wv);
window.location.reload();
},
error (event) {
console.log('error', event)
},
// 检测网络
checknetwork(){
var me = this;
// 请求数据
stream.fetch({
method: 'GET',
type: 'text',
url: this.webUrl+'/webservice/Api/List?catid=10&pagesize=1',
}, function(ret) {
if(ret.ok){
me.network = 1;
} else {
me.network = 0;
modal.toast({
'message': '没有网络',
'duration': 1
});
return false;
}
});
}
}
}
</script> <style scoped>
.wrapper{
position: absolute;
left: 0;
right:0;
bottom: 0;
top:0;
}
.iconfont {
font-family:iconfont;
}
.toolbar{
position: fixed;
top: 0;
left: 0;right: 0;
height: 114px;
padding-top: 22px;
background-color: #fafafa;
opacity: .99;
z-index: 101;
flex-wrap: nowrap;
flex-direction: row;
justify-content: space-around;
border-bottom-width: 1px;
border-bottom-color: #d9d9d9;
}
.tlt{
flex: 1;
font-size: 36px;
padding-top: 10px;
color:#333;
text-align: center;
}
.left,.right{
height: 68px;
width: 150px;
padding-top:10px;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: center;
}
.left{
justify-content: flex-start;
padding-left: 20px;
}
.right{
justify-content: flex-end;
padding-right: 20px;
}
.btnTxt{
font-size: 40px;
width: 70px;
color:#666;
text-align: center;
}
.webview-box {
position: absolute;
top: 114px ;
left: 0;
right:0;
bottom: 0;
}
.webview{
position: absolute;
top: 0 ;
left: 0;
right:0;
bottom: 0;
}
</style>
4.adb常用命令
显示当前运行的全部模拟器
adb devices
获取序列号
adb get-serialno
重启机器
adb reboot
重启到bootloader,即刷机模式
adb reboot bootloader
重启到recovery,即恢复模式
adb reboot recovery
查看log
adb logcat
终止adb服务进程
adb kill-server
重启adb服务进程
adb start-server
获取机器MAC地址
adb shell cat /sys/class/net/wlan0/address
获取CPU序列号
adb shell cat /proc/cpuinfo
重新安装apk
adb install 123.apk
安装apk到sd卡
adb install -s 123.apk
保留数据和缓存文件,重新安装apk
adb install -r 123.apk
获取模拟器中的文件
adb pull <remote> <local>
向模拟器中写文件
adb push <local> <remote>
进入模拟器的shell模式
adb shell
卸载APP但保留数据和缓存文件
adb uninstall -k 123.apk
启动应用
adb shell am start -n <package_name>/.<activity_class_name>
查看设备CPU和内存占用情况
adb shell top
跑monkey
adb shell monkey -v -p your.package.name 500
查看ADB帮助
adb help
获取设备名称
adb shell cat /system/build.prop
查看bug报告
adb bugreport
清除log缓存
adb logcat -c
查看wifi密码
adb shell cat /data/misc/wifi/*.conf
查看文件内容
adb shell cat <file>
新建文件夹
adb shell mkdir path/foldelname
设置文件权限
adb shell chmod 777 /system/fonts/DroidSansFallback.ttf
移动文件
adb shell mv path/file newpath/file
删除文件夹及其下面所有文件
adb shell rm -r <folder>
删除system/avi.apk
adb shell rm /system/avi.apk
重命名文件
adb shell rename path/oldfilename path/newfilename
进入文件夹,等同于dos中的cd 命令
adb shell cd <folder>
列出目录下的文件和文件夹,等同于dos中的dir命令
adb shell ls
从设备复制文件到本地
adb pull <remote> <local>
从本地复制文件到设备
adb push <local> <remote>
将system分区重新挂载为可读写分区
adb remount
查看IO内存分区
adb shell cat /proc/iomem
查看当前内存占用
adb shell cat /proc/meminfo
查看后台services信息
adb shell service list
查看指定进程状态
adb shell ps -x [PID]
查看进程列表
adb shell ps
杀死一个进程
adb shell kill [pid]
查询各进程内存使用情况
adb shell procrank
刷新一次内存信息,然后返回
adb shell top -n 1
查看占用内存前6的APP
adb shell top -m 6
缷载apk包
adb shell
cd data/app
rm 123.apk
exit
adb uninstall 123.apk
adb install -r 123.apk
查看adb命令帮助信息
adb help
删除系统应用
adb remount (重新挂载系统分区,使系统分区重新可写)。
adb shell
cd system/app
rm 123.apk
获取管理员权限
adb root
复制文件
复制一个文件或目录到设备:
adb push <source> <destination></destination></source>
如:adb push update.zip /sdcard/
从设备上复制一个文件或目录:
adb pull <source> <destination></destination></source>
如:adb pull /sdcard/update.zip.
取得当前运行设备的实例的列表及每个实例的状态
adb devices
5.文件夹 常用操作
#cd system/sd/data //进入系统内指定文件夹
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录 #ls //列表显示当前文件夹内容
#rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件
#rm xxx //删除文件xxx
#rmdir xxx //删除xxx的文件夹 #mkdir -p xxx //递归创建xxx的文件夹
#cp [选项] [来源文件] [目的文件],-d 复制一个快捷方式/-r 复制一个目录/-i 对一个存在的文件,询问是否覆盖
#mv [选项] [来源文件] [目标文件],-u 目标文件存在时才会生效,如果源文件比目标文件新才会移动/-i 对一个存在的文件,询问是否覆盖;
.
weexapp 开发流程(三)其他页面创建的更多相关文章
- weexapp 开发流程(一)开发环境配置
1.创建项目 weexpack create weexapp 2.安装必要插件 npm i jwt-simple vue-resource vue-router vuex vuex-router-sy ...
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发4- 后台模板html页面创建
上一篇教程<asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发>完成了本项目的登录模块,登录后就需要进入后台管理首页了,需要准备一个后台模 ...
- weexapp 开发流程(二)框架搭建
1.创建 入口文件 src / entry.js /** * 入口文件 */ import App from './App.vue' import router from './router' // ...
- 以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程
JavaWeb应用开发,撇开分布式不谈,只讨论一个功能服务应用的开发,无论是使用原生的Servlet/JSP方案,还是时下的SSM架构,都有一套经过工程实践考验的最佳实践,这综合考虑了团队协作.项目管 ...
- Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API
继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express.Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用. Nodejs之MEAN栈开发(一)---- 路由与控制器 Nod ...
- css背景精华所在+前端页面开发流程
background属性 background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个设置项: ...
- JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理
1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ...
- ThinkPHP创建应用的一般开发流程及实例
Thinkphp是免费开源的php框架,提供了建站所需要的各种组件,方便用户快速建设部署网站. Thinkphp简介:http://thinkphp.cn/Manual/16 官方完全开发手册:htt ...
- 微信小程序从零开始开发步骤(二)创建小程序页面
上一章注册完小程序,添加新建的项目,大致的准备开发已经完成,本章要分享的是 要创建一个简单的页面了,创建小程序页面的具体几个步骤: 1. 在pages 中添加一个目录 选中page,右击鼠标,从硬盘打 ...
随机推荐
- Ubuntu 14.04在虚拟机上的桥接模式下设置静态IP
1.虚拟机--->虚拟机设置 将虚拟机设置为桥接模式 2.查看window 网卡以及IP信息 cmd下输入 ipconfig -all 可以看到,我的网卡为Realtek PCIe GBE Fa ...
- Java基础知识:集合框架
*本文是最近学习到的知识的记录以及分享,算不上原创. *参考文献见链接. 目录 集合框架 Collection接口 Map接口 集合的工具类 这篇文章只大致回顾一下Java的总体框架. 集合框架 ht ...
- 【MySQL】Got fatal error 1236原因和解决方法
一 前言 MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到“Got fatal error ...
- es6--之箭头函数
「箭头函数」是 ECMAScript6 中非常重要的性特性.很多文章都在描述它的上下文透明性以及短语法.新特性必然会带来很多好处,但凡事都有两面性.本篇文章会通过情景引导,让你知晓哪些情景下应该绕过箭 ...
- HDU-1829 A Bug's Life。并查集构造,与POJ1709异曲同工!
A Bug's Life Find them, Catch them 都是并查集构造的题,不久前 ...
- 刷题总结——学姐的逛街计划(vijos1891费用流)
题目: doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪学姐去逛街呢. 后来, ...
- Java统计程序运行时间
代码如下: 第一种是以毫秒为单位计算的. long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试 ...
- leetcode 94 中序遍历模板
/**递归的写法 * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tre ...
- bzoj2648/2716 kdtree
SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 5199 Solved: 1813[Submit][Status][Discuss] D ...
- 酒厂选址(codevs 1507)
题目描述 Description Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒.以前这种啤酒都是从波兰进口,但今年居民们想建一个自己的啤酒厂.岛上所有的城市都坐落在海边,并且由一条沿海岸线 ...